如何在Lisp中创建一个使用列表中符号值的引号列表,而不是符号本身?例如,取两个变量foo
和bar
,foo
= "hello"
和bar
= "world"
。如何从这两个变量中获取包含"hello" "world"
的列表。我能想到的最好的事情就是:
;; This is Emacs Lisp
(let ((foo "hello")
(bar "world"))
(message (prin1-to-string '(foo bar)))
;; prints "(foo bar)"
但这是错误的。什么是正确的方法?
答案 0 :(得分:2)
没关系,进一步的实验表明答案是(list foo bar)
。
(let ((foo "hello")
(bar "world"))
(message (prin1-to-string (list foo bar)))
;; prints '("hello" "world")'
编辑:另一种实现此目的的方法是使用`(,foo ,bar)
(let ((foo "hello")
(bar "world"))
(message (prin1-to-string `(,foo ,bar)))
;; prints '("hello" "world")'
答案 1 :(得分:2)
这是一个相当奇怪的问题,因为如果你想要foo
和bar
的值,你不应该引用它。仅使用原语来制作这样的列表:
(let ((foo "hello")
(bar "world"))
(cons foo (cons bar nil))) ; ==> ("hello" "world")
有一个名为list
的功能可以帮助您,因此(list foo bar 'foo 'bar)
与(cons foo (cons bar (cons 'foo (cons 'bar nil))))
==>相同("hello" "world" foo bar)
与上面的代码在同一范围内。
使用quasiquoting (backquoting),您可以混合常量以使`(,foo ,bar foo bar)
等效,但请注意,常量尾部(例如我的示例中的'(foo bar)
)会被重用。