2011-11-18 7 views
5

私は最近ラケットパターンマッチングシステムで遊んで始めました。私は理解できない問題に遭遇しました。ラケットの構造タイプ上のKleeneスターとのパターン一致

私が行う場合は、次のREPLで

(match (list 1 2 3 4 5 6 7 8 9 10 11 12) 
    [(list _ x y z ...) (list y ': x)]) 

は私が私の望ましい結果として

'(3 : 2) 

を取得します。

私が行う場合:

(match (current-date) 
    [(date* _ x y z ...) (list y ': x)]) 

または

(match (date* 5 18 13 18 11 2011 5 321 #f 3600 0 "W. Europe Standard Time") 
    [(date* _ x y z ...) (list y ': x)]) 

を私はこのエラーを取得:

match: wrong number for fields for structure date*: expected 12 but got 5 in: (_ x y z ...) 

私はクリーネスター...は、いくつかのための構造体型で動作しないと思われます理由。それはなぜそうですか?

答えて

10

本当にやりたいことは、実際に構造体のフィールドの残りの部分を(z ...)にバインドするのではなく、構造体のフィールドのサブセットに一致するように思えます。この場合、代わりにstruct*マッチパターンを試してみてください。ここで

は例です:

(match (date* 5 18 13 18 11 2011 5 321 #f 3600 0 "W. Europe Standard Time") 
    [(struct* date ([minute x] [hour y])) (list y ': x)]) 
+0

1あなたの答えは、実際にははるかに便利私よりあります。 :-) – ruakh

+0

@ruakhあなたの答えは*なぜ*動作しません。この回答は、それを動作させる方法を説明しています。両方ともかなり役に立ちます。 –

+0

はい、どちらも参考になります。ありがとう。 – mentus

8

i suspect that the Kleene star ... does not work with struct type for some reason.

修正。 ...表記法、および関連する..kおよび___および__k表記は実際に一致の一般的な特徴ではなく、むしろlistマッチングおよびhash-tableマッチングの特定の機能です。 the documentationで正式な作品を調べると、patまたはpatのいずれかである...またはその友人の1つとして、patのいずれかしか受け入れられないサブパターンのタイプがあることがわかります。

Why is it so?

私はそれが...はリストやベクトルやハッシュ・テーブルやその他もろもろ独自のリストへの一部を変換するために使用されていることを単にだし、固定長の構造体のためにそれを行うには賢明な方法はありませんね。 ...が異なるタイプのために異なって振る舞うことを指摘する価値があるかもしれません。—例えば、ハッシュテーブル—のキーのリストを抽出するために使用できるので、構造体をサポートする唯一の理由は、構造体には意味をなさない類似の操作。私はそれがあるとは思わない。

関連する問題