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
을 매크로으로 표시하는 데 문제가 있다는 것입니다. 그 이유는 제가 k
과 v
을 위생적으로 만들고 싶지만, 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
절차
편집 : 당신이 설명 할 수 있다면 정말 다음과 같은 설명 자원 날 직접/감사하겠습니다 신경 끄시를 - 내가있어 지금 :)
고마워, 나는 그것이 내가 찾고있는 것이라고 생각한다. 나는 그 페이지를 통해 독서를하고 있었고 그것은 소화하기가 약간 힘들다. 'syntax' 프로 시저가 무엇을 설명 할 수 있습니까? 'with-syntax'와'datum-> syntax' /'syntax-> datum'의 이해하기 쉬운 설명도 도움이 될 것입니다. – Cam
사실, 신경 쓰지 마라. 나는 그 용어를 이해하고있다. 감사! – Cam
더 이상 그 주석을 편집 할 수는 없지만 여전히 성가시다. 나는 이제 그 용어를 이해한다. :) – Cam