在LISP中展开列表中的变量

时间:2011-12-03 14:32:38

标签: variables lisp

我希望以下代码能够正常运行。如何扩展单级变量?

(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))

2 个答案:

答案 0 :(得分:2)

变量未展开的原因是您使用'引用了整个列表。 '不是你在lisp中创建列表的方式,而是你引用它们的方式(即使它们不被评估)。

要创建包含data1内容和数字20的列表,只需使用(list data1 20)

答案 1 :(得分:1)

正如sepp2k所说,在运行时创建列表的常用方法是list函数。引用列表是文字值的列表文字。

但是还有另一种在运行时创建列表的方法,它看起来更类似于引用列表,反引号。

你可以达到你想要的效果
`(,data1 20)

关于您的示例的另一件事:您不需要prognprogn用于对多个表达式进行排序,然后返回最后一个表达式的值,如果它只是一个单独的值表达式,则可以在没有换行的情况下自行使用。但即使您有多个表达式,在这种情况下也不需要使用progn,因为let*隐式地将progn放在身体周围。