在Lisp中,你如何获得表达式的价值?

时间:2011-12-05 22:17:07

标签: lisp

这将打印data,但我希望它能打印show。我想打印值,而不是表达式,我该怎么做?

(defun display (x)
  (list x))

(setq temp 'data)
(set temp 'show)
(display 'data)

如果你不知道变量是否被绑定怎么办?我必须写一个带键和值的函数,如果键不存在,那么我必须做setq键值,如果键已经存在,那么我将把值添加到键。在这种情况下,如果我这样做(storedata键值),如果值没有限制,我得到一个未绑定的错误,我将如何处理这种情况?

例如,如果没有mydata而我做(storedata值mydata)则mydata将变为(value),现在如果我这样做(storedata value2 mydata)则mydata变为(value value2)。

2 个答案:

答案 0 :(得分:4)

使用'在Lisp中引用列表或符号与使用特殊格式(quote ...)完全相同。它专门用于使引用的事物得到评估。在Lisp代码中输入'data或在REPL中输入(quote data)data相同,并计算为符号data

没有引号的

data计算当前范围中变量 [1]> (setq data 14) 14 [2]> data 14 的值。所以,在REPL:

14

第一个表达式也计算为setq,因为=返回绑定变量的值(在这方面,就像C中的赋值运算符temp一样。)

您在上面的代码中所做的是将名为data的变量设置为包含符号set,然后使用setq(不包含data ),将名为show的变量设置为符号display。这有点类似于在Perl中使用软引用(例如),但我不认为它作为Lisp技术特别广泛使用或建议。

顺便说一下,你的print过程可能没有按照你的想法行事:它返回一个你传递给它的元素列表。在将值键入REPL时打印值的事实只是因为任何表达式的值在REPL处打印。要在程序中显示值,您可以使用{{1}}或format。 (我假设你使用的是Common Lisp,因为它显然不是Scheme,但也许是其他一些Lisp变种,在这种情况下链接无济于事。)

答案 1 :(得分:1)

您引用了data。如果您想要评估它,您应该致电

(display data)