首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mutator elisp函数

Mutator elisp函数
EN

Stack Overflow用户
提问于 2013-06-29 18:46:48
回答 2查看 147关注 0票数 2

如何定义赋值函数elisp?也就是说,如何将参数发送到可在函数内部修改的elisp函数,以便在函数外部使用(类似于C++中的非常数引用变量或指针)?例如,假设我有一个函数foo,定义如下

代码语言:javascript
复制
(defun foo (a b c d)
  ;do some stuff to b, c, and d
        .
        .
        .
  )

我可能会这样称呼它,比如说,如下所示

代码语言:javascript
复制
(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)

我知道我可以将某个函数的所有本地参数放到一个大的旧列表中,计算函数末尾的列表,然后从设置为该函数的返回值的其他列表(一组内容)中获取这些变量。

代码语言:javascript
复制
(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看起来像这样:

代码语言:javascript
复制
(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)
     .
     .
     .
 ))...))
EN

回答 2

Stack Overflow用户

发布于 2013-06-29 19:10:37

我可以想到两种方式:

  • 使“”foo成为宏而不是函数(如果可能)
  • 将新创建的cons (或更多)传递到函数中,并通过setcar/setcdr替换其中的car和cdr。

如果函数太复杂,您也可以结合使用这两种方法-使用宏foo创建a和b的cons,并使用该cons调用函数foo0,然后再次解包car和cdr。

如果需要两个以上的参数,只需使用多个cons作为参数即可。

票数 2
EN

Stack Overflow用户

发布于 2013-07-22 23:47:21

只是为了告诉你如何做,但请不要这样做,这是不好的风格。

代码语言:javascript
复制
(defun set-to (in-x out-y)
  (set out-y in-x))

(let (x)
  (set-to 10 'x)
  x)

有一种情况下,这是不起作用的:

代码语言:javascript
复制
(let (in-x)
  (set-to 10 'in-x)
  in-x)

它有点像下面的C++代码

代码语言:javascript
复制
void set_to(int x, int* y) {
    *y = x;
}

int y;
set_to(10, &y);

实际上,我希望在C++中没有非常数引用,这样每个赋值函数都必须像上面那样用指针调用。

再说一次,除非确实必要,否则不要这么做。请改用multiple-value-bindcl-flet

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17379385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档