如何将变量与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)