我在 foo
中定义了一组函数,我还想在 bar
中使用它们。我在 foo
中定义了这些函数,因为我希望 foo
是独立的——否则我知道我可以在外部(全局)定义这些函数以供 foo
和 bar
等函数,或者在 labels
中同时定义 foo
和 bar
构造,其中这些函数仅为 foo
和 bar
定义。无论如何,我希望 foo
无需外部函数或 labels
结构即可分发。因此面临挑战。
这是我目前所拥有的(在本例中我使用的是 Emacs Lisp),但是当我调用 bar< 时,我现在最终在
。关于如何在 foo
中全局定义了局部函数bar
中“即时”定义局部变量/函数有什么建议吗?
(defun foo (x)
(flet ((addone (x) (1+ x))
(addtwo (x) (+ 2 x)))
(addtwo x)))
(defun bar (x)
(let* ((fnlist (car (cdaddr (symbol-function 'foo))))
(nfn (length fnlist))
(ifn nil)
(bar-body '(addone x))
(i 0))
(eval (append
;; local symbol names
;; to which function definitions will be set
(list 'let (mapcar 'car fnlist))
;; set function definitions
(list '(while (< i nfn)
(setq ifn (nth i fnlist))
(eval `(fset ',(car ifn) ,(append (list 'lambda) (cdr ifn))))
(setq i (1+ i))))
;; function invocation
(list bar-body)))))
函数应用:
(foo 1) ;;=> 3
(bar 1) ;;=> 2
(addone 1) ;;=> 2 ?should not be defined outside of bar?
最佳答案
这不是独立的,所以它不是真正的答案;但它与您提到的其他选项不同,所以无论如何我都会添加它。
(defmacro with-foo-functions (&rest forms)
`(flet ((addone (x) (1+ x))
(addtwo (x) (+ 2 x)))
,@forms))
(defun foo (x)
(with-foo-functions
(addtwo x)))
(defun bar (x)
(with-foo-functions
(addone x)))
关于lisp - 在另一个函数中调用 flet 定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6887903/