我試圖創造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