lisp中的挂起算术运算

lisp中的挂起算术运算,lisp,common-lisp,Lisp,Common Lisp,如果键入(+23),lisp将返回5,但如何告诉lisp编译器返回未计算的值(返回(+23))?是否有某种标志可以关闭操作数上运算符的自动应用?在“读取评估打印”中,应暂停评估。 由于这必须作为一个接受表达式并返回未赋值表达式的函数来完成,我如何在函数中引用它?对于common lisp,无法将“引用的”原始表达式作为普通函数的参数来接收。但是,您可以使用宏执行您想要的操作 (defmacro my-quote (expr) (list 'quote expr)) ==> MY-QUOTE

如果键入
(+23)
,lisp将返回
5
,但如何告诉lisp编译器返回未计算的值(返回
(+23)
)?是否有某种标志可以关闭操作数上运算符的自动应用?在“读取评估打印”中,应暂停评估。
由于这必须作为一个接受表达式并返回未赋值表达式的函数来完成,我如何在函数中引用它?

对于common lisp,无法将“引用的”原始表达式作为普通函数的参数来接收。但是,您可以使用宏执行您想要的操作

(defmacro my-quote (expr) (list 'quote expr))
==> MY-QUOTE

(my-quote (+ 2 3))
==> (+ 2 3)

对于common lisp,无法将“quoted”原始表达式作为普通函数的参数接收。但是,您可以使用宏执行您想要的操作

(defmacro my-quote (expr) (list 'quote expr))
==> MY-QUOTE

(my-quote (+ 2 3))
==> (+ 2 3)
FWIW在Racket中(我知道它不是常见的Lisp)像(+23)这样的应用程序被扩展到(#%app+23)。如果将#%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)

FWIW in Racket(我知道这不是常见的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)

运行此程序的结果是
(+2x)

您知道
(quote(+23))
或更短:
(+23)
,是吗?@Dirk:我的意思是说
(defun qt(expr)(quote expr))
然后对于
(qt(+23))
它应该返回
(+23)
而不是
expr
。请参阅下面的答案。但是考虑添加更多的上下文。你想得到什么?@Dirk:我想保留一个表达式,防止它被任何计算。就像在Mathematica中一样,Hm.Mathematica的求值概念与普通lisp(术语重写)完全不同。我不确定,你试图实现的目标是否有任何意义……你知道
(quote(+23))
或更短:
(+23)
,你知道吗?@Dirk:我的意思是说
(defun qt(expr)(quote expr))
那么对于
(qt(+23))
它应该返回
(+23)
而不是
expr
。请看下面我的答案。但是考虑添加更多的上下文。你想得到什么?@Dirk:我想保留一个表达式,防止它被任何计算。就像在Mathematica中一样,Hm.Mathematica的求值概念与普通lisp(术语重写)完全不同。我不确定,你所努力实现的目标是否有意义。。。