我试图创造MIT计划这个简单的(Common Lisp中)宏相当于百思不得其解:如何编写一个MIT Scheme宏来返回一个lambda表单?
(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 Scheme语法规则。
我已经试过,但它不工作:
(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的语法宏观系统会很好。
ER实现(MIT Scheme支持)。 :-) –
@ ChrisJester-Young感谢您的错误修复。 :) –
+1。谢谢一堆。 define-syntax完全令人困惑,但我怀疑它非常强大,我想更好地学习它,有任何提及它的提法?我接受你的答案,因为它提供了一个在MIT计划中可用的函数,我希望我也可以接受克里斯的答案,因为它也指出solv也必须是一个语法规则宏。 – Bogatyr