Lisp 如何修改此函数以创建动态plist

Lisp 如何修改此函数以创建动态plist,lisp,common-lisp,Lisp,Common Lisp,我想做的是:我想定义一个函数create record,它接受数量可变的参数(名为key)并生成一个动态plist/命名列表 我只是想先让它使用动态名称,然后将1分配给所有名称,创建一个类似(:x0:y0:z0)的列表,然后我可以修改它以同时接受键和值(而不是所有键都是0) 我的代码: (defparameter *test* '('x 'y 'z)) (defun create-record (&rest keys) (let ((count 0)) (mapcan (l

我想做的是:我想定义一个函数
create record
,它接受数量可变的参数(名为key)并生成一个动态plist/命名列表

我只是想先让它使用动态名称,然后将1分配给所有名称,创建一个类似
(:x0:y0:z0)
的列表,然后我可以修改它以同时接受键和值(而不是所有键都是0)

我的代码:

(defparameter *test* '('x 'y 'z))
(defun create-record (&rest keys) 
  (let ((count 0))
    (mapcan (lambda (key) (list key count)) keys)))
输出

(create-record-variable *test*)
==>  (('X 'Y 'Z) 0)
预期产出:

(create-record-variable *test*)
==> (:x 0 :y 0 :z 0)

我不确定为什么输出像
(('X'Y'Z)0)

问题不在于函数,而在于调用。 你需要做的是

(create-record 'a :b '#:c)
==> (A 0 :B 0 #:C 0)
或者,如果关键字在列表中

(defparameter *test* '(:x :y :z))
(apply #'create-record *test*)
==> (:X 0 :Y 0 :Z 0)
如果要将列表作为参数传递,只需删除
&rest

回答评论中的问题,以下是如何创建:

以及:

那就叫它:

(defparameter *test* (list 'x 'y 'z))

(create-record *test*)
;; => (:X 0 :Y 0 :Z 0)

(create-record *test* :count 3)
;; => (:X 3 :Y 3 :Z 3)

谢谢,有没有一种方法可以修改,这样我就可以接受2个列表并设置值(这样我的测试包含名称,然后另一个var值包含值,所以itd返回(:x:value1:y value2,…)另请参见
(defun make-plist (keys values)
  (mapcan #'list keys values))
(defparameter *my-plist* (make-plist '(:a :b :c) '(1 2 3)))
(getf *my-plist* :b)
==> 2
(defun make-keyword (x)
  "Make out of symbol or string a keyword."
  (values (intern (string x) "KEYWORD")))
;; this is equivalent to alexandria's `alexandria::make-keyword

;; (defun make-keyword (x)
;;   (read-from-string (concatenate 'string ":" (string x))))
;; ;; this doesn't work with "such strings"

(defun create-record (list-of-symbols &key (count 0))
  (mapcan #'(lambda (x) (list (make-keyword x) count)) list-of-symbols))
(defparameter *test* (list 'x 'y 'z))

(create-record *test*)
;; => (:X 0 :Y 0 :Z 0)

(create-record *test* :count 3)
;; => (:X 3 :Y 3 :Z 3)