Skip to content

Latest commit

 

History

History
142 lines (103 loc) · 3.36 KB

function.adoc

File metadata and controls

142 lines (103 loc) · 3.36 KB

Datový typ function!

1. Úvodem

Hodnotami typu function! jsou uživatelsky definované funkce.

Typ function! je členem typesetů any-function! a default!

2. Vytvoření

Uživatelské funkce se vytvářejí za běhu programu pomocí make nebo s použitím func, has, does či function.

  • Skladba BNF:

    <function>      ::= make function! [<function-spec> <function-body>] |
                        func <function-spec> <function-body> |
                        has [<argument>*] <function-body> |
    					does <function-body> |
    					function <function-spec> <function-body>
    
    <function-spec> ::= [<docstring>° <argument-spec> <return-spec>°]
    
    <docstring>     ::= <string>
    
    <argument-spec> ::= <argument>* <optional-arguments>*
    
    <argument>      ::= <argument-name> <argument-doc>° |
                        <argument-name> [<typeset-element>*] <argument-doc>°
    
    <argument-name> ::= <word-literal> | '<word-literal> | :<word-literal>
    
    <argument-doc>  ::= <string>
    
    <optional-arguments>  ::= <function-refinement> <argument-doc>° <argument>*
    
    <function-refinement> ::= /<word-literal>
    
    <return-spec>   ::= return: [<typeset-element>*] <return-doc>°
    
    <return-doc>    ::= <string>
    
    <function-body> ::= <block>

Příklady

  • Make

    >> double: make function! [[n [number!]] [n * 2]]
    == func [n [number!]][n * 2]
  • Func je ekvivalentní k make function!.

    >> double: func [n [number!]][n * 2]
    == func [n [number!]][n * 2]

    Slova za volitelným upřesněním (refinement) /local budou považována za lokální pro tělo funkce.

  • Has je ekvivalentní k func s upřeněním /local.

    >> fourty-two: has [value][value: 42 print value]
    == func [/local value][value: 42 print value]
  • Does je ekvivalentní k func bez argumentů.

    >> h: does [print "Hi"]
    == func [][print "Hi"]
  • Function je ekvivalentní k func avšak všechny hodnoty typu set-word! a slova foreach, remove-each a repeat budou považována za lokální v těle funkce.

    >> double: function [n [number!]][val: "Result is" print [val n * 2]]
    == func [n [number!] /local val][val: "Result is" print [val n * 2]]
    
    >> double 9
    Result is 18

    Slovo val zůstává pro funkci lokální a není dostupné ze základního kontextu system/words.

    >> val
    *** Script Error: val has no value
    *** Where: catch
    *** Stack:

    Slova za volitelným upřesněním /extern jsou dostupná ze základního kontextu system/words.

    >> double: function [n [number!] /extern val][val: "Result is" print [val n * 2]
    == func [n [number!]][val: "Result is" print [val n * 2]]
    
    >> double 9
    Result is 18
    
    >> val
    == "Result is"

3. Konverze

Pro hodnoty typu function! nejsou podporovány žádné koverze.

4. Komparace

Hodnoty funkce lze porovnávat z hlediska stejnosti a rovnosti pomocí dotazů same?, ==, equal?, strict-equal?, not-equal?, <>.

5. Testování hodnot

K ověření zda zda posuzovaná hodnota je typu function! použijeme dotaz function?.

>> function? :double
== true

Typ hodnoty zjistíme dotazem type?.

>> type? :double
== function!

6. Předdefinovaná slova

Výpis předdefinovaných hodnot typu function! lze získat příkazem help function! v konzole Redu.