this page을 읽은 후. 나는 define-macro
대신 define-syntax
을 사용하는 방법을 암기하기가 어렵 기 때문에 mit- 체계에서 define-macro
(또는 적어도 비슷한 것을 찾아야한다.)을 구현하고 싶다. 여기 mit- 계획에서 "define-macro"를 구현하는 것이 가능합니다
(define-syntax define-macro
(rsc-macro-transformer
(let ((xfmr (lambda (macro-name macro-body)
(list 'define-syntax macro-name
(list 'rsc-macro-transformer
(let ((m-xfmr macro-body))
(lambda (e r)
(apply m-xfmr (cdr e)))))))))
(lambda (e r)
(apply xfmr (cdr e))))))
(define-macro my-when
(lambda (test . branch)
(list 'if test (cons 'begin branch))))
(my-when #t
(begin
(display "True")
(newline)))
그리고 REPL은 불평 :
;The object (lambda (test . branch) (list (quote if) test (cons (quote begin) branch))) is not applicable.
나는 계획에 새로 온 사람과 잘못된 일에 대해 아무 생각이 없다, 누군가가 나를 도울 수 아웃?
+1 특히 구문 규칙을 사용하는 것이 좋습니다. 그것은 위생적이며, 나중에 끔찍한 버그를 디버깅하지 않아도됩니다. –
감사합니다. 전에'define-syntax-rule'에 대해 들어 보지 못했습니다. 코드를 단순화합니다. 그러나 여기에 문제가 발생했습니다. (define-syntax-rule (my-when test branch) (test (begin branch)))')를 평가하려고 시도했을 때, Unbound variable : test'라고했습니다. BTW, 내 계획 버전은 mit-scheme 9.0.1입니다. – Javran
@ Javran 붙여 넣은'(define-syntax define-syntax-rule ...)을 실행 했습니까? 먼저 그렇게해야합니다. –