В чем разница между этими двумя схемами кода (макроса) - PullRequest
2 голосов
/ 15 марта 2011

Я пытаюсь понять, играя с кодом, который я нашел в Документация MIT-схемы . один фрагмент кода о sc-макротрансформаторе:

(define-syntax let1
        (sc-macro-transformer
         (lambda (form env)
           (let ((id (cadr form))
                 (init (caddr form))
                 (exp (cadddr form)))
             `((lambda (,id)
                 ,(make-syntactic-closure env (list id) exp))
               ,(make-syntactic-closure env '() init))))))

  ;(let1 a 1 (+ a 1))
  ;Value: 2

но мне интересно, могу ли я взять часть " make-syntactic-closure " из `lambda ... в тело слова" let .. ", и программа становится:

(define-syntax let1-error
    (sc-macro-transformer        
      (lambda (form env)
         (let ((id  (cadr form))
              (init (make-syntactic-closure env '() (caddr form)))
              (exp (make-syntactic-closure env '(id) (cadddr form))))
  ;; (pp `(id:,id))
  ;; (pp `(init:, init))
  ;; (pp `(exp:, exp))
   `((lambda (,id)
    ,exp) 
 ,init)))))
;(let1-error a 1 (+ a 1))
;Unbound variable: a

Может кто-нибудь сказал мне, почему эти две программы отличаются?

1 Ответ

0 голосов
/ 30 ноября 2011

Возможно, ваша проблема с:

(make-syntactic-closure env '(id) (cadddr form)))

Сравните это с предыдущей версией.

Возможно, вы хотите, чтобы это было (list id).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...