【发布时间】:2020-07-24 13:50:20
【问题描述】:
我正在我的 Scheme 实现中实现 Hygienic 宏,我刚刚实现了 syntax-rules,但我有这个代码:
(define odd?
(syntax-rules ()
((_ x) (not (even? x)))))
that 和 this 应该有什么区别:
(define-syntax odd?
(syntax-rules ()
((_ x) (not (even? x)))))
据我了解syntax-rules 只是返回语法转换器,为什么不能只使用define 将其分配给符号?为什么我需要使用define-syntax?这个表达式有什么额外的作用?
应该首先在方案中工作吗?还是只有第二个?
let 与 let-syntax 和 letrec 与 letrec-syntax 之间还有什么区别。 (define|let|letrec)-syntax 是否应该只检查值是否是语法转换器?
编辑:
我有这个实现,仍然使用 lisp 宏:
;; -----------------------------------------------------------------------------
(define-macro (let-syntax vars . body)
`(let ,vars
,@(map (lambda (rule)
`(typecheck "let-syntax" ,(car rule) "syntax"))
vars)
,@body))
;; -----------------------------------------------------------------------------
(define-macro (letrec-syntax vars . body)
`(letrec ,vars
,@(map (lambda (rule)
`(typecheck "letrec-syntax" ,(car rule) "syntax"))
vars)
,@body))
;; -----------------------------------------------------------------------------
(define-macro (define-syntax name expr)
(let ((expr-name (gensym)))
`(define ,name
(let ((,expr-name ,expr))
(typecheck "define-syntax" ,expr-name "syntax")
,expr-name))))
这段代码正确吗?
这段代码应该有效吗?
(let ((let (lambda (x) x)))
(let-syntax ((odd? (syntax-rules ()
((_ x) (not (even? x))))))
(odd? 11)))
【问题讨论】: