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)