【发布时间】:2013-08-05 15:58:07
【问题描述】:
我将如何增加一个变量,例如 Chicken 中的a=0; a++;?
在 Common Lisp 中,我会像这样使用 incf 来做到这一点:
(setf a 0) (incf a) (print a)
;=> 0
;=> 1
;=> 1
;=> 1
但是 Chicken-scheme 似乎没有 incf 函数/宏,我尝试使用 apropos egg 东西,但到目前为止这根本没有帮助。
在 C 中,我会像这样递增变量:
int a = 0;
a++;
printf("%d", a);
注意,我不想知道如何简单地将a 的值暂时增加1,我想增加a 以便a 不再等于0 但等于 1。
因此,以下是我想要的不是:
(let ((a 0)) (set! a (+ 1 a)) (print a))
这是我正在寻找的示例——用 NewLisp 编写:
(set 'a 0) (++ a) (println a)
注意 函数/宏需要能够接受带引号的变量并永久增加该变量的值。因此它需要等同于以下 C 代码:
a = 0; a++; // a now equals 1
我只想在 Chicken 中编写一个宏来执行此操作,但我似乎无法对 Chicken 的宏进行正面或反面——它们只是没有任何意义;它们根本不像 common-lisps 宏。
这是我刚刚在 common-lisp 中编写的一个示例宏:
(defmacro ++ (sym) (let ((a (gensym "a,sym,") ))
`(let* ((,a ,sym))
(setf ,sym (+ 1 ,a)) ,sym)) )
(setf a 0)
;=> 0
(++ a)
;=> 1
a
;=> 1
【问题讨论】:
-
注意如果我不能这样做
(set! a 0) (SOME-FUNCTION-OR-MACRO a) (print a)并从(print a)得到1,那么这不是我想要的。 -
我编辑了我的答案。检查。
-
Svante 的回答是正确的(你应该告诉他为什么你认为它不是),但是如果你不想将他的宏复制到你的代码中,它可以在 miscmacros egg (具有相同的名称,公司!)。那个版本,就像 CL 中的 incf 一样,有一个可选的第二个参数,让你说增加多少。