【发布时间】:2019-08-03 11:38:09
【问题描述】:
以下函数旨在用几个参数创建一个符号。但是,调用它会产生关键字错误。
(defun create-symbol (&rest objects &key intern (package *package*))
"Creates a symbol from the objects."
(let ((arg-string (format nil "~{~A~^~}" (first objects))))
(if intern
(values (intern arg-string package))
(make-symbol arg-string))))
例如,(create-symbol "A" 1) 生成 Unknown &KEY argument: "A" 而不是 #:A1。
如果没有提交关键字,也不确定(first objects) 是否是访问 &rest 参数的正确方法。
感谢任何帮助验证此功能的预期操作。
编辑:鉴于下面的 cmets,当参数是 lambda 列表关键字 &optional、&rest 和 &key 的组合时,看起来手动解析参数可能是一种方法。以下功能似乎符合我最初的意图:
(defun create-symbol (&rest objects&keys)
"Creates a symbol from the objects,
with optional keywords :intern and :package."
(let* ((keys (member-if #'keywordp objects&keys))
(objects (ldiff objects&keys keys))
(arg-string (format nil "~{~A~^~}" objects)))
(if (getf keys :intern)
(intern arg-string (or (getf keys :package) *package*))
(make-symbol arg-string))))
【问题讨论】:
-
关于您的功能,
(create-symbol 'a :intern t)是什么?(create-symbol :a :intern t)怎么样?(create-symbol :package :intern t)怎么样? -
对。回到绘图板。 (谢谢。)宏能帮上忙吗?
-
重新考虑之后,我想我还是回到标准的 lambda 列表,将第一个参数设为必需的对象或对象列表。关于 lambda 列表的复杂性的好课程!
标签: common-lisp symbols keyword-argument