【发布时间】:2016-11-13 10:35:00
【问题描述】:
我有一个队列名称列表,格式如下:
'("foo" "bar")
我正在尝试通过以下方式将队列存储为关联列表:
'(("foo" . nil) ("bar" . nil))
基本上它是一个关联列表,其中包含当前为空的队列“foo”和“bar”。当 Bob 和 Alice 将在“foo”队列中时,它应该如下所示。
'(("foo" . ("alice" "bob")) ("bar" . nil))
如何创建这个结构?我试图通过写作来实现这一点:
(mapcar #'(lambda (x) (cons x ''nil)) '("foo" "bar"))
返回的
'(("foo" QUOTE NIL) ("bar" QUOTE NIL))
这可能不是我想要的,因为当我试图将 Bob 推送到“foo”队列时,它并没有按我的意愿工作。
* (setf *tmp* '(("foo" . 'nil) ("bar" . 'nil)))
(("foo" QUOTE NIL) ("bar" QUOTE NIL))
* (push "bob" (caddr (assoc "foo" *tmp* :test #'string=)))
* *tmp*
(("foo" QUOTE ("bob")) ("bar" QUOTE NIL))
如何在点后创建带有空列表的点对?
编辑: 实际上,当我将 assoc 列表存储为类插槽时,它看起来很好。
* (describe myClassInstance)
;; ...
QUEUES = (("foo" . 'NIL) ("bar" . 'NIL))
;; ...
然而,在将 Bob 添加到“foo”队列之后,所有队列都被更改了。
* (push "bob" (caddr (assoc "foo" (slot-value myClassInstance 'testClass::queues) :test #'string=))))
* (describe myClassInstance)
;; ...
QUEUES = (("foo" . '("bob") ("bar" . '("bob"))
;; ...
这里刚刚发生了什么?看起来所有队列的 cdr 部分是一个符号,当我在一个地方(“foo”队列)更改它的值时,它在所有地方(所有队列)都被更改了。有意义吗?
【问题讨论】:
-
什么是
(cons x ''nil)???为什么 nil 被引用两次? -
'(foo . 'nil)应该是什么?为什么引用 nil? -
@RainerJoswig 我现在找不到源,但有一个地方我发现了这种方式,可以在最后得到零点对。这可能是问题所在,但我无法弄清楚如何用点后的空列表创建点对。
-
想想吧。有意义吗?
标签: list linked-list lisp common-lisp cons