0

sumScheme マクロがどのように機能するかを理解するために、私は新しいコマンドを定義しようとしていますoperator +

私はこのコードを書きました:

(define-syntax sum
  (syntax-rules ()
    ((_ arg1 arg2 args...)
     (sum (+ arg1 arg2) args...))
    ((_ arg1 arg2)
     (+ arg1 arg2))
    ((_ arg1)
     arg1)))

1、2、または 3 つの引数を渡すと機能します。しかし、4つの引数を使用すると、次のエラーが発生します:

sum: bad syntax in: (sum 1 2 3 4)

DrRacket でマクロを段階的に展開しようとしましたが、すぐに停止します。

誰かがこのエラーの原因を説明できますか?

4

1 に答える 1

2

スキームでは、は単なる別の識別子であるため、次のように、両方の場所でと の省略記号 ( ) の...間にスペースが必要です。args...

(define-syntax sum
  (syntax-rules ()
    ((_ arg1 arg2 args ...)
     (sum (+ arg1 arg2) args ...))
     ___etc___))

ところで、任意の数の引数を受け入れるためにマクロを作成する必要はありません。「残りの引数」を使用することもできます。

(define (sum . args)
  ;; args is bound to a list of all the arguments
  (foldl + 0 args))
于 2012-09-22T18:47:53.220 に答える