0

Chickena=0; a++;のようなことをしている変数をインクリメントするにはどうすればよいですか?

Common Lisp ではincf、次のように使用します。

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

;=> 0

;=> 1

;=> 1
;=> 1

incfしかし、Chicken-scheme には関数/マクロがないようで、apropos卵のようなものを使用してみましたが、これまでのところまったく役に立ちませんでした。

C では、次のように変数をインクリメントします。

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

a、一時的にの値を単純に増やす方法を知りたくあり1ません。 aa01

したがって、以下は私が望むものではありません:

(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 に答える