如何将变量传递给函数 lambda 表达式

use*_*663 2 function common-lisp

假设您想要获取包中每个函数的 lambda 列表。在 SBCL 上,使用iterate你可以做到这一点

(use-package :iterate)

(defun lambda-lists (package)
  (iter (for symbol in-package (find-package package))
        (collect (sb-introspect:function-type symbol))))
Run Code Online (Sandbox Code Playgroud)

为了更便携,你可以尝试这样的事情

(defun lambda-lists (package)
  (iter (for symbol in-package (find-package package))
        (collect (function-lambda-expression symbol))))
Run Code Online (Sandbox Code Playgroud)

但这是行不通的,因为它function-lambda-expression需要一个函数,而不是一个符号。类似的东西(function symbol)也不起作用,因为它创建了一个名为 的函数symbol,而不是一个名为 的值的函数symbol

有没有办法用宏来实现这一点?

Rai*_*wig 5

首先,您需要找出哪个符号表示全局函数而不是宏或特殊形式。请参阅:FBOUNDP宏函数特殊运算符-P

然后您需要从符号中检索函数:使用SYMBOL-FUNCTION