我正在尝试用下面的代码编写一个宏,给定一个类的名称,它会自动创建一个具有 name
实例变量和 形式的访问器的类类名-名称
.
(defmacro def-named-class (class-name)
`(defclass ,class-name ()
((name :accessor ,(intern (format nil "~A-~A" class-name "name"))
:initarg :name
:initform ""))))
这里的问题是,当宏运行时,假设有一个参数 foo
,访问器函数的名称是 |FOO-name|
,但是我会希望它只是 foo-name
。原因是,(intern "foo-name")
返回一个符号 |foo-name|
。但是,如果我尝试对普通函数执行相同的操作,如下所示:
(defmacro def-hyp (name1 name2 arg-list &body body)
`(defun ,(intern (format nil "~A-~A" name1 name2))
,arg-list
,@body))
然后像 (def-hyp foo name () 'foo-name)
这样调用它,它正确地生成了一个名为 foo-name
的函数。所以我想知道是否有任何方法可以从第一个宏中的字符串表示中获取完全相同的符号。我正在使用 Clozure CL。
最佳答案
请注意,类已经有了名称。
CL-USER 19 > (defclass foo () ())
#<STANDARD-CLASS FOO 415040BE6B>
CL-USER 20 > (class-name *)
FOO
关于macros - 从 CL 宏中的字符串创建类访问器名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37996276/