私の最高の推測: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)