2

(今のところ、私が求めているのは非スキームであることを無視してください。これは非プログラマー向けの DSL のためです)

これと同等のことをしたい:

(pairwise key1 value1 key2 value2)

mこれは、私が定義した別のマクロであり、これに拡張されます (したがって、単純に可変長スタイル関数を使用することはできません)。

(list (cons key1 (m value1)) (cons key2 (m value2)))

私はこれを試しました:

(define-syntax pairwise
  (syntax-rules ()
    ((_ key value ...)
     (list (cons key (m value)) ...))))

しかし、私が推測したように、次のように拡張されました。

(list (cons key1 (m value1)) (cons key1 (m key2)) (cons key1 (m value2)))

ユーザーが内側のブラケットを追加する必要なく、これらの要素をペアで処理する方法に少しこだわっています。

4

1 に答える 1

1

これは再帰で行うことができます。次のようなケースを 1 つ持つ代わりに、

((_ key value ...)
 (list (cons key (m value)) ...))

次のような2つのケースを持つことができます

((_)
 '())
((_ key value . rest)
 (cons (cons key (m value)) (pairwise . rest)))

再帰的なリスト処理関数を設計する方法と似ていますが、基本ケースをor条件 (実行時に検出syntax-rules) ではなくケース (コンパイル時に検出)として使用します。ifcond

于 2019-04-01T14:45:16.680 に答える