dpt*_*ptd 0 lisp linked-list list common-lisp cons
我有一个队列名称列表,格式如下:
'("foo" "bar")
Run Code Online (Sandbox Code Playgroud)
我试图以下列方式将队列存储为关联列表:
'(("foo" . nil) ("bar" . nil))
Run Code Online (Sandbox Code Playgroud)
基本上它是一个关联列表,其中队列"foo"和"bar"当前是空的.当Bob和Alice将处于"foo"队列时,它应如下所示.
'(("foo" . ("alice" "bob")) ("bar" . nil))
Run Code Online (Sandbox Code Playgroud)
我该如何创建这个结构?我试图通过写:
(mapcar #'(lambda (x) (cons x ''nil)) '("foo" "bar"))
Run Code Online (Sandbox Code Playgroud)
哪个回来了
'(("foo" QUOTE NIL) ("bar" QUOTE NIL))
Run Code Online (Sandbox Code Playgroud)
这可能不是我想要的,因为当我试图将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))
Run Code Online (Sandbox Code Playgroud)
如何在点后创建带空列表的点对?
编辑: 实际上,当我将这样的关联列表存储为类槽时,它看起来很好.
* (describe myClassInstance)
;; ...
QUEUES = (("foo" . 'NIL) ("bar" . 'NIL))
;; ...
Run Code Online (Sandbox Code Playgroud)
但是在将Bob添加到"foo"队列之后,所有队列都在被更改.
* (push "bob" (caddr (assoc "foo" (slot-value myClassInstance 'testClass::queues) :test #'string=))))
* (describe myClassInstance)
;; ...
QUEUES = (("foo" . '("bob") ("bar" . '("bob"))
;; ...
Run Code Online (Sandbox Code Playgroud)
刚刚发生了什么?看起来cdr所有队列的一部分都是单个符号,当我在一个地方("foo"队列)更改它的值时,它在所有地方(所有队列)都被更改了.它有意义吗?
我认为你可能会将结构与其印刷表示混淆.(cons x nil)是一样的,'(x . nil)也一样的'(x).他们都将打印为(x).
如果你想打印,因为'(x . nil)你可以为它编写打印功能,但表示非常好.
| 归档时间: |
|
| 查看次数: |
170 次 |
| 最近记录: |