lisp - 在另一个函数中调用 flet 定义的函数

标签 lisp elisp

我在 foo 中定义了一组函数,我还想在 bar 中使用它们。我在 foo 中定义了这些函数,因为我希望 foo 是独立的——否则我知道我可以在外部(全局)定义这些函数以供 foobar 等函数,或者在 labels 中同时定义 foobar构造,其中这些函数仅为 foobar 定义。无论如何,我希望 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/

相关文章:

python - Python 成语 "if __name__ == ' __main_ _'"的 clojure 等价物是什么?

lisp - 函数中的 setf 不起作用

lambda - 用 lisp 代码编写的 Lambda 微积分无穷大骑士

unix - 在emacs中打开时如何自动解压缩自定义压缩文件?

c - C 模式下的 Emacs 注释区域

emacs - 在 emacs 中更新字体锁定关键字而无需重新加载主要模式

Emacs Lisp 分割标识和删除的唯一窗口名称

scheme - 基于最大字段返回结构

emacs - 获取正在运行的 Emacs 计时器列表

emacs - 如何在 Emacs 中以编程方式查找键绑定(bind)来自哪个映射