在lisp中暂停算术运算

时间:2014-11-29 05:38:50

标签: lisp common-lisp

如果有一个类型(+ 2 3),则lisp返回5但是如何告诉lisp编译器返回它未评估(返回(+ 2 3))?是否有一些标志可以关闭操作数在操作数上的自动应用?在read-eval-print中,应暂停eval。 由于这必须作为一个函数来完成,它接受表达式并使其返回未评估,我如何在函数内引用它?

2 个答案:

答案 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)