5

次のような式を取るマクロをSchemeで(define-syntaxたとえば、を使用して)記述できますか?

(op a b c d e f g h i j)

そして、このような式を出力として生成しますか?

(op (op (op (op (op (op (op (op (op a b) c) d) e) f) g) h) i) j) 

もちろん、任意の長さです。次のようなテンプレートを考えると、それを行う方法が思いつきません。

(define-syntax op
  (syntax-rules ()
    [(_) 'base-case]
    [(v1 v2 ...) 'nested-case??]))
4

3 に答える 3

6
(define bop list)

(define-syntax op
  (syntax-rules ()
    ((op a b) (bop a b))
    ((op a b c ...) (op (bop a b) c ...))))

たとえば、 に(op 1 2 3 4)展開され(bop (bop (bop 1 2) 3) 4)、 に評価され(((1 2) 3) 4)ます。

于 2008-12-04T11:40:47.687 に答える
1

引数に適用する関数は、それ自体がマクロの引数である必要があります。それを除けば、私の解決策は同じでした。

#!r6rs

(import (rnrs base))

(define-syntax claudiu
  (syntax-rules ()
    ((claudiu fun first second)
     (fun first second))
    ((claudiu fun first second rest ...)
     (claudiu fun (claudiu fun first second) rest ...))))
于 2008-12-10T20:27:26.263 に答える
0

答えがどのように機能するかを示すには:

(op 1 2 3 4)

これは 4 つのステートメントを持つ op であるため、2 番目のケースは a=1、b=2、c=3、...=4 で選択されます。

(op (bop 1 2) 3 4)

これは 3 つのステートメントを含む op であるため、2 番目のケースです。a=(バップ 1 2)、b=3、c=4:

(op (bop (bop 1 2) 3) 4)

これは 2 つのステートメントを持つ bop なので、a=(bop (bop 1 2) 3), b=4 で完了です。

于 2008-12-04T18:52:52.137 に答える