我希望以下代码能够正常运行。如何扩展单级变量?
(let* ((data1 10)
(data2 '(data1 20)))
(progn data2))
我期待(10 20)
,但事实上我得到(data1 20)
。另外,我想从以下内容中获取(10 20 (data2))
:
(let* ((data1 10)
(data2 30)
(data3 '(data 10 20 '(data2)))
(progn data3))
答案 0 :(得分:2)
变量未展开的原因是您使用'
引用了整个列表。 '
不是你在lisp中创建列表的方式,而是你引用它们的方式(即使它们不被评估)。
要创建包含data1
内容和数字20的列表,只需使用(list data1 20)
。
答案 1 :(得分:1)
正如sepp2k所说,在运行时创建列表的常用方法是list
函数。引用列表是文字值的列表文字。
但是还有另一种在运行时创建列表的方法,它看起来更类似于引用列表,反引号。
你可以达到你想要的效果`(,data1 20)
关于您的示例的另一件事:您不需要progn
。 progn
用于对多个表达式进行排序,然后返回最后一个表达式的值,如果它只是一个单独的值表达式,则可以在没有换行的情况下自行使用。但即使您有多个表达式,在这种情况下也不需要使用progn
,因为let*
隐式地将progn
放在身体周围。