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/bazLze 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: loadBNF:
<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
== bazPokud 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
== bazPokud číselná hodnota selektoru padne mimo hranice kolektoru, vrací pick hodnotu none:
>> length? blk
== 4
>> blk/7
== none
>> blk/-1
== noneFunkci path? použijeme k ověření, zda je daná hodnota typu path!.
>> path? 'foo/bar
== trueFunkce type? vrací datový typ dané hodnoty.
>> type? 'foo/bar
== path!