Lisp:引用符号列表的值

时间:2013-12-22 11:39:24

标签: lisp elisp quote

如何在Lisp中创建一个使用列表中符号值的引号列表,而不是符号本身?例如,取两个变量foobarfoo = "hello"bar = "world"。如何从这两个变量中获取包含"hello" "world"的列表。我能想到的最好的事情就是:

;; This is Emacs Lisp
(let ((foo "hello")
      (bar "world"))
  (message (prin1-to-string '(foo bar)))
;; prints "(foo bar)"

但这是错误的。什么是正确的方法?

2 个答案:

答案 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)

这是一个相当奇怪的问题,因为如果你想要foobar的值,你不应该引用它。仅使用原语来制作这样的列表:

(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))会被重用。