Datový typ path!

1. Úvodem

Cesty (paths) jsou řady hodnot, oddělených lomítky (/). Tvoří uspořádanou řadu, jejíž elementy mohou být typu word!, integer!, get-word! a paren!.

Typ path! je člen těchto typesetů: any-block!, any-path!, series!

1.1. Varianty cest

Syntax

Datatype

Testing Values

Conversion

foo/bar

path!

path?

to path!

foo/bar:

set-path!

set-path?

to set-path!

:foo/bar

get-path!

get-path?

to get-path!

'foo/bar

lit-path!

lit-path?

to lit-path!

2. Vytvoření

Hodnoty typu path! mohou být vytvořeny literálovou syntaxí nebo při runtimu 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
It is possible to create path! values programmatically that do not conform to the lexical rules of a literal path.
>> 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

3. Literálová skladba

<path-literal> ::= <path-head>/<selector>
<path-head>    ::= <word-literal> | <path-literal>
<selector>     ::= <integer> | <word-literal> | :<word-literal> | <paren>

Z výše uvedených definic vyplývá, že:

4. Postup vyhodnocení

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
Při vyhledávání jednotlivých elementů cesty se interně používá funkce select. Tato funkce vyhledá zadaný element v řadě a je-li úspěšná, vrací bezprostředně následující element.

Není-li kořenová hodnota funkcí, platí následující pravidla:

  • Je-li dalším výrazem v cestě (selektorem) slovo, je použito k výběru z kolektoru path-head. Hodnota části path-head musí být typem, který podporuje funkci select (např. block!, map! nebo object!).

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! nebo paren!:

>> my-block: [foo bar baz]
== [foo bar baz]

>> my-selector: 'bar         ; obezlička
== bar

```red
>> my-block/bar              ; evokace typem word!
== baz

>> my-block/:my-selector ; evokace typem get-word! == baz

```red
>> my-block/('bar)           ; evokace typem paren!
== baz
  • Je-li selektorem celé číslo, použije se jako index pro vyzvednutí (pick) elementu z kolektoru path-head. Hodnota path-head musí být typem, který podporuje akci pick (např. series!, tuple! nebo date!).

>> 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

5. Testování hodnot

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!

6. Předdefinovaná slova

6.1. Funkce

any-block?, any-path?, path?, series?, to-path

results matching ""

    No results matching ""