【发布时间】:2011-08-01 13:06:33
【问题描述】:
我有一组在foo 中定义的函数,我还想在bar 中使用这些函数。我在foo 中定义了这些函数,因为我希望foo 是自包含的——否则我知道我可以在外部(全局)定义这些函数以供foo 和bar 以及其他函数访问,或在labels 构造中同时定义foo 和bar,其中这些函数仅针对foo 和bar 定义。无论如何,我希望 foo 在没有外部函数或 labels 结构的情况下可以分发。因此面临挑战。
这是我到目前为止所拥有的(在这种情况下我使用的是 Emacs Lisp),但是当我调用 bar 时,我现在最终在 foo 中全局定义了本地函数。关于如何在bar“on the fly”中定义局部变量/函数有什么建议吗?
(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?
【问题讨论】: