首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案的C's `++`版本

方案的C's `++`版本
EN

Stack Overflow用户
提问于 2013-08-05 15:58:07
回答 2查看 1.1K关注 0票数 0

我将如何增加一个变量,即在中执行类似于的操作

在常见的Lisp中,我使用incf这样做,如下所示:

代码语言:javascript
复制
(setf a 0) (incf a) (print a)

;=> 0

;=> 1

;=> 1
;=> 1

但是小鸡方案似乎没有一个incf函数/宏,而且我尝试过使用apropos蛋类,但到目前为止,这一点都没有帮助。

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

代码语言:javascript
复制
int a = 0;
a++;
printf("%d", a);

注意到,我不想知道如何通过1临时增加a的值,我想增加a,这样a不再等于0,而是等于1

因此,下面是而不是我想要的东西:

代码语言:javascript
复制
(let ((a 0)) (set! a (+ 1 a)) (print a))

下面是我正在寻找的一个例子--用NewLisp编写的:

代码语言:javascript
复制
(set 'a 0) (++ a) (println a)

注意函数/宏需要能够永久地接受引用的变量和变量值的增量。因此,它需要等价于以下C代码:

代码语言:javascript
复制
a = 0; a++; // a now equals 1

我只想用鸡肉写一个宏来做这件事,但我似乎不能把鸡的宏搞清楚--它们根本就没有任何意义;它们一点也不像普通的lisps宏。

这里有一个宏示例,我刚刚在一个普通的lisp中进行了黑客攻击:

代码语言:javascript
复制
(defmacro ++ (sym) (let ((a (gensym "a,sym,") ))
  `(let* ((,a ,sym))
      (setf ,sym (+ 1 ,a)) ,sym)) )

(setf a 0)

;=> 0

(++ a)

;=> 1

a 

;=> 1
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-06 18:25:11

方案中的设置是用set!完成的。

代码语言:javascript
复制
(let ((a 0))
  (set! a (+ a 1))
  (print a))

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

代码语言:javascript
复制
(define-syntax inc!
  (syntax-rules ()
    ((inc! var)
     (set! var (+ var 1)))))

这样你就可以写

代码语言:javascript
复制
(inc! a)
票数 5
EN

Stack Overflow用户

发布于 2013-08-05 20:02:09

代码语言:javascript
复制
(define counter
        (let ((count 0))
          (lambda ()
            (set! count (+ count 1))
            count)))

>(counter)
1
>(counter)
2

始终将副作用的范围保存在闭包中。计数变量无法转义let作用域

编辑:请看以下内容。(尽管这正是你通常应该尽量避免的!)

代码语言:javascript
复制
> (define a 0)
> (define inca (lambda () (set! a (+ a 1))))
> a
0
> (inca)
> a
1

SICP是一本很棒的书。您应该尝试理解方案中变量的范围,以及它与其他lisps的区别。而胆小鬼计划与这些问题无关。小鸡是一个很好的R5RS实现,您的问题将适用于所有方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18062533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档