如何定义像defstruct一样的宏?

use*_*377 4 macros common-lisp

我们这样定义一个结构

(defstruct point
  x 
  y)
Run Code Online (Sandbox Code Playgroud)

然后我们得到一个功能 point-p

定义一个宏似乎很容易

(defmacro mac (fun-name)
  `(defun ,fun-name ()
     t))
Run Code Online (Sandbox Code Playgroud)

但是如何添加"-p"作为后缀fun-name呢?我想它可能是这样的

(defmacro mac (fun-name)
  `(defun ,(suffix ,fun-name) ()
     t))
Run Code Online (Sandbox Code Playgroud)

suffix可能是一个功能.那么我实际上可以实现这个呢?

Syl*_*ter 6

您只需使用string符号中的字符串.做任何你喜欢的事情,intern并获得一个可以用作标识符的实习符号.

(defun suffix (symbol suffix)
  (intern (concatenate 'string (string symbol) (string suffix))))

(defmacro make-predicate (fun-name)
  `(defun ,(suffix fun-name '#:-p) ()
     t))
(make-predicate test)
(test-p) ; ==> t
Run Code Online (Sandbox Code Playgroud)

注意:当您在已经不带引号的表达式中使用逗号(unquote)时,宏中出现错误.

  • 请注意,将字符串作为后缀传递将会遇到修改其大小写的readtable问题 (3认同)
  • string-concat似乎不是常见的lisp.我用:(连接'字符串...等) (2认同)