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(术语重写)完全不同。我不确定,你所努力实现的目标是否有意义。。。