使用宏生成动态函数

Pau*_*han 2 common-lisp

我正在组合一个宏来生成样式的简单函数:

(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所做的那样.

Rai*_*wig 6

生成的函数:

(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)