Formatting CLOS:格式化make实例的初始化参数列表

Formatting CLOS:格式化make实例的初始化参数列表,formatting,common-lisp,clos,Formatting,Common Lisp,Clos,我对此已经挠头有一段时间了——也许有人可以解释一下如何从包含(键值)子列表的嵌套列表中格式化“makeinstance”的初始化参数列表。例如: (make-instance 'myclass :initarg1 1 :initarg2 2 :initarg3 '(a b)) 如果我在这样的列表中有关键字和值: '((initarg1 1) (initarg2 2) (initarg3 '(a b))) 感谢您的帮助和指点 谢谢, 马莱诺 其思想是将每个(initargk)参数对映射到一个新

我对此已经挠头有一段时间了——也许有人可以解释一下如何从包含(键值)子列表的嵌套列表中格式化“makeinstance”的初始化参数列表。例如:

(make-instance 'myclass :initarg1 1 :initarg2 2 :initarg3 '(a b))
如果我在这样的列表中有关键字和值:

'((initarg1 1) (initarg2 2) (initarg3 '(a b)))
感谢您的帮助和指点

谢谢, 马莱诺


其思想是将每个
(initargk)
参数对映射到一个新列表
(:initargk k)
,然后将它们按顺序连接在一起。这是地图功能的典型模式
mapcan

高质量的答案应该包含一些文字解释,而不仅仅是代码。
(apply #'make-instance 'myclass
       (loop for (parameter value) in '((initarg1 1) (initarg2 2) (initarg3 '(a b)))
             collect (intern (symbol-name parameter) (find-package :keyword))
             collect value))
(apply #'make-instance 'myclass
       (mapcan #'(lambda (param)
                   (list (intern (symbol-name (car param)) (find-package :keyword))
                         (cadr param)))
               '((initarg1 1) (initarg2 2) (initarg3 '(a b)))))