ディクショナリは、キーと値を結びつけるデータ構造です。 Gaucheは組み込みのディクショナリとして、ハッシュテーブル(ハッシュテーブル参照)と ツリーマップ(ツリーマップ参照)を用意しています。 ライブラリには他にもディクショナリとして振る舞うデータ構造がいくつか提供されます。
さらに、ディクショナリ汎用のインタフェースが、
ディクショナリフレームワークとして提供されます (gauche.dictionary
- ディクショナリフレームワーク参照)。
ディクショナリの種類に関わらない操作を書くのに使えます。
R7RSでは、抽象化されたディクショナリインタフェースをマッピングとして定義しています。
scheme.mapping
- R7RSマッピングを参照してください。
• ハッシュテーブル: | ||
• ツリーマップ: |
R7RS-largeにはハッシュテーブルが定義されています
(scheme.hash-table
モジュール、scheme.hash-table
- R7RSハッシュテーブル参照)。
しかし、そのAPIはGaucheにもともとあったハッシュテーブルや他のネイティブAPIと一貫性を
欠いている部分があります。
APIをごちゃまぜにするよりは、GaucheのネイティブなAPIの一貫性を保つことを重視し、
R7RSの手続きのうちGaucheにそぐわないものは、組み込み関数では別名
(サフィックス-r7
がついたもの)をつけて提供しています。
ポータブルなコードを書く場合は、scheme.hash-table
をインポートすれば
R7RSの名前が使えます。
ハッシュテーブルのクラスです。<collection>
と<dictionary>
を
継承します。
Gaucheは今のところ、変更不可なハッシュテーブルは提供しません。
(変更不可なマップが必要な場合は、data.imap
- 変更不可なマップを参照してください。)
[R7RS hash-table]
objがハッシュテーブルであれば#t
を返します。
[R7RS hash-table]
ハッシュテーブルhtが変更可能なら#t
を返します。
Gaucheは変更不可なハッシュテーブルを持たないので、
どんなハッシュテーブルに関しても手続きは#t
を返します。
ハッシュテーブルhtで使われている比較器を返します。
これは古いAPIで、hash-table-comparator
によって置き換えられました。
ハッシュテーブルhtのタイプに応じて、シンボル
eq?
、eqv?
、equal?
、string=?
、
general
のいずれかを返します。
[R7RS hash-table]
ハッシュテーブルht中の要素の個数を返します。
R7RSの名前はhash-table-size
.
[R7RS+ hash-table]
ハッシュテーブルを作成します。comparator引数には、
キーの等価判定とハッシュに使う比較器(基本的な比較器参照)を渡します。
省略された場合はeq-comparator
が使われます。
(R7RSではcomparatorは省略できません。)
Gauche独自拡張として、comparatorにシンボル
eq?
、eqv?
、equal?
、string=?
のいずれかを
指定することもできます。
eq-comparator
、
eqv-comparator
、equal-comparator
、
string-comparator
が使われます。
比較器はハッシュ関数を持っていなければなりません。組み込みのハッシュ関数については ハッシュを参照してください。比較器を組み合わせて作られた比較器については、 元の比較器がハッシュ関数を持っていれば、通常は適切なハッシュ関数が設定されます。
与えられたキーと値の列からハッシュテーブルを構築して
返します。comparator引数の意味はmake-hash-table
と同じです。
各key&valueはペアでなければならず、そのcarがキー、cdrが値として使われます。
註:これは0.9.5までhash-table
と呼ばれていた手続きです。
R7RSは同名で異なるインタフェースを持つインタフェースを定義しました。
そちらの方が使いやすいので、長期的にはR7RSインタフェースへとスイッチする予定ですが、
それはかなり将来のことになります。
R7RSインタフェースはhash-table-r7
という名前で利用可能なので、
新たなコードはそちらを使うことを強くお勧めします。
また、既存のコードでhash-table
を使っていたら、
hash-table-from-pairs
に直してください。
(hash-table-from-pairs 'eq? '(a . 1) '(b . 2)) ≡ (rlet1 h (make-hash-table 'eq?) (hash-table-put! h 'a 1) (hash-table-put! h 'b 2))
hash-table-from-pairs
の別名です。
R7RSが同名で別インタフェースの手続き(下のhash-table-r7
参照)を導入し、
将来的にはGaucheもそちらに移行する予定です。なので今のところ、
hash-table-from-pairs
かhash-table-r7
を使うか、
scheme.hash-table
をインポートしてR7RSとして書いてください。
comparatorを比較器に使うハッシュテーブルを作って返します。 args …はキーと値を交互に並べたもので、ハッシュテーブルの内容を指定します。
これはR7RS scheme.hash-table
でhash-table
と定義されている手続きです
(scheme.hash-table
- R7RSハッシュテーブル参照)。
(hash-table-r7 'eq? 'a 1 'b 2) ≡ (rlet1 h (make-hash-table 'eq?) (hash-table-put! h 'a 1) (hash-table-put! h 'b 2))
註: R7RS準拠の実装には、hash-table
が変更不可なハッシュテーブルを
返すものがあります。Gaucheは変更不可なハッシュテールを持っていないので
(変更不可なマップならあります: data.imap
- 変更不可なマップ参照)、
変更可能なハッシュテーブルが返されます。
ただ、ポータブルなプログラムを書いている場合は、この手続きが返したハッシュテーブルを
変更しないように注意してください。
[R7RS hash-table] 次の手順で新たなハッシュテーブルを作り返します。 各繰り返しは「現在のシード値」を参照しますが、その初期値はseedです。
[R7RS hash-table] ハッシュテーブルhtのコピーを作って返します。
R7RSは、実装が変更不可なハッシュテーブルをサポートする場合、 mutable?引数に真の値が与えられない限りは、 この手続きは変更不可なハッシュテーブルを返すと規定しています。 Gaucheは変更不可なハッシュテーブルを持たないので、mutable?引数は無視され、 常に変更可能なハッシュテーブルが返されますが、 ポータブルなコードを書いている場合は気をつけてください。
[R7RS hash-table] ハッシュテーブルhtと同じ性質を持つ空の変更可能なハッシュテーブルを作成して 返します。
[R7RS+ hash-table]
alistに含まれるそれぞれの要素をエントリとして持つハッシュテーブルを
作成して返します。その時、要素のcarがキーとして、要素のcdrが値として
使われます。comparator引数の意味はmake-hash-table
と同じです。
comparatorのデフォルト値はeq-comparator
です。
R7RSではcomparatorは省略不可です。
[R7RS hash-table]
(hash-table-map h cons)
キーkeyをハッシュテーブルhtから探します。見つかればキーに対応する 値を返します。キーが見つからなかった場合、defaultが与えられていればそれを 返し、そうでなければエラーを報告します。
キーkeyと対応する値valueをハッシュテーブルhtに挿入します。
hash-table-get
とhash-table-put!
のメソッド版です。
[R7RS hash-table] これがR7RS方式のハッシュテーブルルックアップです。
ハッシュテーブルht中の、keyに結びつけられた値を探し、 それを手続きsuccessに渡して、その結果を返します。 successが省略された場合は単に値そのものが返されます。
keyに対応する値がhtに無い場合は、引数を取らない手続きfailureが 呼ばれ、その結果が返されます。failureが省略されていた場合はエラーが報告されます。
これはGaucheのhash-table-get
よりも汎用的ですが、
キーが見つからなかった場合に単純に既定値を返したいといった場合に、
それをいちいちクロージャで包むのは面倒です。R7RSではそのために
下に説明するhash-table-ref/default
があります。
[R7RS hash-table] ハッシュテーブルhtからkeyを探し、対応する値を返します。 keyが見つからない場合はdefaultを返します。
これは、defaultが省略できないことを除いては、Gaucheの
hash-table-get
と同じです。hash-table-get
の方が短くて便利なので
両方提供しています。
[R7RS hash-table]
これが、ハッシュテーブルに新たなエントリを追加するR7RS式のインタフェースです。
args …にはキーと値を交互に並べたリストを指定します。
Gaucheのhash-table-put!
と違い、いくつものエントリを一度に追加することができます。
args …が偶数要素でなければエラーです。
(hash-table-set! ht 'a 1 'b 2) ≡ (begin (hash-table-put! ht 'a 1) (hash-table-put! ht 'b 2))
これはR7RSでhash-table-intern!
として定義されています。
Gaucheの慣習と異なり、R7RSの方式でfailureにサンクを取ることを強調するために
-r7
サフィックスをつけました。
htからkeyを探します。もし既にエントリがあれば、その値を返します。 エントリが無ければ、サンクfailureを呼び、その戻り値をkeyに対応する 値としてhtに挿入して、failureの戻り値を返します。
[R7RS hash-table]
ハッシュテーブルhtにキーkeyを持つエントリがあれば#t
を返します。
R7RSでの名前はhash-table-contains?
です。
ハッシュテーブルht
からキーkeyを持つエントリを削除します。
keyを持つエントリが実際に存在して削除された場合は#t
を、
エントリが存在しなかった場合は#f
を返します。
この手続きはSTkでhash-table-remove!
と呼ばれているものです
(STkのは戻り値が定義されていませんが)。GaucheではSRFI-1, SRFI-13やその他の
ライブラリとの一貫性のために ‘delete’ を採用しました。
註: これはR7RSのhash-table-delete!
と異なります。
R7RSインタフェースはhash-table-delete!-r7
という別名で提供されます。
key …を持つエントリをハッシュテーブルhtから削除します。 htに含まれなかったキーは単に無視されます。実際に削除されたエントリの数が返されます。
これはR7RSでhash-table-delete!
と呼ばれており、
scheme.hash-table
でもその名前で提供されます。
Gaucheのhash-table-delete!
は真偽値を返すので、
組み込みとしては別名で提供することにしました。
[R7RS hash-table] ハッシュテーブルhtの全てのエントリを削除します。
ハッシュテーブルht中の、キーkeyに対応する値にvalueをコンスし、
それをkeyに対する新たな値とします。もしkeyに対応する値がまだ無ければ、
新たなエントリが作成され、(list value)
がその値となります。
この手続きは次のコードと同じ動作をしますが、キーの探索が一度しか行われないためより高速です。
(hash-table-put! ht key (cons value (hash-table-get ht key '())))
ハッシュテーブルht中のキーkeyに対応する値が存在し、かつペアで あった場合に、そのエントリーを元の値のcdrで置き換え、元の値のcarを返します。 keyに対応する値が存在しないかペアではなかった場合、テーブルは変更されず、 defaultが与えられていればそれが返され、与えられていなければエラーが報告されます。
値が置き換えられる場合でもキーの探索は一度しか行われないため効率が良いです。
註:R7RSもhash-table-pop!
を定義していますが、全く違う操作です。
そこで、R7RSバージョンはhash-table-pop!-r7
として提供しています。
ハッシュテーブルht中の任意のエントリをひとつ削除し、 そのエントリのキーと値を二つの戻り値として返します。 htが空ならエラーが報告されます。
R7RSではこれがhash-table-pop!
と呼ばれていて、
scheme.hash-table
でもその名前で提供されます。
hash-table-push!
等のより一般的なバージョンです。
ハッシュテーブルの探索が一度しか行われないことを除いては、
基本的に次のように動作します。
(let ((tmp (proc (hash-table-get ht key default)))) (hash-table-put! ht key tmp) tmp)
例えば、ハッシュテーブルを使ってオブジェクトの個数を数えているとしましょう。 次の1行で、オブジェクトitemが既に出現したかどうかを気にせずに その個数をインクリメントできます。
(hash-table-update! ht item (cut + 1 <>) 0))
R7RSもhash-table-update!
を定義していますが、インタフェースが異なるので、
GaucheではR7RS版を別名hash-table-update!-r7
として提供します。
これがR7RS版のhash-table-update!
です。
省略可能引数を全て省略した場合はGaucheのhash-table-update!
と同じになりますが、
実際にはkeyがhtに無かった場合の振る舞いを指定する必要があることが多く、
その場合R7RSのインタフェースはGaucheと異なってきます。
R7RS版は、効率を除けば次のとおり動作します。
(hash-table-put! ht key (updater (hash-table-ref ht key failure success)))
[R7RS hash-table]
これはdefaultが省略できないことを除けば、
Gaucheのhash-table-update!
と同じです。
ハッシュテーブルht内の全てのエントリについて、各エントリのキーと値を 2つの引数として手続きprocを呼びます。
ハッシュテーブルht内の全てのエントリについてkonsを呼びます。
konsには3つの引数が渡されます。
各エントリのキーと値、および一つ前のkonsの返り値です。
最初のkonsの呼び出しの時には、第3引数にknilが渡されます。
最後のkonsの返り値がhash-table-fold
の返り値となります。
predをハッシュテーブルhtの各エントリのキーと値を引数にして
呼び出し、それが真の値を返したら直ちにそれを戻り値とします。
predを満たすキーと値が無ければ、無引数の手続きfailureが呼び出され、
その値が戻り値となります。failureが省略された場合は
(lambda () #f)
が使われます。
註: SRFI-1から始まった慣習では、*-find
というAPIは
述語を満たすようなコレクション内の要素を返し、*-any
というAPIが
述語が偽でない値を返した時にその値をそのまま返り値とします。
SRFI-125が慣習を破った理由は、
“any”のセマンティクスで従来の “find” の動作もエミュレートできるので
“find”が “any” の動作も兼ねてしまえばよいというものです。
しかし、現在までのところ、この慣習を破っているのはSRFI-125のみです。
;; ハッシュテーブルhaとhbに共通のキーがあるかどうか調べる (hash-table-find ha (^[k v] (hash-table-exists? hb k)))
それぞれ、ハッシュテーブルht内の全てのキーまたは値をリストにして返します。
ハッシュテーブルは、キーと値の組を要素とする集合とみなすことができます。 この手続きは二つのハッシュテーブルht1とht2を集合として比較します。
二つのハッシュテーブルのキー比較器は同じ (equal?
の意味で)
でなければなりません。そうでない場合はエラーが投げられます。
二つの要素は、キー同士がキー比較器によって等価と判断され、かつ
値同士がvalue=?手続きによって等価と判断された場合に等しいとみなされます。
value=?が省略された場合はequal?
が使われます。
4通りの結果が有り得ます。
[R7RS hash-table]
この手続きもht1とht2を集合として比較し、
二つのテーブルが等しい集合である場合、つまりht1の要素がすべてht2の要素でもあり、
またその逆も真である場合に#t
を、そうでなければ#f
を返します。
二つの要素は、キー同士がキー比較器によって等価と判定され、かつ また値同士が比較器value-cmprによって等価と判定された場合に 等しいとみなされます。
ht1とht2のキー比較器が異なっていた場合はエラーが投げられます。
上のhash-table-compare-as-sets
も参照してください。
[R7RS hash-table] 二つのハッシュテーブル間で集合演算を行い、結果をht1に格納します。 これらの手続きでは、集合の要素としてキーだけを見ます。 もし同じキーを持つ要素の値がht1とht2で異なっていた場合、 ht1の値が優先されます。
ツリーマップクラス。ツリーマップはキーオブジェクトから値オブジェクトへ の写像をあらわすデータ構造です。ツリーマップでは平衡木を使うということ 以外はハッシュテーブルと同じです。ツリーマップでは挿入と検索の手間は O(log n)です。
ハッシュテーブルとはちがい、キーの順序は保存されます。したがってキーの 順序どおりにトラバースするのは簡単で、キーの最小値/最大値を見つけたり、 指定したキーにもっとも近いキーを探すのも簡単です。
<tree-map>
クラスは<sequence>
および
<ordered-dictionary>
を継承しています。
<tree-map>
オブジェクトを作成して返します。
キーは比較器comparatorを使って比較されます。comparatorの
デフォルト値はdefault-comparator
です。キーには全順序関係が必要なので、
比較器は比較手続きを持っていなければなりません。
詳しくは基本的な比較器を参照してください。
互換性のため、make-tree-map
はcomparator引数に
単なる手続きを取ることもできます。渡される手続きは2引数を取り、
最初の引数が2番目の引数より小さいか、等しいか、大きいかに応じて
-1
、0
、1
をそれぞれ返します。つまり
この手続きは比較器の比較手続きそのものです。
make-tree-map
の2番目の呼び出し形式も互換性のためのものです。
それぞれ2引数の2つの手続きを取り、
最初の手続きkey=?は、2つのキーが等しい場合にのみ真を返し、
2番目の手続きkey<?は、最初のキーが2番目のキーより前にある(小さい)場合にのみ
真を返すようにします。
tree-mapで使われている比較器を返します。
tree-mapのコピーを作り、それを返します。返された木に対す る破壊的操作は、元の木に影響を与えません。
tree-mapが要素を持たないなら#t
を、そうでなければ#f
を
返します。
tree-map内の要素の個数を返します。
tree-mapにキーkeyを持つエントリがあれば#t
を、
そうでなければ#f
を返します。
キーkeyをtree-mapから探します。見つかればkeyに対応する値を返 します。キーが見つからなかった場合、fallbackが与えられていればそれ を返し、そうでなければエラーを報告します。
キーkeyと対応する値valueをtree-mapに挿入します。もし、keyと、 key=?における意味で同じキーがすでに存在する場合、キーに対応する値 は新たな値に置き換えられます。
tree-mapからキーkeyを持つエントリを削除します。keyを持つエン
トリが実際に存在して削除された場合は#t
を、エントリが存在しなかっ
た場合は#f
を返します。
tree-map内の全てのエントリを削除します。
tree-map-push!
等のより一般的なバージョンです。木の探索が一度
しか行われないことを除いては、基本的に次のように動作します。
(let ((tmp (proc (tree-map-get tree-map key fallback)))) (tree-map-put! tree-map key tmp) tmp)
tree-map中の、キーkeyに対応する値にvalueをコンスし、
それをkey
に対する新たな値とします。もしkeyに対応する値がまだ無ければ、新た
なエントリが作成され、(list value)
がその値となります。
tree-map中のキーkeyに対応する値が存在し、かつペアであった場合 に、そのエントリの値を元の値のcdrで置き換え、元の値のcarを返します。 keyに対応する値が存在しないかペアではなかった場合、tree-mapは 変更されず、fallbackが与えられていればそれが返され、与えられていな ければエラーが報告されます。
それぞれ、tree-mapに含まれる最小および最大のキーを探索し、その
キーと値のペアを返します。tree-mapが空だった場合は#f
が返されます。
それぞれ、tree-mapに含まれる最小および最大のキーを探索し、そ
のエントリをtree-mapから削除したうえで、そのキーと値のペアを
返します。tree-mapが空だった場合は#f
が返されます。
tree-mapの各要素に対し、(key, value, seed) -> seed
の型を持つ
procを適用してゆきます。
tree-map-fold
とtree-map-fold-right
の違いは
fold
のfold-right
違いと同じ、すなわち
結合の方向にあります。
tree-map-fold: (proc Kn Vn (proc Kn-1 Vn-1 ... (proc K0 V0 seed))) tree-map-fold-right (proc K0 V0 (proc K1 V1 ... (proc Kn Vn seed)))
例:
(define tree (alist->tree-map '((3 . a) (7 . b) (5 . c)) = <)) (tree-map-fold tree list* '()) ⇒ (7 b 5 c 3 a) (tree-map-fold-right tree list* '()) ⇒ (3 a 5 c 7 b)
2引数を取る手続きprocを、tree-mapの各キーおよび値のペアに
対して呼び出し、結果をリストにして返します。
結果のリストは、キーの昇順に並んでいます。つまり、最小のキーとその値で呼び出した
procの結果が最初の要素に、最大のキーとその値で呼び出したprocの
結果が最後の要素になります。
(map
と同様、実際にprocが呼ばれる順序は保証されていません。
したがってprocは副作用の無いものにすべきです)。
2引数を取る手続きprocを、tree-mapの各キーおよび値のペアに対して、 キーの昇順に呼び出します。procは副作用のためだけに呼ばれ、結果は捨てられます。
これらの手続きは、probeに最も近いキーを持つエントリをtree-mapから
探します。そのようなエントリが見つかれば、該当するキーと値が2つの戻り値となります。
見つからない場合は、fallback-keyとfallback-valueが
2つの戻り値として返されます。それぞれの省略時の値は#f
です。
それぞれの手続きは異なった「最も近い」の基準を持っています。
tree-map-floor
はprobe以下で最大のキーを、
tree-map-ceiling
はprobe以上で最小のキーを、
tree-map-predecessor
はprobe未満で最大のキーを、
tree-map-successor
はprobeを越える最小のキーを探します。
tree-map-floor
等と同様ですが、見つかったエントリのキーのみを返します。
該当エントリが見つからない場合はfallback-keyの値(デフォルトは#f
)が
返されます。
tree-map-floor
等と同様ですが、見つかったエントリの値のみを返します。
該当エントリが見つからない場合はfallback-valueの値(デフォルトは#f
)が
返されます。
キーが指定された範囲に入っているようなキーと値のペアを生成するジェネレータを作って
返します (gauche.generator
- ジェネレータ参照)。
もしdescendingキーワード引数が#f
(デフォルト値)なら、ペアは
キーの昇順に生成されます。それが真の値なら、ペアはキーの降順に生成されます。
キーワード引数>
と>=
はキーの下限を指定します。前者は指定値を含み、
後者は含みません。両方指定された場合はどちらかひとつだけが有効です。
キーワード引数<
と<=
はキーの下限を指定します。前者は指定値を含み、
後者は含みません。両方指定された場合はどちらかひとつだけが有効です。
(define tm (alist->tree-map '((0 . a) (1 . b) (2 . c) (3 . d) (4 . e)) default-comparator)) (use gauche.generator) (generator->list (tree-map->generator/key-range tm :>= 1 :< 4)) ⇒ ((1 . b) (2 . c) (3 . d)) (generator->list (tree-map->generator/key-range tm :>= 1 :< 4 :descending #t)) ⇒ ((3 . d) (2 . c) (1 . b)) (generator->list (tree-map->generator/key-range tm :<= 2)) ⇒ ((0 . a) (1 . b) (2 . c)) (generator->list (tree-map->generator/key-range tm :> 2)) ⇒ ((3 . d) (4 . e))
それぞれ、tree-map内の全てのキーまたは値をリストにして返しま す。返されるリストの要素はキーの昇順に並んでいます。
tree-map含まれる要素を連想リストにして返します。返される連 想リストのキーは昇順に並んでいます。
comparatorまたはkey=?, key<? によって新たなtreemapを作成し、
連想リストalistに含まれる要素を追加した上で返します。
alistの各ペアのcarがキーに、cdrが値に使われます。
comparator, key=?, key<?
引数の意味は
make-tree-map
と同じです。
以下の二つの手続きは二つのツリーマップを比較しますが、見方が異なります。
二つのツリーマップを、エントリの集合として比較します。エントリの集合として見れば、 ツリーマップ間に半順序関係を定義できます。すなわち、全てのエントリが等しければ ツリーマップ同士も等しく、ツリーマップAがツリーマップBの真部分集合であれば AはBより小さい、とします。
tree-map1とtree-map2が等しければ0が、 tree-map1の方がtree-map2より小さければ-1が、 tree-map1の方がtree-map2より大きければ1が返されます。
どちらのツリーマップも相手の部分集合になっていない場合は、順序が決められません。 その場合、fallback引数が与えられていればその値が返され、 与えられていなければエラーが報告されます。
tree-map1とtree-map2の比較器はequal?
の意味で
等しくなければなりません。比較器については基本的な比較器を参照してください。
エントリは、それぞれのキーがツリーマップの比較器による比較で等しく、
かつ対応する値がvalue=?手続きによる比較で等しい場合にのみ等しいとみなされます。
value=?が省略された場合はequal?
が使われます。
(tree-map-compare-as-sets (alist->tree-map '((1 . a) (2 . b) (3 . c)) default-comparator) (alist->tree-map '((3 . c) (1 . a) (2 . b)) default-comparator)) ⇒ 0 (tree-map-compare-as-sets (alist->tree-map '((1 . a) (3 . c)) default-comparator) (alist->tree-map '((3 . c) (1 . a) (2 . b)) default-comparator)) ⇒ -1 (tree-map-compare-as-sets (alist->tree-map '((1 . a) (3 . c) (4 . d) (2 . b)) default-comparator) (alist->tree-map '((3 . c) (1 . a) (2 . b)) default-comparator)) ⇒ 1 (tree-map-compare-as-sets (alist->tree-map '((1 . a) (3 . c) (4 . d)) default-comparator) (alist->tree-map '((3 . c) (1 . a) (2 . b)) default-comparator)) ⇒ ERROR: tree-maps can't be ordered (tree-map-compare-as-sets (alist->tree-map '((1 . a) (3 . c) (4 . d)) default-comparator) (alist->tree-map '((3 . c) (1 . a) (2 . b)) default-comparator) eq? #f) ⇒ #f
二つのツリーマップを、キーの順序で並べられたエントリのシーケンスとして比較します。
両マップにキーが同じであるエントリがあった場合は、
対応する値同士をvalue-cmp比較器で比べます
(従って、value-cmpは比較述語を持っていなければなりません。)
value-cmpが省略された場合はdefault-comparator
が使われます。
tree-map1とtree-map2の比較器はequal?
の意味で
等しくなければなりません。比較器については基本的な比較器を参照してください。
tree-map1とtree-map2が等しければ0が、 tree-map1の方がtree-map2より小さければ-1が、 tree-map1の方がtree-map2より大きければ1が返されます。
tree-map-compare-as-sets
と異なり、
この手続きは比較器が同じであるようなツリーマップについて全順序関係を定義します。
(tree-map-compare-as-sequences (alist->tree-map '((1 . a) (3 . c)) default-comparator) (alist->tree-map '((3 . c) (2 . b)) default-comparator)) ⇒ -1 (tree-map-compare-as-sequences (alist->tree-map '((2 . b) (3 . d)) default-comparator) (alist->tree-map '((3 . c) (2 . b)) default-comparator)) ⇒ 1