【问题标题】:Create associative list with variables as values in common lisp在 common lisp 中创建将变量作为值的关联列表
【发布时间】:2015-11-23 10:51:41
【问题描述】:

我正在寻找创建一个以变量为值的关联列表(common lisp)。

让我用(虚拟)代码更好地解释一下:

(defun mylist-create (val1 val2)
  (setq alist '((key1    . val1)
                (key2     . val2)))
  ;; do other things here
  ;; and return the list 
  alist)

(format t "~a~%" (mylist-create "toto" "tata"))

这里的问题是“val1”和“val2”不被视为变量,因为列表不是用它们的值而是用它们的名称创建的。

如何在列表创建中提取它们的价值? “setf and assoc”是添加键/值对的唯一解决方案吗?

【问题讨论】:

  • Alist 是一个全局变量(它可能是也可能不是全局特殊的)。你的 Lisp 实现应该给你一个警告。请改用let 进行本地绑定。
  • 当然我用了“let”,我给出了一个简单而虚拟的例子。谢谢!

标签: list lisp common-lisp


【解决方案1】:

准引用是一种选择性地允许取消引用的值进入引用形式的方法。

(let ((x 10) (y 20))
   `((x . ,x)
     (y . ,y)))

=> ((X . 10) (Y . 20))

因此,您使用反引号开始准引号,并在要评估的表单进入引用表单之前使用逗号。

【讨论】:

  • 感谢您的回答!
  • 这可行,但取决于了解关联列表的结构。只使用pairlis可能会更好: (pairlis '(x y) (list x y)) => ((y . 20) (x . 10))
【解决方案2】:

因为你只是引用了所有的列表。

你需要使用像 acons 这样的东西来构建这样的列表:

CL-USER> (defvar *a* "A variable") 
*A*
CL-USER> '((a . *a*))
((A . *A*))
CL-USER> (acons a *a* '())
((1 . "A variable"))
CL-USER> 

【讨论】:

    【解决方案3】:

    其他答案都很好,但也很高兴知道除了acons(用于向关联列表添加新条目),标准还提供pairlis,可以添加关联列表中的多个条目,或创建新的关联列表。例如,

    (pairlis '(key1 key2) (list 42 78))
    ;=> ((key2 . 78) (key1 . 42))
    
    (pairlis '(key1 key2) (list 42 78) '((a . 1) (b . 2))
    ;=> ((key2 . 78) (key1 . 42) (a . 1) (b . 2))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多