Struktura typu map! reprezentuje asociativní výčet (array) dvojic key/value. Poskytuje rychlý přístup pro čtení s interním použitím hashtable. Na rozdíl od datového typu hash! nepatří map! do skupiny series!, tudíž nezná koncept pozic (nemá interní iterátor). Koncepčně leží typ map! mezi datovými typy hash! a object!. Uživatelsky připomíná slovník.
#[<key> <value>...] <key> : hashovaný klíč, akceptované typy jsou: scalar!, all-word!, any-string! <value> : hodnota typu any-type!
Příklad:
#[a: 1 b: 2]
== #[
a: 1
b: 2 ]
make map! <spec> <spec> : blok párů `key/value` nebo jedno celé číslo.
Je-li argumentem spec celé číslo, vytvoří se prázdný objekt map! s přednastaveným počtem slotů (obvykle za účelem dynamického zaplnění mapy).
make map! 10 == #[]
|
Note
|
|
Příklad:
make map! [a 1 'b 2 "c" 3]
== #[
a: 1
b: 2
"c" 3
]
Je-li klíč typu any-word, je v mapě kvůli lepší přehlednosti konvertován na typ set-word. Nicméně
lze pro klíč z praktických důvodů (jednodušší zápis, zejména u cest) použít prostý tvar slova místo typu set-word!.
Podobně reflektor keys-of (popsaný v sekci Reflexe níže) vrací words místo set-words, jelikož to zjednodušuje další zpracování - zejména srovnávací (matching) operace jsou snadnější se slovy než se set-words.
|
Note
|
|
Jiný způsob vytvoření nové mapy je s použitím akce copy u mapy existující.
S použitím cesty:
<map>/<key> get '<map>/<key> <map>: slovo, odkazující na objekt typu map! <key>: slovo, označující klíč
S použitím funkce select:
select <map> <'key>
Všechny tyto přístupy jsou case-insensitive. Case-sensitive vyhledání zařídíme upřesněním /case.
get/case '<map>/<key> select/case <map> <key>
Pokus o přístup k nedefinovanému klíči způsobí:
-
vytvoření chybového hlášení, je-li použita skladba cesty
-
návrat hodnoty
none, je-li použita funkceselect.
Příklady:
m: #[Ab: 2 aB: 5 ab: 10] m/ab == 2 select m 'aB == 2 get/case 'm/aB == 5 select/case m 'ab == 10 select m 'x == none
S použitím cesty:
<map>/<key>: <value> set '<map>/<key> <value> <map> : word referring to a map! value <key> : word key to select a value in the map <value> : any value
Úprava dvojice key/value:
put <map> <key> <value> <map> : map value <key> : any valid key value to select a value in the map
Hromadné změny:
extend <map> <spec> <map> : map value <spec> : block of name/value pairs (one or more pairs)
Všechny tyto zápisy jsou case-insensitive. Pro case-sensitive vyhledání je potřebné použít upřesnění /case, kde je to možné:
set/case '<map>/<key> <value> put/case <map> <key> <value> extend/case <map> <spec>
Nativní funkce extend může přijmout více klíčů najednou, takže je vhodná pro hromadné změny.
m: make map! 5
== #[]
extend m [a: 5 b: none!]
== #[
a: 5 ; type integer!
b: none! ; type word!
]
|
Note
|
|
Příklady:
m: #[Ab: 2 aB: 5 ab: 10]
m/ab: 3
== 3
m
== #[
Ab: 3
aB: 5
ab: 10
]
put m 'aB "hello"
m
== #[
Ab: "hello"
aB: 5
ab: 10
]
set/case 'm/aB 0
m
== #[
Ab: "hello"
aB: 0
ab: 10
]
set/case 'm/ab 192.168.0.1
m
== #[
Ab: "hello"
aB: 0
ab: 192.168.0.1
]
m: #[%cities.red 10]
extend m [%cities.red 99 %countries.red 7 %states.red 27]
m
== #[
%cities.red 99
%countries.red 7
%states.red 27
]
Dvojici key/value jednoduše z mapy vymažeme příkazem remove/key. Smažou se všechny klíče, počínaje zadaným a vrátí se jeho hodnota. Vyhledávání je vždy case-sensitive.
Příklad:
m: #[a: 1 b 2 "c" 3 d: 99]
== #[
a: 1
b: 2
"c" 3
d: 99
]
remove/key m 'b
== #[a: 1 "c" 3 d: 99]
Je rovněž možné smazat všechny klíče najednou akcí clear:
clear #[a 1 b 2 c 3] == #[]
Pro práci s mapou (slovníkem) se s výhodou použijí další pomocné funkce:
-
findověří přítomnost klíče v mapě a vrátítrue, byl-li nalezen, v opačném případě vrátínone. Pro case-sensitive srovnávání použijte upřesnění/case.find #[a 123 b 456] 'b == b
find #[a 123 A 456] 'A == a
find/case #[a 123 A 456] 'A == A
-
length?vrací počet dvojickey/valuev mapě.length? #[a 123 b 456] == 2
-
keys-ofvrací seznam klíčů v mapě formou bloku (set-words are converted to words).keys-of #[a: 123 b: 456] == [a b]
-
values-ofvrací seznam hodnot v mapě.values-of #[a: 123 b: 456] == [123 456]
-
body-ofvrací všechny dvojice key/value v mapě.body-of #[a: 123 b: 456] == [a: 123 b: 456]