我尝试创建一个带有一些关键字参数的宏,并且只有在定义了参数的情况下,才将条目添加到列表中。将以下代码拆分应该说明我需要的内容。
(defun add-if-not-null (var lst)
(if (not (null var))
(append (cons (***) (cons ver '())) lst)))
这三个星号显示了我试图找出的部分。这基本上采用符号名称并将其转换为关键字表示。例如width转换为:width
(let ((width 100))
(add-if-not-null (width '())))
应该返回
(:width 100)
我使用cl-who来创建一个svg表示,并且基本上只有当它们被指定为包装文档的宏的参数时才设置宽度和高度等属性。
答案 0 :(得分:2)
包裹的名称是KEYWORD
。创建符号(如有必要)并使用INTERN
将其放入包中。
CL-USER 11 > (intern (symbol-name 'width) "KEYWORD")
:WIDTH
宏:
CL-USER 29 > (defmacro add-if-not-null (var list)
(check-type var symbol)
`(when var
(push (list ,(intern (symbol-name var) "KEYWORD") var)
,list)))
ADD-IF-NOT-NULL
CL-USER 30 > (macroexpand-1 '(add-if-not-null width some-list))
(WHEN VAR (PUSH (LIST :WIDTH VAR) SOME-LIST))
T