【发布时间】:2015-01-17 01:38:22
【问题描述】:
我正在尝试创建一个带有一些关键字参数的宏,并且只有在定义了参数的情况下,才将条目添加到列表中。将其拆分为以下代码应该说明我需要什么。
(defun add-if-not-null (var lst)
(if (not (null var))
(append (cons (***) (cons ver '())) lst)))
三个星号表示我要弄清楚的部分。这基本上采用符号名称并将其转换为关键字表示。例如宽度转换为 :width
(let ((width 100))
(add-if-not-null (width '())))
应该返回
(:width 100)
我正在使用 cl-who 创建一个 svg 表示,并且基本上只想设置宽度和高度等属性,前提是它们被指定为包装文档的宏的参数。
【问题讨论】:
-
Common Lisp Programmatic Keyword 的可能重复项(注意您可以通过
(symbol-name 'width)从符号width中获取字符串"WIDTH")。 -
这些都不符合我在下面提到的要求。我需要找到一种将变量/参数名称转换为关键字参数的方法。如果我需要将它转换为字符串,那很好。如果您查看示例,那么到目前为止的答案不会产生正确的解决方案。
-
啊,我明白你的意思了。我过于关注“这基本上采用符号名称并将其转换为关键字表示”。问题是,编译后的代码中没有符号
width。 source 中有一个词法变量,用符号width表示。你需要一个宏来完成这项工作,但好消息是它并不太难。我认为 Rainer 的编辑适合您。 -
绝对正确@Joshua Taylor。我说错了,我的问题需要更清楚。感谢您的反馈。
标签: lisp common-lisp symbols