如何将变量与let
, 绑定,以便它们setf
能够,然后使用 aflet
作为主体,let
以便它们也funcall
能够和(function …)
-able。例如,我给出了一个愚蠢的小功能而不是(generate-function)
:
(let ((a (lambda (f x)
(funcall f (* x 2))))
(b (lambda (&rest args)
(print (list* 'print-from-b args)))))
(flet ((a (&rest args)
(apply a args))
(b (&rest args)
(apply b args)))
(a #'b 10)))
我们可以相对容易地将其包装在一个宏中:
(defmacro let/flet (bindings &body body)
(let ((args (gensym (string '#:args-))))
`(let ,bindings
(flet ,(loop :for (name nil) :in bindings
:collect `(,name (&rest ,args) (apply ,name ,args)))
,@body))))
现在
(let/flet ((a (lambda (f x)
(funcall f (* x 2))))
(b (lambda (&rest args)
(print (list* 'print-from-b args)))))
(a #'b 10))
展开为第一个代码块。请注意,您也可以(a b 10)
在正文中使用,因为 的绑定b
与 的值相同#'b
。您也可以setf
在变量上使用:
(let/flet ((a (lambda (x)
(print (list 'from-a x)))))
(a 23)
(setf a (lambda (x)
(print (list 'from-new-a x x))))
(a 23))
印刷
(FROM-A 23)
(FROM-NEW-A 23 23)