Next: , Previous: , Up: Customization Types   [Contents][Index]


15.4.3 リストへのスプライス

:inline機能により可変個の要素を、カスタマイゼーション型のlistvectorの途中にスプライス(splice: 継ぎ足す)することができます。listvector記述を含む型にたいして:inline tを追加することによってこれを使用します。

listvector型の仕様は、通常は単一の要素型を表します。しかしエントリーが:inline tを含むなら、マッチする値は含まれるシーケンスに直接マージされます。たとえばエントリーが3要素のリストにマッチするなら、全体が3要素のシーケンスになります。これはバッククォート構文(Backquoteを参照)の‘,@’に類似しています。

たとえば最初の要素がbazで、残りの引数は0個以上のfoobarでなければならないようなリストを指定するには、以下のカスタマイゼーション型を使用します:

(list (const baz) (set :inline t (const foo) (const bar)))

これは(baz)(baz foo)(baz bar)(baz foo bar)のような値にマッチします。

要素の型がchoiceなら、choice自身の中で:inlineを使用せずに、choiceの選択肢(の一部)の中で使用します。たとえば最初がファイル名で始まり、その後にシンボルtか2つの文字列を続けなければならないようなリストにマッチさせるには、以下のカスタマイゼーション型を使用します:

(list file
      (choice (const t)
              (list :inline t string string)))

選択においてユーザーが選択肢の1つ目を選んだ場合はリスト全体が2つの要素をもち、2つ目の要素はtになります。ユーザーが2つ目の候補を選んだ場合にはリスト全体が3つの要素をもち、2つ目と3つ目の要素は文字列でなければなりません。