这将打印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)。
答案 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)