macros - 从 CL 宏中的字符串创建类访问器名称

标签 macros lisp common-lisp symbols

我正在尝试用下面的代码编写一个宏,给定一个类的名称,它会自动创建一个具有 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/

相关文章:

java - LibreOffice UNO Java API : how to open a document, 执行宏并关闭它?

lisp - 有没有办法将列表转换为 Scheme 中的集合?

recursion - 复制长度函数的有效方法

clojure - Clojure、Scheme/Racket 和 Common Lisp 之间有什么区别?

c - c中奇怪的括号和宏语法

macros - 如何使用批处理文件打开并运行 Excel 宏

rust - 为什么不能使用rust macro_rules! pat 后面跟着 "<"?

macros - 是否有向 "generic"程序员解释 Lisp 宏的简单示例?

lisp - 格式调用未按要求缩进

floating-point - 如何检查计算结果是否为自然数?