Scheme的版本是C的`++`

时间:2013-08-05 15:58:07

标签: increment chicken-scheme

我如何增加变量,即在中执行类似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

2 个答案:

答案 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实施,您的问题将适用于所有方案。