我正在组合一个宏来生成样式的简单函数:
(defun hello ()
(format t "hello~&"))
Run Code Online (Sandbox Code Playgroud)
每个新函数都将替换为hello.
(defmacro generate-echoers (list)
`(let ((list-of-functions
(loop for var in ,list
collect
`(defun ,(intern var) ()
(format t ,(concatenate var "~&"))))))
`(progn
,list-of-functions)))
Run Code Online (Sandbox Code Playgroud)
我开发了上述功能,最终证明我还没有掌握报价时间和扩展阶段.
所需的用法如下:(generate-echoers'("hi""ping""pong"))=>;每个人都说出自己名字的功能列表,正如HELLO所做的那样.
生成的函数:
(defun hello ()
(format t "hello~&"))
Run Code Online (Sandbox Code Playgroud)
我先写一个创建上面代码的函数:
(defun make-echoers (name)
`(defun ,(intern (string-upcase name)) ()
(format t ,(concatenate 'string name "~&"))))
Run Code Online (Sandbox Code Playgroud)
请注意,Common Lisp中的符号默认为大写 - 因此我们也使用大写.
然后你可以测试它:
CL-USER 1 > (make-echoers "hello")
(DEFUN HELLO NIL (FORMAT T "hello~&"))
Run Code Online (Sandbox Code Playgroud)
作品.现在让我们使用它:
(defmacro generate-echoers (list)
`(progn ,@(mapcar #'make-echoers list)))
Run Code Online (Sandbox Code Playgroud)
测试一下:
CL-USER 2 > (macroexpand-1 '(generate-echoers ("hi" "ping" "pong")))
(PROGN
(DEFUN HI NIL (FORMAT T "hi~&"))
(DEFUN PING NIL (FORMAT T "ping~&"))
(DEFUN PONG NIL (FORMAT T "pong~&")))
Run Code Online (Sandbox Code Playgroud)