【问题标题】:Scheme's version of C's `++`Scheme 版本的 C `++`
【发布时间】:2013-08-05 15:58:07
【问题描述】:

我将如何增加一个变量,例如 Chicken 中的a=0; a++;

在 Common Lisp 中,我会像这样使用 incf 来做到这一点:

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

;=> 0

;=> 1

;=> 1
;=> 1

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

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

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

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

【问题讨论】:

  • 注意如果我不能这样做(set! a 0) (SOME-FUNCTION-OR-MACRO a) (print a) 并从(print a) 得到1,那么这不是我想要的。
  • 我编辑了我的答案。检查。
  • Svante 的回答是正确的(你应该告诉他为什么你认为它不是),但是如果你不想将他的宏复制到你的代码中,它可以在 miscmacros egg (具有相同的名称,公司!)。那个版本,就像 CL 中的 incf 一样,有一个可选的第二个参数,让你说增加多少。

标签: increment chicken-scheme


【解决方案1】:

在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)

【讨论】:

  • 不是我想要的。我想要类似于 common-lisp 的 incf
  • 也就是说,如果我不能这样做(set! a 0) (SOME-FUNCTION-OR-MACRO a) (print a) 并从(print a) 得到1,那么这不是我想要的。
  • 再次在此:如果您有(SOME-FUNCTION a)变量在 SOME-FUNCTIONs 主体中是阴影的。但是,如果您像我的示例中那样显式更改 global a,它将起作用。现在,正如您所见,Svante 没有创建函数,而是创建了语法。所以 SOME-FUNCTION 和 SOME-MACRO 真的不一样。
【解决方案2】:
(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 是一本很棒的书。您应该尝试了解 scheme 中变量的范围以及它与其他 lisp 的不同之处。成为鸡计划与这些问题无关。 Chicken 是一个很棒的 R5RS 实现,您的问题将适用于所有方案。

【讨论】:

  • 我希望副作用持续超出递增函数的范围。我会在我原来的帖子中添加更多内容。
  • 值得注意的是,就我在问我最初的问题时所知道的一切而言,方案的每个实现都可能有++ 的变体,除了 i>鸡——我不知道这个问题是否适用于方案的每个实现,因为问这样的问题超出了我感兴趣的范围。我只想知道怎么做X在鸡计划中;不是你不能在任何方案中做X
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多