如何定义 mutator elisp 函数?也就是说,如何将参数发送到可以在函数内部修改以在函数外部使用的 elisp 函数(类似于 C++ 中的非 const 引用变量或指针)?例如,假设我定义了一个函数 foo
(defun foo (a b c d)
;do some stuff to b, c, and d
.
.
.
)
我可能喜欢这样称呼它,比如说,如下
(defun bar (x)
(let ((a) (b) (c) (y))
.
.
.
;a, b and c are nil at this point
(foo x a b c)
(setq y (some-other-function-of a b c x and-other-variables))
.
.
.
)) ... )
y)
我知道我可以将某个函数的所有本地参数放入一个大的旧列表中,在函数末尾评估列表,然后从其他列表中获取这些变量设置为该函数的返回值(列表的东西),即
(setq return-list (foo read-only-x read-only-y))
(setq v_1 (car return-list))
(setq v_2 (cadr return-list))
.
.
但是有没有更好的方法?到目前为止,我在尝试解决这个问题时所做的只是退出函数,其中的变量与传入的方式没有什么不同
至于为什么我希望能够做到这一点,我只是尝试重构一些大型函数 F,使与某些可命名概念 c 相关的所有表达式集合都存在于它们自己的小模块 c_1、c_2、c_3、... c_n 中我可以在 F 中调用我需要在此过程中更新的任何参数。也就是说,我希望 F 看起来像:
(defun F ( ... )
(let ((a_1) (a_2) ... )
(c_1 a_1 ... a_m)
(c_2 a_h ... a_i)
.
.
.
(c_n a_j ... a_k)
.
.
.
))...))