我试图在 MIT 方案中创建与这个微不足道的(在 Common Lisp 中)宏的等价物,这让我感到困惑:
(defmacro funcify (exp)
`(lambda (x) ,exp))
这是一个简单的个人项目,一个基于第二个 SICP 讲座中构建的函数的数值方程求解器。我不在乎这个宏是否“安全”或“卫生”,或者如果 exp 引用除 'x. 我希望能够写作
(solv '(* 60 x) '(* 90 (- x 1)))
其中 solv 是:
(define (solv lh-exp rh-exp)
(solve (funcify lh-exp) (funcify rh-exp)))
而不必打字
(solve (lambda (x) (* 60 x)) (lambda (x) (* 90 (- x 1))))
但无法弄清楚如何使用 MIT 方案语法规则来做到这一点。
我已经尝试过了,但它不起作用:
(define-syntax funcify
(syntax-rules ()
((funcify y) (lambda (x) y))))
;Value: funcify
(funcify x)
;Value 17: #[compound-procedure 17]
((funcify x) 10)
;Unbound variable: x
我尝试了其他可能不值得提及eval
但无济于事的事情。
此外,参考了关于 Scheme 宏系统的优秀教程(不是参考资料),这些教程从简单的小示例开始,并带有大量评论,特别是展示了如何将反引号逗号样式的 LISP 宏(对我来说非常直观)转换为Scheme 的语法宏系统会很棒。