在普通 lisp 中创建变量作为值的关联列表

Create associative list with variables as values in common lisp

我正在寻找创建一个以变量作为值的关联列表(通用 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" 是添加 key/value 对的唯一解决方案吗?

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

您需要使用像橡子这样的东西来构建这样的列表:

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

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

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

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

因此,您使用反引号开始一个准引号,并在您希望在进入引用形式之前评估的形式之前使用逗号。

其他答案很好,但很高兴知道除了 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))