Datový typ path!
reprezentuje řadu hodnot, oddělených lomítky (/
). Elementy této řady mohou být typu word!
, integer!
, get-word!
a paren!
.
Typ path!
je člen těchto typesetů: any-block!
, any-path!
, series!
Hodnoty typu path! mohou být vytvořeny literálovou syntaxí nebo při runtime použitím konstruktoru make
nebo konverzí to
.
>> 'foo/bar/baz
== foo/bar/baz
>> make path! [foo bar baz]
== foo/bar/baz
Lze vytvořit prázdnou cestu dané velikosti dodáním celočíselného argumentu funkci make
:
>> make path! 10
==
Konverze to
:
>> to path! "foo bar baz"
== foo/bar/baz
Caution
|
Je možné programově vytvořit hodnotu path! . která však neodpovídá lexikálním pravidlům literálové cesty:
|
>> mold to path! [a #[b: 2] c 1.2 /z]
== "a/#(^/ b: 2^/)/c/1.2//z"
>> load mold to path! [a #[b: 2] c 1.2 /z]
*** Syntax Error: invalid path! at "a/#( b: 2)/c/1.2//z"
*** Where: do
*** Stack: load
BNF:
<path-literal> ::= <path-head>/<selector>
<path-head> ::= <word-literal> | <path-literal>
<selector> ::= <integer> | <word-literal> | :<word-literal> | <paren>
Parse:
path: [word! some selector]
selector: [#"/" [integer! | word! | get-word! | paren!]]
Datové typy pro path-head: word! a path!
Cesty (paths) vedou ke vnořené hodnotě nebo k více specifickému chování při evokaci funkce. Musejí začínat slovem a hodnota, na níž slovo odkazuje, rozhoduje o způsobu vyhodnocení cesty.
-
Je-li tato hodnota funkcí, musejí být následující výrazy v cestě hodnoty typu
word!
. Tato slova jsou považována za upřesnění (refinement) ve volání funkce.
>> append/only [42][foo]
== [42 [foo]]
-
Pokud ve funkci neexistuje odpovídající refinement, je hlášena chyba:
>> append/xyz [42][foo]
*** Script Error: append has no refinement called xyz
*** Where: append
*** Stack:
Note
|
Cesty jsou aktivním typem a provádějí vyhodnocení uložených funkci. Hodnoty typu op se zatím nevyhodnocují.
|
>> f: does [42]
== func [][42]
>> insert b: [] :f
== []
>> b/1
== 42
-
Není-li hodnota funkcí, platí následující pravidla:
-
Je-li dalším výrazem v cestě slovo, je použito k výběru z hodnoty path-head. Hodnota path-head musí být typem, který podporuje funkci
select
(např.block!
,map!
neboobject!
).
-
Práci funkce select
demonstruje tato ukázka:
>> blk: [foo bar baz]
== [foo bar baz]
>> blk/bar
== baz
Pokud v části path-head zadaný selektor neexistuje, funkce select
vrátí none
:
>> blk/sheboygan
== none
-
Selektorem může být slovo nebo hodnota. Jeho konkretní interpretace závisí na datovém typu kořenové hodnoty. Slovo použité v selektoru je symbolické a nevyhodnocuje se. Pokud bychom výslovně stáli o hodnotu, kterou slovo případně reprezentuje, je nutné při evokaci použít formát
word!
,get-word!
neboparen!
:
>> my-block: [foo bar baz]
== [foo bar baz]
>> my-selector: 'bar ; vybírá následující člen bloku
== bar
>> my-block/bar ; evokace typem word!
== baz
>> my-block/:my-selector ; evokace typem get-word!
== baz
>> my-block/('bar) ; evokace typem paren!
== baz
-
Je-li selektorem celé číslo, použije se jako index pro vyjmutí (
pick
) elementu z kolektoru path-head. Hodnota path-head musí být typem, který podporuje akcipick
(např.series!
,tuple!
nebodate!
).
>> blk: [foo bar baz qux]
== [foo bar baz qux]
>> blk/3 ; vyjme třetí element kolektoru blk
== baz
Pokud číselná hodnota selektoru padne mimo hranice kolektoru, vrací pick
hodnotu none
:
>> length? blk
== 4
>> blk/7
== none
>> blk/-1
== none
Funkci path?
použijeme k ověření, zda je daná hodnota typu path!
.
>> path? 'foo/bar
== true
Funkce type?
vrací datový typ dané hodnoty.
>> type? 'foo/bar
== path!