2010-07-10 7 views
1

lambda-r이라고하는 lambda의 버전을 가지고 싶습니다. 그 중에서 return을 사용할 수 있습니다. 예 :매크로 위생의 일부분을 만드는 방법

(+ ((lambda-r() 
    (return 1) 
    2)) 5) 

이렇게하면 값이 6이됩니다. 값이 7 일 것으로 예상 할 수도 있지만, 2에 도달하기 전에 람다 식에서 1이 반환되기 때문에 값은 6입니다.

다음은 내가 찾고있는 변형의 예입니다. 내가 이렇게 변환 할 할

(lambda-r (a b) 
    (return a) 
    (+ a b)) 

을 :의는 다음과 같이 하나 lambda-r를 사용했다 가정 해 봅시다 대신 내부 정의의하자 표현으로 표현 될 수

(call/cc (lambda (k) 
     (define return (lambda (v) 
         (k (lambda (a b) 
          v)))) 
     (lambda (a b) 
     (return a) 
     (+ a b)))) 

하지만, 명확성을 위해 정의를 사용하고 있습니다.

위의 코드는 실제로 예상대로 작동합니다. 문제는 lambda-r매크로으로 표시하는 데 문제가 있다는 것입니다. 그 이유는 제가 kv을 위생적으로 만들고 싶지만, return을 위생적으로 만들고 싶지 않기 때문입니다. return은 위생적으로 처리하기 때문에 작업, 그 결과를 직접 볼 수 없습니다로 lambda-r를 사용할 때하지 않는

(define-syntax lambda-r 
    (syntax-rules (return) 
    [(_ (var ...) body ...) 
    (call/cc (lambda (k) 
      (define return (lambda (v) 
          (k (lambda (var ...) 
           v)))) 
      (lambda (var ...) 
      body ...))) 
    ])) 

:

순간에 내 매크로는 이것이다. 따라서 (lambda-r() (return 1))return이 유효한 식별자가 아니라는 오류를 제공합니다.


편집 : Nathan Sanders의 답변 덕분에, 여기서 내가해야 할 일을 이해하는 데 더 가깝습니다. 그러나 나는 다음 절차를 완전히 이해하지 못했으며 결과적으로 아직이 작업을 수행하지 못했습니다.

  • syntax 절차
  • datum->syntax/syntax->datum 절차

편집 : 당신이 설명 할 수 있다면 정말 다음과 같은 설명 자원 날 직접/감사하겠습니다 신경 끄시를 - 내가있어 지금 :)

답변

2

원하는 것은 syntax-rules 대신 syntax-case입니다.

The R6RS definition은 몇 가지 예를 제공합니다. 특히 a section on syntax-object and datum conversions은 원하는 것입니다. returnloop w/break 예를 적용 할 수 있어야합니다.

+0

고마워, 나는 그것이 내가 찾고있는 것이라고 생각한다. 나는 그 페이지를 통해 독서를하고 있었고 그것은 소화하기가 약간 힘들다. 'syntax' 프로 시저가 무엇을 설명 할 수 있습니까? 'with-syntax'와'datum-> syntax' /'syntax-> datum'의 이해하기 쉬운 설명도 도움이 될 것입니다. – Cam

+0

사실, 신경 쓰지 마라. 나는 그 용어를 이해하고있다. 감사! – Cam

+0

더 이상 그 주석을 편집 할 수는 없지만 여전히 성가시다. 나는 이제 그 용어를 이해한다. :) – Cam