根据CLHS,FUNCALL
参数是function designator,它可以是表示在全局环境中定义的函数的符号。我正在寻找一种在本地执行此操作的方法,例如:
(defun test ()
(let ((name 'local-function))
(flet ((local-function ()
'hello))
(funcall name))))
我正在寻找一种从本地环境中获取函数定义的方法。 Common Lisp有可能吗?
答案 0 :(得分:6)
如果您只是尝试使用funcall
调用本地函数,请注意函数指示符也可以是函数对象,并且可以通过使用{{ 1}}符号。即,你可以这样做:
(function name) == #'name
你也可以返回这个值,所以让本地函数“逃逸”到外面。例如,您可以实施一个计数器:
(defun test ()
(flet ((local-function ()
'hello))
(funcall #'local-function)))
(defun make-counter (init)
(flet ((counter ()
(incf init)))
#'counter))
; This case is simple, and could have been:
;
; (defun make-counter (init)
; (lambda ()
; (incf init)))
作为uselpa pointed out,您将无法通过符号获取函数对象,这与在运行时在名为(let ((counter (make-counter 3)))
(list (funcall counter)
(funcall counter)
(funcall counter)))
;=> (4 5 6)
的符号和词法变量之间没有关联的方式非常相似
"X"
x
词汇变量在运行时与源代码中命名它们的符号没有任何关联。
答案 1 :(得分:1)
根据this,没有。它也不适用于eval
。我想在运行时没有遗留本地函数名称的痕迹。
另外,我的理解是,如果函数指示符是符号,则使用symbol-function
,not defined用于本地函数。