list - How to create dotted pair with nil -


i have list of queue names in following form:

'("foo" "bar") 

i trying store queues assoc list in following way:

'(("foo" . nil) ("bar" . nil)) 

basically assoc list queues "foo" , "bar" empty. when bob , alice in "foo" queue should following.

'(("foo" . ("alice" "bob")) ("bar" . nil)) 

how can create structure? tried achieve writing:

(mapcar #'(lambda (x) (cons x ''nil)) '("foo" "bar")) 

which returned

'(("foo" quote nil) ("bar" quote nil)) 

this not wanted because when tried push bob "foo" queue doesn't work wanted.

* (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)) 

how can create dotted pair empty list after dot?

edit: when store such assoc list class slot looks fine.

* (describe myclassinstance) ;; ... queues    = (("foo" . 'nil) ("bar" . 'nil)) ;; ... 

however after writing adding bob "foo" queue queues being changed.

* (push "bob" (caddr (assoc "foo" (slot-value myclassinstance 'testclass::queues) :test #'string=)))) * (describe myclassinstance) ;; ... queues    = (("foo" . '("bob") ("bar" . '("bob")) ;; ... 

what happened here? looks cdr part of queues single symbol , when changed it's value in 1 place ("foo" queue) changed in places (all queues). make sense?

a cons cdr nil same one-element list. how lists defined.

in other words, (cons x nil) same (list x). can imagine result this:

+-------+ | x |nil| +-------+ 

a dotted pair cdr list list.

in other words, '(("foo" . nil) ("bar" . nil)) same '(("foo") ("bar")), if former notation perhaps better conveys intent of treating alist.

in same way, '(("foo" . ("alice" "bob")) ("bar" . nil)) same '(("foo" "alice" "bob") ("bar")).

this means can create data structure want, can use e. g. list instead of (lambda (x) (cons x nil)) (which same single argument).

(defun make-queues (&rest names)   (mapcar #'list names)) 

you can push element found assoc under name:

(defun add-to-queue (queues queue-name item)   (push item (cdr (assoc queue-name queues :test #'equal))))  (defun get-queue (queues queue-name)   (cdr (assoc queue-name queues :test #'equal))) 

the problem had last put literal list , tried modify it: put same literal list containing nil each element of alist.


Comments

Popular posts from this blog

php - How to display all orders for a single product showing the most recent first? Woocommerce -

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -