Ale*_*ura 0 increment chicken-scheme
我将如何增加一个变量,就像a=0; a++;在Chicken中那样?
在 Common Lisp 中我会incf像这样使用:
(setf a 0) (incf a) (print a)
;=> 0
;=> 1
;=> 1
;=> 1
Run Code Online (Sandbox Code Playgroud)
但是 Chicken-scheme 似乎没有incf函数/宏,我尝试过使用aproposEgg 之类的东西,但到目前为止还没有任何帮助。
在 C 中,我会像这样增加变量:
int a = 0;
a++;
printf("%d", a);
Run Code Online (Sandbox Code Playgroud)
注意,我不想知道如何简单地a将 的值暂时增加1,我想增加,a以便a不再等于0而是等于1。
因此,以下不是我想要的:
(let ((a 0)) (set! a (+ 1 a)) (print a))
Run Code Online (Sandbox Code Playgroud)
这是我正在寻找的一个用 NewLisp 编写的示例:
(set 'a 0) (++ a) (println a)
Run Code Online (Sandbox Code Playgroud)
注意 函数/宏需要能够接受带引号的变量并永久递增该变量值。因此它需要等效于以下 C 代码:
a = 0; a++; // a now equals 1
Run Code Online (Sandbox Code Playgroud)
我只是在 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
Run Code Online (Sandbox Code Playgroud)
设置是set!在Scheme中完成的。
(let ((a 0))
(set! a (+ a 1))
(print a))
Run Code Online (Sandbox Code Playgroud)
我不是计划者,但我认为你可以为此编写一个宏,如下所示:
(define-syntax inc!
(syntax-rules ()
((inc! var)
(set! var (+ var 1)))))
Run Code Online (Sandbox Code Playgroud)
这样你就可以写
(inc! a)
Run Code Online (Sandbox Code Playgroud)