我将如何增加一个变量,即在中执行类似于的操作
在常见的Lisp中,我使用incf这样做,如下所示:
(setf a 0) (incf a) (print a)
;=> 0
;=> 1
;=> 1
;=> 1但是小鸡方案似乎没有一个incf函数/宏,而且我尝试过使用apropos蛋类,但到目前为止,这一点都没有帮助。
在C中,我会像这样增加变量:
int a = 0;
a++;
printf("%d", a);注意到,我不想知道如何通过1临时增加a的值,我想增加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我只想用鸡肉写一个宏来做这件事,但我似乎不能把鸡的宏搞清楚--它们根本就没有任何意义;它们一点也不像普通的lisps宏。
这里有一个宏示例,我刚刚在一个普通的lisp中进行了黑客攻击:
(defmacro ++ (sym) (let ((a (gensym "a,sym,") ))
`(let* ((,a ,sym))
(setf ,sym (+ 1 ,a)) ,sym)) )
(setf a 0)
;=> 0
(++ a)
;=> 1
a
;=> 1发布于 2013-08-06 18:25:11
方案中的设置是用set!完成的。
(let ((a 0))
(set! a (+ a 1))
(print a))我不是一个阴谋家,但我认为您可以为此编写宏,如下所示:
(define-syntax inc!
(syntax-rules ()
((inc! var)
(set! var (+ var 1)))))这样你就可以写
(inc! a)发布于 2013-08-05 20:02:09
(define counter
(let ((count 0))
(lambda ()
(set! count (+ count 1))
count)))
>(counter)
1
>(counter)
2始终将副作用的范围保存在闭包中。计数变量无法转义let作用域
编辑:请看以下内容。(尽管这正是你通常应该尽量避免的!)
> (define a 0)
> (define inca (lambda () (set! a (+ a 1))))
> a
0
> (inca)
> a
1SICP是一本很棒的书。您应该尝试理解方案中变量的范围,以及它与其他lisps的区别。而胆小鬼计划与这些问题无关。小鸡是一个很好的R5RS实现,您的问题将适用于所有方案。
https://stackoverflow.com/questions/18062533
复制相似问题