如何从符号中调用本地定义的函数?

时间:2013-11-17 21:40:26

标签: common-lisp

根据CLHS,FUNCALL参数是function designator,它可以是表示在全局环境中定义的函数的符号。我正在寻找一种在本地执行此操作的方法,例如:

(defun test ()
  (let ((name 'local-function))
    (flet ((local-function ()
             'hello))
      (funcall name))))

我正在寻找一种从本地环境中获取函数定义的方法。 Common Lisp有可能吗?

2 个答案:

答案 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-functionnot defined用于本地函数。