Scheme 的 C ++ 版本

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)

Sva*_*nte 5

设置是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)