如何定义像defstruct一样的宏?

时间:2016-03-27 02:34:27

标签: macros common-lisp

我们定义这样的结构

(defstruct point
  x 
  y)

然后我们得到一个函数point-p

定义宏

似乎很容易
(defmacro mac (fun-name)
  `(defun ,fun-name ()
     t))

但是如何在fun-name上添加“-p”作为后缀? 我认为它可能类似于

(defmacro mac (fun-name)
  `(defun ,(suffix ,fun-name) ()
     t))

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

1 个答案:

答案 0 :(得分:5)

您只需使用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

注意:当你在一个已经没有引用的表达式中使用逗号(unquote)时,宏中有一个错误。