Вы можете попробовать FUNCTION-LAMBDA-EXPRESSION :
(function-lambda-expression #'foo)
Но работа не гарантируется («… реализации могут возвращать` `nil, true, nil '' во всех случаях ...").
Например, в CCL:
CL-USER> (setq ccl:*save-definitions* t)
T
CL-USER> (defun x (x y) (+ x y))
X
CL-USER> (function-lambda-expression #'x)
(LAMBDA (X Y) (DECLARE (CCL::GLOBAL-FUNCTION-NAME X)) (BLOCK X (+ X Y)))
NIL
X
В SBCL вы можете попробовать (setq sb-ext:*evaluator-mode* :interpret)
(не проверено). Возможно, есть и другие способы добиться этого в SBCL (вы можете найти аналог *save-definitions*
или даже попробовать другие настройки OPTIMIZE
), но я не знаю о них. Помните, что функции, введенные в REPL, не будут скомпилированы после установки *evaluator-mode*
в :interpret
, поэтому вы, вероятно, будете испытывать худшую производительность.