我正在尝试重新编写let*
卫生宏,我将它作为普通宏,如果可能的话,我希望将它作为卫生宏。我对这种宏类型没有太多经验。所以我真的很感激帮助。此外,我对工作let*
宏的另一种表示不起作用,与卫生宏具有相同的错误。
在职的let*
(define-macro let*1
(lambda (assgn . body)
(let ((loop (gensym))
(lst (gensym)))
(let loop ((lst assgn))
(if (null? lst)
`(begin ,@body)
`((lambda (,(caar lst))
,(loop (cdr lst)))
,(cadar lst)))))))
不卫生let*
->错误:lambda:不是标识符:(caar lst)
(define-syntax let*2
(syntax-rules ()
((let*2 (set ...) body ...)
(let loop ((lst '(set ...)))
(if (null? lst)
body ...
((lambda ((caar lst))
(loop (cdr lst)))
(cadar lst) 1))))))
不工作let*
,但也有与第二个相同的错误。
(define-macro let*3
(lambda (assgn . body)
(let ((loop (gensym))
(lst (gensym)))
`(let ,loop ((,lst assgn))
(if (null? ,lst)
(begin ,@body)
((lambda ((caar ,lst))
(,loop (cdr ,lst)))
(cadar ,lst)))))))
为这个令人困惑的问题道歉,我已经被这个问题困扰了一段时间,咖啡因不再有用了。
一些测试(我选择符号名称来测试符号捕获(我知道我不必这样做)):
(let*1 ((body 10)
(lst (+ body 1)))
(list body lst))
(let*2 ((body 10)
(lst (+ body 1)))
(list body lst))
(let*3 ((body 10)
(lst (+ body 1)))
(list body lst))
编辑:问题得到回答,通过编辑Lief Andersen代码添加了解决方案而不使用 let
(define-syntax let*
(syntax-rules ()
((let*2 ([x1 e1][x2 e2] ...)body ...)
((lambda (x1)
(let* ([x2 e2] ...)
body ...))
e1))))