0

我将如何增加一个变量,就像a=0; a++;Chicken中一样?

在 Common Lisp 中,我会这样做incf

(setf a 0) (incf a) (print a)

;=> 0

;=> 1

;=> 1
;=> 1

但是 Chicken-scheme 似乎没有incf函数/宏,我尝试过使用aproposegg 的东西,但到目前为止这根本没有帮助。

在 C 中,我会像这样增加变量:

int a = 0;
a++;
printf("%d", a);

注意,我不想知道如何简单地a临时增加 by的值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
4

2 回答 2

4

设置是set!在 Scheme 中完成的。

(let ((a 0))
  (set! a (+ a 1))
  (print a))

我不是 Schemer,但我认为您可以为此编写一个宏,如下所示:

(define-syntax inc!
  (syntax-rules ()
    ((inc! var)
     (set! var (+ var 1)))))

这样你就可以写

(inc! a)
于 2013-08-06T18:25:11.810 回答
0
(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
1

SICP是一本很棒的书。您应该尝试了解 scheme 中变量的范围以及它与其他 lisp 的不同之处。成为鸡计划与这些问题无关。Chicken 是一个很棒的 R5RS 实现,您的问题将适用于所有方案。

于 2013-08-05T20:02:09.390 回答