Skip to content

Latest commit

 

History

History
197 lines (139 loc) · 4.83 KB

path.adoc

File metadata and controls

197 lines (139 loc) · 4.83 KB

Datový typ path!

1. Úvodem

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!

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

3. Literálová skladba

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!

Datové typy pro selector: integer!, word!, get-word! a paren!

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