Macros common lisp:宏如何使用编程生成的名称定义其他方法/宏?

Macros common lisp:宏如何使用编程生成的名称定义其他方法/宏?,macros,lisp,common-lisp,Macros,Lisp,Common Lisp,我意识到我的代码的某一部分由看起来相似的方法组组成(就像我有多个trios:一个helper函数,由另外两个为程序员准备的函数调用)。我正在尝试编写一个宏,它将为我定义这三个函数,这样我所需要做的就是调用宏。但我的尝试会导致defuns和函数调用将字符串而不是生成的名称作为新符号引用。我做错了什么 示例(错误代码) 现在发生了以下情况: (def-trio my-trio) ==> 另外,在我学习了如何使它工作之后,如果我让这个宏定义其他宏而不是其他函数,是否还有额外的问题?我读过,但我认为我

我意识到我的代码的某一部分由看起来相似的方法组组成(就像我有多个trios:一个helper函数,由另外两个为程序员准备的函数调用)。我正在尝试编写一个宏,它将为我定义这三个函数,这样我所需要做的就是调用宏。但我的尝试会导致defuns和函数调用将字符串而不是生成的名称作为新符号引用。我做错了什么

示例(错误代码)

现在发生了以下情况:

(def-trio my-trio)
==>

另外,在我学习了如何使它工作之后,如果我让这个宏定义其他宏而不是其他函数,是否还有额外的问题?我读过,但我认为我的问题有点不同,因为我问的是编程生成的符号/名称。不过我愿意被纠正:)谢谢

用于将生成的函数名字符串转换为符号。请尝试以下操作:

(defmacro def trio(基本名称);更改:
(让*;3。
((包(符号包基本名称));2。
(助手名称(实习生(格式为nil”助手-~a“基本名称)包));1.4。
(方法1(实习生(格式为nil”~a-1“基本名称)软件包);1。
(方法2(实习生(格式为nil”~a-2“基本名称));1。
`(项目
(defun,helper name()'已调用helper)
(defun,方法1()(,helper name)'1-called)
(defun,方法-2()(,助手名称)'2-called)))

对您最初的定义进行了以下更改--第一个更改是至关重要的:

  • 使用
    (intern…package)
    将每个计算出的符号名插入到与基名称相同的包中
  • 引入变量
    package
    ,该变量绑定到所提供的
    基本名称
    符号的包
  • let
    更改为
    let*
    ,以允许在后续变量中引用新引入的变量
    package
  • 将助手方法的前缀更改为大写,以匹配普通Lisp符号的约定

  • 请将“宏定义其他宏”问题作为一篇单独的帖子提交,因为它没有密切的关系。感谢您提供的详细帮助!在你发布之前,我有一些东西正在工作,但我的代码没有明确说明要使用哪个软件包来进行实习生呼叫。
    (def-trio my-trio)
    
    (PROGN (DEFUN "helper-MY-TRIO" () 'HELPER-CALLED)
           (DEFUN "MY-TRIO-1" () ("helper-MY-TRIO") '1-CALLED)
           (DEFUN "MY-TRIO-2" () ("helper-MY-TRIO") '2-CALLED))
    
    (defmacro def-trio (base-name) ; changes: (let* ; 3. ((package (symbol-package base-name)) ; 2. (helper-name (intern (format nil "HELPER-~a" base-name) package)) ; 1. 4. (method-1 (intern (format nil "~a-1" base-name) package)) ; 1. (method-2 (intern (format nil "~a-2" base-name) package)) ) ; 1. `(progn (defun ,helper-name () 'helper-called) (defun ,method-1 () (,helper-name) '1-called) (defun ,method-2 () (,helper-name) '2-called) )))