如何定义赋值函数elisp?也就是说,如何将参数发送到可在函数内部修改的elisp函数,以便在函数外部使用(类似于C++中的非常数引用变量或指针)?例如,假设我有一个函数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中……我可以从F内部调用的c_n,它包含我需要在此过程中更新的任何参数。也就是说,我希望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)
.
.
.
))...))发布于 2013-06-29 19:10:37
我可以想到两种方式:
如果函数太复杂,您也可以结合使用这两种方法-使用宏foo创建a和b的cons,并使用该cons调用函数foo0,然后再次解包car和cdr。
如果需要两个以上的参数,只需使用多个cons作为参数即可。
发布于 2013-07-22 23:47:21
只是为了告诉你如何做,但请不要这样做,这是不好的风格。
(defun set-to (in-x out-y)
(set out-y in-x))
(let (x)
(set-to 10 'x)
x)有一种情况下,这是不起作用的:
(let (in-x)
(set-to 10 'in-x)
in-x)它有点像下面的C++代码
void set_to(int x, int* y) {
*y = x;
}
int y;
set_to(10, &y);实际上,我希望在C++中没有非常数引用,这样每个赋值函数都必须像上面那样用指针调用。
再说一次,除非确实必要,否则不要这么做。请改用multiple-value-bind或cl-flet。
https://stackoverflow.com/questions/17379385
复制相似问题