2017-08-07 6 views
1

初心者の質問はここにありますが、私はその言語で数時間しか過ごしていません。(match)に(dict(k v)...)パターンがないのはなぜですか?

ラケットは、ペアのリストなど(match)機能はなど(hash-table (pat pat)...)(list-no-order pat...)、ではなく、(dict (pat pat)...)を認識し、ハッシュテーブルによって実装され、dictionariesを持っています。

私はdictインターフェイスでパターンマッチすると便利だと思ったのと同じ理由から、インターフェイスを持つのが便利です。その省略は、そうではないことを示唆している。誰かが私に行方不明を教えてもらえますか?ハッシュまたはリストのペアのいずれかである可能性のあるデータに対して(match)を使用する場合は、2つの句を使用する必要がありますか?何か完全に?

答えて

0

私の最高の推測:matchのパターンはdictを実装するのに十分な強さを感じていませんでした。幸いにもmatchは拡張可能です。フォームdefine-match-expanderは、matchが処理できるパターンのセットを拡張するために使用できます。

し、我々は次のように試合エキスパンダを定義することができるのは、我々が

(dict (k0 v0) (k1 v1)) 

(or (hash-table (k0 v0) (k1 v1) 
    (list-no-order (cons k0 v0) (cons k1 v1)) 

(3つ以上のキーと値のペアを持つパターンについても同様) と同じ意味にしたいとしましょうこれは:

(define-match-expander dict 
    (λ (stx) 
    (syntax-case stx() 
     [(_dict (key-pat val-pat) ...) 
     #'(or (hash-table (key-pat val-pat) ...) 
      (list-no-order (cons key-pat val-pat) ...))]))) 

今や、(dict ("a" a) ("b" b) ("c" c)) wilのようなパターンlはmatchによって理解される。

フル例:

#lang racket 
(define-match-expander dict 
    (λ (stx) 
    (syntax-case stx() 
     [(_dict (key-pat val-pat) ...) 
     #'(or (hash-table (key-pat val-pat) ...) 
      (list-no-order (cons key-pat val-pat) ...))]))) 

(define (keys+vals a-dict) 
    (match a-dict 
    [(dict ("a" a) ("b" b)) 
    (list a b)])) 

(keys+vals (hash "a" 1 "b" 2))  ; gives '(1 2) 
(keys+vals '(("b" . 5) ("a" . 4))) ; gives '(4 5) 
関連する問題