我如何增加变量,即在鸡中执行类似a=0; a++;
的操作?
在Common Lisp中我会使用incf
这样做:
(setf a 0) (incf a) (print a)
;=> 0
;=> 1
;=> 1
;=> 1
但Chicken-scheme似乎没有incf
函数/宏,我尝试使用apropos
egg thingy,但到目前为止这根本没有帮助。
在C中,我会像这样增加变量:
int a = 0;
a++;
printf("%d", a);
注意,我不想知道如何简单地a
暂时增加1
的值,我想增加a
以便a
不再等于0
,而是等于1
。
因此,以下是 NOT 我想要的内容:
(let ((a 0)) (set! a (+ 1 a)) (print a))
以下是我正在寻找的一个例子 - 用NewLisp编写:
(set 'a 0) (++ a) (println a)
注意 函数/宏需要能够接受引用变量并永久地增加变量值。因此,它需要等同于以下C代码:
a = 0; a++; // a now equals 1
我只是在鸡上写一个宏来做这个,但我似乎无法对鸡的宏做出正面或反面 - 它们只是没有任何意义;它们根本不像普通的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
答案 0 :(得分:4)
使用Scheme中的set!
完成设置。
(let ((a 0))
(set! a (+ a 1))
(print a))
我不是Schemer,但我认为您可以为此编写一个宏,如下所示:
(define-syntax inc!
(syntax-rules ()
((inc! var)
(set! var (+ var 1)))))
这样你就可以写
了(inc! a)
答案 1 :(得分:0)
(define counter
(let ((count 0))
(lambda ()
(set! count (+ count 1))
count)))
>(counter)
1
>(counter)
2
始终将副作用的范围保持在闭包内。
count变量无法转义let
范围
编辑: 请看下面的内容。 (虽然这正是你应该试图通常避免的!)
> (define a 0)
> (define inca (lambda () (set! a (+ a 1))))
> a
0
> (inca)
> a
1
SICP是一本好书。您应该尝试理解方案中变量的范围以及它与其他lisps的区别。而鸡计划与这些问题没有任何关系。鸡是一个伟大的R5RS实施,您的问题将适用于所有方案。