【问题标题】:Lisp: quoting a list of symbols' valuesLisp:引用符号值的列表
【发布时间】:2013-12-22 11:39:24
【问题描述】:

如何在 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)"

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

【问题讨论】:

  • 在 Common Lisp 中,也是:(let (...) (msg `(foo ,foo bar ,bar)))。自动翻译成(let (...) (msg (list 'foo foo 'bar bar)))

标签: lisp elisp quote


【解决方案1】:

没关系,进一步的实验表明答案是(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")'

【讨论】:

【解决方案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))会被重复使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多