在普通 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))
我正在寻找创建一个以变量作为值的关联列表(通用 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))