如果有一个类型(+ 2 3)
,则lisp返回5
但是如何告诉lisp编译器返回它未评估(返回(+ 2 3)
)?是否有一些标志可以关闭操作数在操作数上的自动应用?在read-eval-print
中,应暂停eval。
由于这必须作为一个函数来完成,它接受表达式并使其返回未评估,我如何在函数内引用它?
答案 0 :(得分:3)
对于普通的lisp,没有办法接收"引用"原始表达式作为普通函数的参数。 The evaluation rules are fixed。你可以用宏来做你想做的事,但是
(defmacro my-quote (expr) (list 'quote expr))
==> MY-QUOTE
(my-quote (+ 2 3))
==> (+ 2 3)
答案 1 :(得分:2)
Racket中的FWIW(我知道它不是Common Lisp)像(+ 2 3)这样的应用程序被扩展为(#%app + 2 3)。如果将#%app重新绑定到您自己的宏,则可以更改评估结果(+ 2 3)。
一个完整的例子:
#lang racket
(module my-app racket
(define-syntax (my-app stx)
(syntax-case stx ()
[(my-app procedure argument ...)
#''(procedure argument ...)]))
(provide (rename-out [my-app #%app])))
(require (submod "." my-app))
(+ 2 x)
运行此程序的结果是'(+ 2 x)