Wikiknihy
cswikibooks
https://cs.wikibooks.org/wiki/Wikiknihy:Hlavn%C3%AD_strana
MediaWiki 1.47.0-wmf.22
first-letter
Média
Speciální
Diskuse
Uživatel
Diskuse s uživatelem
Wikiknihy
Diskuse k Wikiknihám
Soubor
Diskuse k souboru
MediaWiki
Diskuse k MediaWiki
Šablona
Diskuse k šabloně
Nápověda
Diskuse k nápovědě
Kategorie
Diskuse ke kategorii
TimedText
TimedText talk
Modul
Diskuse k modulu
Podujatie
Diskusia k podujatiu
Chemické pokusy/Katalytický rozklad peroxidu vodíku
0
8293
55465
55302
2026-10-03T20:27:25Z
Д.Ильин
11140
55465
wikitext
text/x-wiki
{{Chemický pokus|Jméno=Katalytický rozklad peroxidu vodíku}}
== Popis ==
[[w:Peroxid_vodíku|Peroxid vodíku]] (H<sub>2</sub>O<sub>2</sub>) je čirá kapalina bez zápachu, složená z vodíku a kyslíku. Využívá se v mnoha oblastech díky svým oxidačním a dezinfekčním vlastnostem. Ve zdravotnictví se používá jako dezinfekce drobných ran a vyskytuje se v malém množství i v některých přípravcích pro bělení zubů. V domácnostech se využívá jako čistící prostředek. Slouží i k odstraňování skvrn z textilu (např. krve nebo vína). V průmyslu se peroxid vodíku dá využít ve vyšší koncentraci při bělení papíru, nebo jako součást raketových paliv. V laboratořích se využívá jako silné oxidační činidlo.
[[w:Manganistan_draselný|Manganistan draselný]] (KMnO<sub>4</sub>) je tmavě fialová krystalická látka s výraznými oxidačními účinky. Využívá se především jako silné oxidační činidlo při demonstracích chemických reakcí. Využívá se také v lékařství jako zředěný roztok k dezinfekci kůže a k léčbě některých kožních onemocnění (např. plísní nebo ekzémů). V průmyslu má uplatnění například jako čistidlo odpadních vod.<gallery>
Soubor:Wasserstoffperoxid.svg|Peroxid vodíku
Soubor:KMnO4.svg|Manganistan draselný
Soubor:Manganistan draselný.JPG|Krystalický manganistan draselný
</gallery>
== Chemikálie ==
* peroxid vodíku (H<sub>2</sub>O<sub>2</sub>)
* manganistan draselný (KMnO<sub>4</sub>)
== Pomůcky ==
* [[Chemický slovník/Erlenmeyerova baňka|Erlenmayerova baňka]]
* [[Chemický slovník/Odměrný válec|odměrný válec]]
* lžička nebo špachtle
* ochranné brýle a laboratorní plášť
== Bezpečnostní informace ==
* peroxid vodíku je žíravina, která při kontaktu dokáže podráždit kůži, oči i sliznici, zvláště v koncentrovaném stavu (30 %) je velmi nebezpečný
* reakce je exotermní, proto je nutné brát ohled na to, že baňka bude velmi hřát v průběhu a těsně po dokončení pokusu, zároveň může kapalina z kádinky vystříknout
* místnost by měla být v průběhu pokusu větrána, případně by se mělo pracovat v digestoři
== Princip ==
Peroxid vodíku se za přítomnosti [[w:Katalyzátor|katalyzátoru]] rozkládá na vodu a kyslík. Katalyzátor - [[w:Oxid_manganičitý|oxid manganičitý]] (MnO<sub>2</sub>) reakci urychluje, ale sám se při ní nespotřebovává. Reakci lze popsat podle následující rovnice:
: 2 H<sub>2</sub>O<sub>2</sub> → O<sub>2</sub> + 2 H<sub>2</sub>O
Oxid manganičitý vzniká reakcí manganistanu draselného s peroxidem vodíku:
: 2 KMnO<sub>4</sub> + 3 H<sub>2</sub>O<sub>2</sub> → 2 MnO<sub>2</sub> + 2 H<sub>2</sub>O + 2 KOH + 3 O<sub>2</sub>
Manganistan zde vystupuje jako oxidační činidlo, sám se redukuje na oxid manganičitý a oxiduje peroxid na [[w:Kyslík|molekulární kyslík]].
== Postup ==
# Do baňky nalijeme asi 35 ml 30% roztoku peroxidu vodíku
# Pomocí špachtle přidáme malé množství manganistanu draselného
# Pozorujeme okamžitou exotermickou reakci, která je doprovázená šuměním, zbarvením kapaliny do fialova až černa a uvolňováním plynného kyslíku (O<sub>2</sub>)
# Po skončení reakce zlikvidujeme zbytky chemikálií.
== Galerie ==
<gallery>
Soubor:Perhydrol.jpg|Peroxid vodíku
Soubor:Potassium_permanganate_sample.jpg|Manganistan draselný
Soubor:Erlenmayerova_baňka_po_skončení_pokusu.jpg|Erlenmayerova baňka po skončení pokusu
Soubor:Catalytic_decomposition_of_hydrogen_peroxide.webm|Katalytický rozklad peroxidu vodíku
</gallery>
[[Kategorie:Chemické pokusy|{{#titleparts:{{PAGENAME}}||2}}]]
eosgfhwuvi50gcbeiihauncn03fcrn5
Syntaxe a sémantika programovacího jazyka Wolfram Language
0
9786
55449
2022-10-28T16:28:10Z
JozumBjada
11481
nová stránka: „{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}} '''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, n…“
55449
wikitext
text/x-wiki
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí písmen anglické abecedy. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Narozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že "vše je výraz"<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|"Datové struktury"]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Narozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek "a / b", kde je [[čitatel]] přímo nad [[jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|"Regulární výrazy"]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavadené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Narozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou můžou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích fukcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|"Funkce"]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako "větší než" (<code>></code>), "menší než" (<code><</code>), "větší nebo rovno" (<code>>=</code>) a "menší nebo rovno" (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah "rovná se" se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah "nerovná se" se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit chybové hlášení v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, narozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, narozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Narozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale narozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|"Nápověda"]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivaletní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[sudé číslo]] vrátí číslo o jedna menší, pro [[liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|"Přiřazení"]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|"Fibonacciho posloupnost"]] a [[Wolfram Language#Faktoriál|"Faktoriál"]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|"Cykly a jejich ekvivalenty"]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Narozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|"Pokročilá definice funkce"]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
bj6m5d0cdh2vbacpkna874f3d91xn3a
55450
55449
2022-10-31T06:34:48Z
David V.
8839
typografie, ČJ
55450
wikitext
text/x-wiki
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí písmen anglické abecedy. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavadené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou můžou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích fukcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit chybové hlášení v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivaletní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[sudé číslo]] vrátí číslo o jedna menší, pro [[liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
3as8hm8oqix68mfrf8jteb2cohlp1zx
55451
55450
2023-02-11T19:05:17Z
David V.
8839
ČJ
55451
wikitext
text/x-wiki
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí písmen anglické abecedy. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavadené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou můžou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích fukcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit chybové hlášení v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivalentní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[sudé číslo]] vrátí číslo o jedna menší, pro [[liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
gzq5cv9zx5qh2mzg05tdbgyjwal056g
55452
55451
2023-03-04T10:25:57Z
David V.
8839
ČJ
55452
wikitext
text/x-wiki
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí písmen anglické abecedy. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavadené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou můžou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích fukcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit chybové hlášení v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivalentní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[sudé číslo]] vrátí číslo o jedna menší, pro [[liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronnímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
27wdde762w6j1ni9yktpg0cm32za6ng
55453
55452
2023-03-13T16:29:05Z
Tomas62
3615
překlep
55453
wikitext
text/x-wiki
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí písmen anglické abecedy. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavedené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou můžou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích fukcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit chybové hlášení v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivalentní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[sudé číslo]] vrátí číslo o jedna menší, pro [[liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronnímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
9xboam5a1lq3kxlrdnl97n5025p4ozj
55454
55453
2023-08-22T12:29:02Z
David V.
8839
ČJ
55454
wikitext
text/x-wiki
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí písmen anglické abecedy. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavedené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou můžou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích funkcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit chybové hlášení v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivalentní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[sudé číslo]] vrátí číslo o jedna menší, pro [[liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronnímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
ql8qco2fmszo3v8wicrpimijwslgjvu
55455
55454
2023-10-05T05:17:31Z
Osidorobot
11744
typogr. (můžou->mohou) (náhrada 50× řidčejšího tvaru 'můžou' ukotvenější variantou) za použití [[Wikipedie:AutoWikiBrowser|AWB]]
55455
wikitext
text/x-wiki
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí písmen anglické abecedy. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavedené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou mohou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích funkcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit chybové hlášení v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivalentní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[sudé číslo]] vrátí číslo o jedna menší, pro [[liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronnímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
ntgcet2ksz87wmp0m2we7mwmu3vaih1
55456
55455
2023-10-16T12:44:04Z
PastoriBot
6673
[[WP:BOT|Bot]]: oprava přesměrování [[HTML]] [[liché číslo]] [[sudé číslo]]
55456
wikitext
text/x-wiki
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí písmen anglické abecedy. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[Hypertext Markup Language|HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavedené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou mohou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích funkcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit chybové hlášení v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[Sudá a lichá čísla|sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivalentní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[Sudá a lichá čísla|sudé číslo]] vrátí číslo o jedna menší, pro [[Sudá a lichá čísla|liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronnímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
8fr0pj7s771fokofw6tnbh2p59poho8
55457
55456
2024-04-21T07:42:12Z
Sudan2
11745
/* growthexperiments-addlink-summary-summary:2|0|0 */
55457
wikitext
text/x-wiki
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí [[Písmeno|písmen]] [[Anglická abeceda|anglické abecedy]]. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[Hypertext Markup Language|HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavedené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou mohou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích funkcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit chybové hlášení v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[Sudá a lichá čísla|sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivalentní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[Sudá a lichá čísla|sudé číslo]] vrátí číslo o jedna menší, pro [[Sudá a lichá čísla|liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronnímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
1muquaqqm57b27cgoegrjqb64113si1
55458
55457
2024-10-07T18:24:31Z
InternetArchiveBot
9248
Robot: Opravuji 1 zdrojů a označuji 0 zdrojů jako nefunkční) #IABot (v2.0.9.5
55458
wikitext
text/x-wiki
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí [[Písmeno|písmen]] [[Anglická abeceda|anglické abecedy]]. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[Hypertext Markup Language|HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavedené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou mohou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích funkcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit chybové hlášení v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[Sudá a lichá čísla|sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
| url archivu = https://web.archive.org/web/20221004001524/https://www.wolfram.com/language/for-experts/index.html.en
| datum archivace = 2022-10-04
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivalentní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[Sudá a lichá čísla|sudé číslo]] vrátí číslo o jedna menší, pro [[Sudá a lichá čísla|liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronnímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
b58cb5cnip7n1vumrx88xgka2268xj9
55459
55458
2024-12-21T19:24:20Z
Kolarp
4329
+Odkaz na "Uzávěr (programování)"
55459
wikitext
text/x-wiki
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí [[Písmeno|písmen]] [[Anglická abeceda|anglické abecedy]]. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[Hypertext Markup Language|HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavedené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou mohou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích funkcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit chybové hlášení v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[Sudá a lichá čísla|sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
| url archivu = https://web.archive.org/web/20221004001524/https://www.wolfram.com/language/for-experts/index.html.en
| datum archivace = 2022-10-04
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivalentní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[Sudá a lichá čísla|sudé číslo]] vrátí číslo o jedna menší, pro [[Sudá a lichá čísla|liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají [[uzávěr (programování)|uzávěry]] – funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronnímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
43nlznl67x9m2x5ra7aux3erpxe3211
55460
55459
2025-07-20T13:19:21Z
Draceane
2529
přesunout na Wikiknihy
55460
wikitext
text/x-wiki
{{Přesunout na Wikiknihy}}
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí [[Písmeno|písmen]] [[Anglická abeceda|anglické abecedy]]. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[Hypertext Markup Language|HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavedené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou mohou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích funkcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit chybové hlášení v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[Sudá a lichá čísla|sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
| url archivu = https://web.archive.org/web/20221004001524/https://www.wolfram.com/language/for-experts/index.html.en
| datum archivace = 2022-10-04
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivalentní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[Sudá a lichá čísla|sudé číslo]] vrátí číslo o jedna menší, pro [[Sudá a lichá čísla|liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají [[uzávěr (programování)|uzávěry]] – funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronnímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
611cmfyzauqe8pvcydk82zfoyegi0bb
55461
55460
2026-01-11T10:37:48Z
Harold
797
linkfix
55461
wikitext
text/x-wiki
{{Přesunout na Wikiknihy}}
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí [[Písmeno|písmen]] [[Anglická abeceda|anglické abecedy]]. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[Hypertext Markup Language|HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[Jmenovatel (zlomek)|jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavedené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou mohou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích funkcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit chybové hlášení v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[Sudá a lichá čísla|sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
| url archivu = https://web.archive.org/web/20221004001524/https://www.wolfram.com/language/for-experts/index.html.en
| datum archivace = 2022-10-04
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivalentní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[Sudá a lichá čísla|sudé číslo]] vrátí číslo o jedna menší, pro [[Sudá a lichá čísla|liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají [[uzávěr (programování)|uzávěry]] – funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronnímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
02vyu6pgvb6lbewiuna3xi4veesj95m
55462
55461
2026-05-26T05:28:00Z
Hroch09
11746
/* growthexperiments-addlink-summary-summary:1|0|2 */
55462
wikitext
text/x-wiki
{{Přesunout na Wikiknihy}}
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí [[Písmeno|písmen]] [[Anglická abeceda|anglické abecedy]]. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[Hypertext Markup Language|HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[Jmenovatel (zlomek)|jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavedené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou mohou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích funkcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit [[chybové hlášení]] v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[Sudá a lichá čísla|sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
| url archivu = https://web.archive.org/web/20221004001524/https://www.wolfram.com/language/for-experts/index.html.en
| datum archivace = 2022-10-04
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivalentní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[Sudá a lichá čísla|sudé číslo]] vrátí číslo o jedna menší, pro [[Sudá a lichá čísla|liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají [[uzávěr (programování)|uzávěry]] – funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronnímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
sktt080zsnz4vlnlha7rnbh0n0ztd1v
55463
55462
2026-10-03T17:18:21Z
Tchoř
696
naimportováno 14 revizí z [[:w:Syntaxe_a_sémantika_programovacího_jazyka_Wolfram_Language]]: spíš návod než encyklopedický článek, dlouhodobě neoponovaný návrh na přesun
55462
wikitext
text/x-wiki
{{Přesunout na Wikiknihy}}
{{Viz též|Wolfram Language|Mathematica|Srovnání Pythonu a Wolfram Language}}
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí [[Písmeno|písmen]] [[Anglická abeceda|anglické abecedy]]. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[Hypertext Markup Language|HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[Jmenovatel (zlomek)|jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavedené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou mohou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích funkcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit [[chybové hlášení]] v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[Sudá a lichá čísla|sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
| url archivu = https://web.archive.org/web/20221004001524/https://www.wolfram.com/language/for-experts/index.html.en
| datum archivace = 2022-10-04
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivalentní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[Sudá a lichá čísla|sudé číslo]] vrátí číslo o jedna menší, pro [[Sudá a lichá čísla|liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají [[uzávěr (programování)|uzávěry]] – funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronnímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
=== Související články ===
* [[Wolfram Language]]
* [[Mathematica]]
* [[Srovnání Pythonu a Wolfram Language]]
* [[Funkcionální programování]]
* [[Symbolické programování]]
{{Autoritní data}}
[[Kategorie:Matematický software]]
[[Kategorie:Počítačová algebra]]
[[Kategorie:Funkcionální jazyky]]
sktt080zsnz4vlnlha7rnbh0n0ztd1v
55464
55463
2026-10-03T17:19:44Z
Tchoř
696
nejzákladnější úprava po importu
55464
wikitext
text/x-wiki
'''Syntaxe a [[Sémantika programovacích jazyků|sémantika]] programovacího jazyka Wolfram Language''' představuje sadu pravidel, podle nichž lze psát [[Zdrojový kód|kód]] v [[programovací jazyk|programovacím jazyce]] [[Wolfram Language]] (dále jen WL), spolu s tím, jak je tento kód interpretován. Tato stránka přináší podrobnější přehled základní funkcionality, než jak je podán v článku [[Wolfram Language]]. Pokud není vysloveně uvedeno jinak, je v následujícím použita verze WL 13.0.0.
[[Syntaxe (programovací jazyk)|Syntaxe]] WL v mnohém připomíná syntaxi jiných programovacích jazyků jako [[C (programovací jazyk)|C]] či [[Java (programovací jazyk)|Java]]. WL je [[case sensitive]], přičemž názvy funkcí a přednastavených konstant se řídí konvencí [[CamelCase]]. Počáteční písmeno je tedy velké a pokud se název skládá z několika slov, tak je velké i počáteční písmeno každého slova<ref>{{Citace elektronického periodika
| titul = Some General Notations and Conventions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/SomeGeneralNotationsAndConventions.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. <code>ListPlot</code>, <code>StringJoin</code> či <code>FunctionCompile</code>. Pojmenovávání předdefinovaných funkcí a proměnných je ve WL poněkud rozvláčné, srovnej např. funkce <code>SingularValueDecomposition</code> a <code>StandardDeviation</code>, jejichž varianty v [[MATLAB]]u zní <code>svd</code> a <code>std</code>. Navíc je obecně snaha vývojářů WL nečlenit funkce do balíčků, které by bylo potřeba před použitím importovat, ale téměř všechny funkce jazyka jsou k dispozici přímo v hlavním jmenném prostoru.
Každá funkce či konstrukt má ve WL jméno, jež často odpovídá jemu anglickému názvu. Některé z nich lze pak reprezentovat speciálními znaky, známými z jiných jazyků. Například [[sčítání]] se provádí znakem <code>+</code>, [[násobení]] znakem <code>*</code>, [[Textový řetězec|skládání řetězců]] znakem <code><></code>, apod. Této reprezentaci se říká <code>InputForm</code>. Tyto operace lze nicméně vyjádřit i pomocí [[Písmeno|písmen]] [[Anglická abeceda|anglické abecedy]]. Například výraz <code>a + b</code> lze zapsat též jako <code>Plus[a, b]</code>, výraz <code>a * b</code> jako <code>Times[a, b]</code>, výraz <code>"retezec 1"<>"retezec 2"</code> jako <code>StringJoin["retezec 1", "retezec 2"]</code> atd. Tato reprezentace se jmenuje <code>FullForm</code><ref>{{Citace elektronického periodika
| titul = Forms of Input and Output—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12368
| datum přístupu = 2022-10-28
}}</ref>. V následujícím bude často k dané funkci či operátoru zmíněna nejen obvyklá syntaxe, ale právě i její <code>FullForm</code>.
== Základy ==
=== Identifikátory ===
Vývojář WL nenabízí veřejnou specifikaci toho, co může a co nemůže být [[identifikátor]]. Obecně ale nemůže být prvním znakem názvu [[číslice]] a podporována je pro znaky celá sada [[Unicode]]<ref>{{Citace elektronického periodika
| titul = Use the Full Range of Unicode Characters: New in Wolfram Language 12
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/12/networking-and-system-operations/use-the-full-range-of-unicode-characters.html.en
| jazyk = en
| datum přístupu = 2022-09-20
}}</ref> včetně znaků [[česká abeceda|české abecedy]]. Interní konstanty a proměnné začínají konvenčně znakem [[dolar]]u <code>$</code>, viz např. <code>$Output</code> či <code>$FontFamilies</code>.
Na rozdíl od některých populárních [[programovací jazyk|jazyků]] nelze použít [[podtržítko]] jako součást jména proměnných či funkcí, protože je mu vyhrazena funkce ve vzorech. Pro mnoho znaků existuje ve WL jméno, které se vkládá do konstruktu <code>\[...]</code>, např. <code><math>\to</math></code> lze získat zapsáním <code>\[RightArrow]</code>. Pro mnoho znaků, jako třeba písmena [[alfabeta|alfabety]], též existuje ''alias'', to jest zkratka, kterou lze zapsat mezi dvěma stisknutími klávesy {{Klávesa|ESC}}, aby se vytvořil odpovídající znak. Znaky lze vkládat i pomocí jejich jmen v jazyce [[Hypertext Markup Language|HTML]] či systému [[TeX]] způsobem podobný aliasům, a tak např. {{Klávesa|ESC}} <code>á</code> {{Klávesa|ESC}} vrátí <code>á</code>, {{Klávesa|ESC}} <code>\infty</code> {{Klávesa|ESC}} vrátí <code><math>\infty</math></code> apod.<ref>{{Citace elektronického periodika
| titul = Mathematical and Other Notation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/MathematicalAndOtherNotation.html.en
| datum přístupu = 2022-09-18
}}</ref> Konečně, libovolný znak Unicode lze vložit vypsáním <code>\:nnnn</code> či <code>\|nnnnnn</code>, kde <code>nnnn</code> či <code>nnnnnn</code> je [[hexadecimální]] [[kódový bod]] daného znaku<ref name="input_syntax">{{Citace elektronického periodika
| titul = Input Syntax—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/InputSyntax.html.en
| datum přístupu = 2022-09-18
}}</ref>.
=== Komentáře ===
Na rozdíl od některých jazyků jako např. [[C++]] či [[Java (programovací jazyk)|Java]] existuje ve WL jen jeden druh [[Komentář (programování)|komentářů]], kde je text komentáře uzavřen mezi kulaté závorky s hvězdičkami<ref name="docu">{{Citace elektronického periodika
| titul = Documentation Constructs—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#4287
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
a = 1; (* toto je komentář *)
(* komentář může přesahovat
několik řádek *)
b = a + 2;
</syntaxhighlight>
=== Předešlé výstupy ===
Jádro WL udržuje přehled o výsledcích všech předešlých příkazů odeslaných uživatelem z [[Mathematica#Jádro a front end|front endu]]{{Poznámka|Přísně vzato je počet posledních výstupů udržovaných v paměti omezen interním parametrem <code>$HistoryLength</code>, jehož výchozí hodnota je nastavena na <code>Infinity</code>, tedy nekonečno.}}. Vyvolat hodnotu posledního příkazu lze symbolem [[procento|procenta]]<ref>{{Citace elektronického periodika
| titul = Use Previous Outputs in a Computation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/UsePreviousOutputsInAComputation.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tak například volání
<syntaxhighlight lang="Mathematica">
1+2;
%
</syntaxhighlight>
vrátí hodnotu 3. Chceme-li vyvolat předposlední výsledek, napíšeme znak procent dvakrát (<code>%%</code>); pro výsledek třetí od konce napíšeme tento znak třikrát atd. Každému výstupu je navíc přiřazeno číslo, které je pro daný běh jádra jedinečné a tak pokud víme číslo daného výstupu, řekněme 51, lze odpovídající výstup vyvolat napsáním <code>%51</code>.
=== Nápověda ===
Krátkou [[Počítačová nápověda|nápovědu]] k danému symbolu lze programově zobrazit v editoru napsáním [[otazník]]u na začátku řádku<ref name="docu" />, následovaným jménem symbolu. Krátký popis funkce [[sinus]] tak lze obdržet voláním:
<syntaxhighlight lang="Mathematica">
?Sin
</syntaxhighlight>
Pokud místo jednoho otazníku použijeme otazníky dva, obržíme detailnější nápovědu (<code>??Sin</code>)<ref>{{Citace elektronického periodika
| titul = Information—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Information.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Plnou [[Dokumentace k softwaru|dokumentaci]] pak lze v editoru vyvolat stisknutím klávesy {{Klávesa|F1}} ve chvíli, kde se [[kurzor]] nachází kdekoli ve jméně dotyčného symbolu.}}. Programové volání nápovědy lze rozšířit o [[žolíkový znak|žolíkové znaky]], kde <code>*</code> označuje libovolný počet libovolných znaků a <code>@</code> označuje libovolné malé písmeno. Tak například volání <code>?P*i</code> vrátí ve verzi 13.1.0 dva nálezy a sice <code>Pi</code> a <code>PrimePi</code>. Hledání lze tímto způsobem dále rozšířit na celé [[jmenný prostor|jmenné prostory]]. K vypsání všech symbolů definovaných ve jmenném prostoru (kontextu) <code>Global</code> stačí napsat<ref>{{Citace elektronického periodika
| titul = Find All Defined Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/FindAllDefinedFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
?Global`*
</syntaxhighlight>
== Datové typy ==
Jedním za základních designových principů WL je ten, že „vše je výraz“<ref>{{Citace elektronického periodika
| titul = Everything Is an Expression—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#4715
| datum přístupu = 2022-10-28
}}</ref>. [[Výraz|Výraz]], anglicky ''expression'', je buď atomární, viz níže, anebo normální, a pak má obecný tvar
<syntaxhighlight lang="Mathematica">
hlava[arg1, arg2, ...]
</syntaxhighlight>
kde <code>hlava</code> je hlavička výrazu, jíž lze dostat voláním funkce <code>Head</code>, a kde za hlavičkou následuje v hranatých závorkách nula či více výrazů oddělených čárkami. Tento obecný tvar sledují konstrukty typu <code>If</code> či <code>For</code>, volání funkcí, specifikace stylu apod. Hlavička samotná může být buď symbol, např. název funkce, anebo další výraz. Takovým případem může být např. výraz <code>(#&)[x]</code>, který má za hlavičku ryzí funkci <code>#&</code>, jež je samotná specifikována interně výrazem <code>Function[Slot[1]]</code>.
Dokonce i zápis tvaru <code>něco; něco2; něco3</code> je vyhodnocen jako výraz a sice výraz tvaru <code>CompoundExpression[něco, něco2, něco3]</code><ref>{{Citace elektronického periodika
| titul = CompoundExpression—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/CompoundExpression.html.en
| datum přístupu = 2022-10-28
}}</ref>. Výrazy lze do sebe vnořovat a vytvářet tak strukturovaná data a kód. Podvýraz na jisté úrovni vnoření lze získat pomocí funkce <code>Level</code>. Rozvětvení pomyslného stromu vnořených výrazů lze kvantifikovat pomocí funkce <code>LeafCount</code>. Jisté konstrukty, jako čísla či řetězce, jsou považovány za atomární{{Poznámka|Volání funkce <code>AtomQ</code> na takovéto konstrukty vrátí <code>True</code>. Viz též oddíl [[Wolfram Language#Vše je výraz|"Vše je výraz"]] v článku [[Wolfram Language]].}} a stojí na posledním stupínku vnoření. Tyto jsou představeny v sekcích níže. Viz též následující oddíl [[#Datové struktury|„Datové struktury“]].
=== Symboly ===
Jedním ze základních typů ve WL jsou symboly, to jest výrazy s hlavičkou <code>Symbol</code><ref>{{Citace elektronického periodika
| titul = Symbol—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Symbol.html.en
| datum přístupu = 2022-10-26
}}</ref>. Funkce (kromě těch ryzích), předdefinované konstanty atd. jsou symboly. Na rozdíl od jiných jazyků jako [[C (programovací jazyk)|C]] či [[Python]]<ref>{{Citace elektronického periodika
| titul = 3. An Informal Introduction to Python — Python 3.10.7 documentation
| periodikum = docs.python.org
| url = https://docs.python.org/3/tutorial/introduction.html#Numbers
| datum přístupu = 2022-09-26
}}</ref> nejen že nemusí být proměnná [[inicializace|inicializována]], ale nemusí mít ani přiřazenu žádnou hodnotu, a tak například následující vstupní kód je bez problémů ve WL interpretován
<syntaxhighlight lang="Mathematica">
x
</syntaxhighlight>
Dokud není do proměnné uložena konkrétní hodnota, tak se tato chová jako [[symbolická proměnná]], kterou lze využít pro [[Symbolický výpočet|symbolické výpočty]]{{Poznámka|Přiřazení hodnoty do proměnné lze zamezit buď použitím funkce <code>Protect</code> či použitím formálních proměnných vkládaných zápisy <code>\[FormalA]</code>, <code>\[FormalB]</code> atd.}}, a tak např.
<syntaxhighlight lang="Mathematica">
y = x + 2;
y^2 (* vrátí: (2 + x)^2 *)
Expand[y^2] (* vrátí: 4 + 4 x + x^2 *)
</syntaxhighlight>
kde funkce <code>Expand</code> rozepisuje mocniny výrazů do jednotlivých členů.
Chceme-li vymazat hodnotu proměnné <code>var</code>, lze toto učinit buď zápisem <code>x = .</code>, či voláním <code>Clear[x]</code><ref>{{Citace elektronického periodika
| titul = Clear Definitions for Symbols and Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/ClearDefinitionsForSymbolsAndFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Jsou-li k danému symbolu přiřazeny například dodatečné volby či atributy, jsou tyto při volání funkce <code>Clear</code> ponechány. Pro smazání jak hodnot, tak těchto dodatečných metadat, lze použít funkci <code>ClearAll</code>.}}. Tento přístup pouze smaže hodnotu proměnné, ponechá nicméně její jméno k dispozici výpočetnímu jádru. Pokud chceme proměnnou vyjmout úplně, lze toto provést funkcí <code>Remove</code>. Název symbolu nemůže mj. začínat [[číslice|číslicí]], nesmí obsahovat [[podtržítko|podtržítka]], může ale např. obsahovat znaky [[česká abeceda|české abecedy]].
=== Čísla ===
WL má několik číselných [[datový typ|datových typů]], <code>Integer</code> odpovídá [[celé číslo|celým číslům]], <code>Rational</code> [[racionální číslo|racionálním číslům]], <code>Real</code> [[reálné číslo|číslům reálným]] a <code>Complex</code> [[komplexní číslo|číslům komplexním]]<ref>{{Citace elektronického periodika
| titul = Types of Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#31699
| datum přístupu = 2022-10-28
}}</ref>. Poslední dva typy jsou typy s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]]. Jakmile jsou vstupní hodnoty funkcí typu <code>Integer</code> či <code>Rational</code>, snaží se WL spočíst výsledek naprosto přesně, to jest s nekonečnou přesností. To ale může vést k neúměrně dlouhému výpočtu. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
x = 3; (* 3 je typu Integer *)
x^2 + Sqrt[x] (* vrátí 9 + Sqrt[3] *)
y = 3.; (* 3. je typu Real *)
y^2 + Sqrt[y] (* vrátí 10.7321 *)
</syntaxhighlight>
Vědecký zápis čísel pomocí [[mantisa|mantisy]] a [[Exponent (matematika)|exponentu]], který má v mnoha jazycích syntaxi ve stylu <code>12.34e3</code> se ve WL provede způsobem <code>12.34*^3</code>. Pokud je počáteční číslice [[desetinné číslo|desetinného čísla]] rovna nule, lze tuto vynechat a tedy <code>.1</code> je totéž co <code>0.1</code>. Čísla lze zadávat i v jiné než [[desítková soustava|desítkové soustavě]] (podporovány jsou soustavy o základu 2 až 36) a to tak, že se před číslo uvede základ soustavy následovaný dvěma [[Stříška (nediakritický znak)|stříškami]]<ref>{{Citace elektronického periodika
| titul = Digits in Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22276
| datum přístupu = 2022-10-28
}}</ref>: <code>2^^101</code> je binární zápis čísla 5, <code>16^^ff</code> je šestnáctkový zápis čísla 255 apod.
Přesné výrazy lze převést na [[Pohyblivá řádová čárka|floating-point]] výrazy voláním funkce <code>N</code>, kde lze jako druhý nepovinný parametr uvést přesnost výsledného výrazu. WL rozlišuje absolutní přesnost čísel (<code>Accuracy</code>) a relativní přesnost (<code>Precision</code>)<ref>{{Citace elektronického periodika
| titul = Numerical Precision—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#21155
| datum přístupu = 2022-10-28
}}</ref>. Při zápisu čísla lze <code>Accuracy</code> udat jako číslo za dvěma [[zpětný apostrof|zpětnými apostrofy]] <code>``</code>, <code>Precision</code> pak jako číslo za apostrofem jedním <code>`</code>:
<syntaxhighlight lang="Mathematica">
3.14``20 (* Accuracy je 20 *)
3.14`20 (* Precision je 20 *)
3.14 (* Accuracy a Precision mají výchozí hodnoty dané strojem, na kterém WL běží *)
3 (* Accuracy i Precision jsou nekonečné *)
N[(1 + Sqrt[2])/5] (* vrátí: 0.482843 *)
</syntaxhighlight>
Číslům s [[Pohyblivá řádová čárka|pohyblivou řádovou čárkou]] lze nastavit libovolně velkou přesnost<ref>{{Citace elektronického periodika
| titul = Arbitrary‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#19964
| datum přístupu = 2022-10-28
}}</ref>. Pokud tato nicméně překročí přesnost stroje, na kterém WL běží, je vyšší přesnosti interně docíleno softwarovými prostředky, což může velmi zpomalovat výpočetní jádro. Všechny dosud uvedené notace lze kombinovat a tak například zápis <code>2^^10011.1011`8*^3</code> označuje číslo <code>158.0</code>.
Ve WL je předdefinováno množství [[Konstanta (programování)|konstant]] jako ''nekonečno'' (<code>Infinity</code>), jež lze dostat například dělením nenulového čísla nulou, ''nerozhodnutelné'' (<code>Indeterminate</code>), jež lze dostat dělením nuly nulou, <code>$MachineEpsilon</code>, jež označuje nejmenší rozlišitelné číslo, <code>$MaxMachineNumber</code>, jež označuje největší reprezentovatelné [[Pohyblivá řádová čárka|floating-point]] číslo atd.<ref>{{Citace elektronického periodika
| titul = Indeterminate and Infinite Results—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#3815
| datum přístupu = 2022-10-28
}}</ref><ref>{{Citace elektronického periodika
| titul = Machine‐Precision Numbers—Numbers—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Numbers.html#22593
| datum přístupu = 2022-10-28
}}</ref> Podporováno je i mnoho matematických [[Konstanta|konstant]] jako číslo [[Pí (číslo)|pí]] (<code>Pi</code>), [[eulerovo číslo]] (<code>E</code>), [[zlatý řez]] (<code>GoldenRatio</code>), atd.<ref>{{Citace elektronického periodika
| titul = Mathematical Constants—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/MathematicalConstants.html.en
| datum přístupu = 2022-10-28
}}</ref>
=== Řetězce ===
[[Textový řetězec|Textové řetězce]] jsou uvozeny dvojitými [[uvozovka]]mi, jednoduché uvozovky použít nelze. Podobně jako pro názvy proměnných a funkcí, i v řetězcích lze použít libovolné [[Unicode]] znaky včetně písmen české abecedy. Jsou podporovány některé typické [[escape sekvence]] jako [[uvozovky]] <code>\"</code>, [[odřádkování]] <code>\n</code> či [[tabulátor]] <code>\t</code><ref name="strings">{{Citace elektronického periodika
| titul = Strings and Characters—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/StringsAndCharacters.html.en
| datum přístupu = 2022-10-28
}}</ref>. Podporována je řada operací na řetězcích<ref>{{Citace elektronického periodika
| titul = String Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/StringManipulation.html.en
| datum přístupu = 2022-10-28
}}</ref>. Například zřetězení dvou (a více) textových řetězců <code>r1</code> a <code>r2</code> lze provést voláním <code>r1<>r2</code> či ekvivalentně <code>StringJoin[r1, r2]</code>. Získání znaku na daném místě řetězce lze provést funkcí <code>StringPart</code>. A tak například:
<syntaxhighlight lang="Mathematica">
"Příklad řetězce"
"Začátek"<>"Konec" (* vrátí: "ZačátekKonec" *)
"První řádek\nDruhý řádek" (* vypíše odřádkovaný řetězec *)
StringPart["abcd", 2] (* vrátí: "b" *)
</syntaxhighlight>
Obecný výraz lze přeměnit na řetězec voláním funkce <code>ToString</code>{{Poznámka|U objektů, které nelze přímo vyjádřit v textové podobě, se použije zástupný řetězec. Například volání funkce <code>ToString</code> an obrázek s hlavičkou <code>Image</code> vrátí řetězec <code>"-Image-"</code>.}}. Opačně, je-li v řetězci uložen platný kód, lze tento řetězec na kód převést funkcí <code>ToExpression</code><ref>{{Citace elektronického periodika
| titul = Converting between Strings, Boxes, and Expressions—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#6072
| datum přístupu = 2022-10-28
}}</ref>. Řetězce lze vypisovat pomocí funkce <code>Print</code>, která přijímá i neřetězcové výrazy, na něž tedy není třeba volat zvlášť <code>ToString</code>, přičemž tyto výrazy jsou vykresleny ve své původní formě. Chceme-li do řetězce dosadit parametry, lze buď použít funkci <code>StringForm</code> nebo novější funkci <code>StringTemplate</code><ref>{{Citace elektronického periodika
| titul = Working with Templates—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/WorkingWithTemplates.html.en
| datum přístupu = 2022-10-28
}}</ref>, která nabízí širší možnosti za cenu složitějšího zápisu. Lze pak psát například:
<syntaxhighlight lang="Mathematica">
ToString[StringForm["Součtem `1` a `2` obržíme `3`.", 2, 3, 5]] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
StringTemplate["Součtem `1` a `2` obržíme `3`."][2, 3, 5] (* vrátí: "Součtem 2 a 3 obržíme 5." *)
</syntaxhighlight>
Na rozdíl od jiných jazyků jsou podporovány i složitější konstrukty uvnitř řetězců, které umožňují pokročilejší formátování výstupu. Například zlomek „a / b“, kde je [[čitatel]] přímo nad [[Jmenovatel (zlomek)|jmenovatel]]em tak, jak je běžné v matematické notaci, lze zapsat do řetězce jako <code>"\!\(\*FractionBox[\(a\), \(b\)]\)"</code><ref>{{Citace elektronického periodika
| titul = String Representation of Boxes—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#28564
| datum přístupu = 2022-10-28
}}</ref><ref name="input_syntax" />. Uživatel s touto nízkoúrovňovou reprezentací nicméně nepracuje, protože v editoru se zobrazí pouze samotný zlomek. Dále WL podporuje ''řetězcové vzory'' (angl. ''string patterns'')<ref name="string_patterns">{{Citace elektronického periodika
| titul = Working with String Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/WorkingWithStringPatternsOverview.html.en
| datum přístupu = 2022-10-28
}}</ref>, což jsou obdoby [[regulární výraz|regulárních výrazů]] z jiných jazyků, viz oddíl [[#Regulární výrazy|„Regulární výrazy“]].
== Datové struktury ==
Základní [[datová struktura|datovou strukturou]] ve WL je [[Pole (datová struktura)|pole]] představované konstruktem <code>List</code>, k níž se od verze 10.0 přidalo [[asociativní pole]] (hashovací tabulka) představované konstruktem <code>Association</code>. Oba jsou podrobně představeny níže. WL podporuje ale i další druhy datových struktur jako [[řídká matice|řídká pole]] (<code>SparseArray</code>), pole s dodatečnými [[symetrie|symetriemi]] (<code>SymmetrizedArray</code>), pole s [[fyzikální jednotka|fyzikálními jednotkami]] (<code>QuantityArray</code>), či řadu tradičních struktur<ref>{{Citace elektronického periodika
| titul = Data Structures—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/DataStructures.html.en
| datum přístupu = 2022-10-27
}}</ref>, jež lze obdržet jako speciální případ konstruktu <code>DataStructure</code>. Na rozdíl od některých jiných [[programovací jazyk|jazyků]] nemá WL datový typ odpovídající [[množina|množinám]], kam by šel daný prvek vložit pouze jednou.
=== List ===
Pole je [[datová struktura]], jejíž prvky mohou být různých typů — od čísel, přes řetězce, po obrázky či zvukové záznamy. Prvkem může být i další pole, čímž lze vytvářet vícerozměrná pole<ref>{{Citace elektronického periodika
| titul = Nested Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#15721
| datum přístupu = 2022-10-27
}}</ref>. Pole se zapisují pomocí [[složená závorka|složených závorek]] <code>{prvek1, prvek2, prvek3, ..., prvekN}</code>, kde jsou jednotlivé prvky odděleny [[Čárka (interpunkce)|čárkou]]<ref>{{Citace elektronického periodika
| titul = List ({...})—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/List.html.en
| datum přístupu = 2022-10-27
}}</ref>. Pole je ve WL představováno výrazem s hlavičkou <code>List</code>, znamenající anglicky ''seznam''. Dvojrozměrné pole celých čísel může vypadat třeba takto:
<syntaxhighlight lang="Mathematica">
p = {{5, 1, 3}, {7, 0}, {2, 1, 6, 8}, {-3, 1, 1}}
</syntaxhighlight>
Zdůrazněme, že počet prvků nemusí být v každém vnořeném poli stejný. Počet prvků lze zjistit příkazem <code>Length</code>. Je-li počet prvků v každém vnořeném poli shodný, lze tento počet pro každou dimenzi zjistit příkazem <code>Dimensions</code>.
Indexování pole se provádí zapsáním dvojitých [[hranatá závorka|hranatých závorek]], do kterých se uvede index, přičemž indexování probíhá od jedničky<ref>{{Citace elektronického periodika
| titul = Manipulating Elements of Lists—Manipulating Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingLists.html#32425
| datum přístupu = 2022-10-27
}}</ref>. Pro získání druhého vnořeného pole v poli <code>p</code> definovaném výše tak lze zapsat <code><nowiki>p[[2]]</nowiki></code>. Indexovat lze i od konce pomocí [[záporné číslo|záporných čísel]]. Poslední prvek tak lze obdržet voláním <code><nowiki>p[[-1]]</nowiki></code>, předposlední <code><nowiki>p[[-2]]</nowiki></code> atd. Chceme-li namísto jediného prvku získat rozsah prvků od indexu <code>i1</code> po index <code>i2</code>, stačí zapsat <code><nowiki>p[[i1;;i2]]</nowiki></code>, kde jsou mezi indexy vloženy dva [[středník]]y. Konstrukt <code><nowiki>p[[i1;;i2;;k]]</nowiki></code> vrátí pak každý <code>k</code>-tý prvek v daném rozsahu. Pokud namísto rozsahu chceme dostat jen několik vybraných prvků, lze tyto obdržet jediným voláním tvaru <code><nowiki>p[[{i1, i2, ..., ik}]]</nowiki></code>, kde jsou indexy jednotlivých prvků ohraničeny složenými závorkami. V případě dvourozměrných polí lze indexovat dvěma způsoby — buď stylem <code><nowiki>p[[i1]][[i2]]</nowiki></code>, nebo kompaktněji <code><nowiki>p[[i1, i2]]</nowiki></code>. Oba způsoby lze použít i pro vícerozměrná pole. Změnit hodnotu daného prvku pak lze přiřazením ve tvaru:
<syntaxhighlight lang="Mathematica">
p[[3, 2]] = 42;
</syntaxhighlight>
Takovéto přiřazení upravuje seznam ''in place''<ref>{{Citace elektronického periodika
| titul = Adding, Removing, and Modifying List Elements—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#288
| datum přístupu = 2022-10-27
}}</ref>.
Interně je pole reprezentováno dvěma různými způsoby v závislosti na typu dat, která obsahuje. V obecném případě obsahuje pole pouze adresy na jednotlivé části paměti, ve kterých jsou uloženy prvky samotné. Pokud je ale typ všech prvků (v jedno- i vícerozměrných polích) stejný a číselný a současně je počet prvků v každé dimenzi shodný, může WL pro zvýšení výkonu použít efektivnější reprezentaci označovanou jako <code>PackedArray</code><ref>{{Citace elektronického periodika
| titul = list manipulation - What is a Mathematica packed array?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/3496/what-is-a-mathematica-packed-array
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = PackedArrayQ—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/Developer/ref/PackedArrayQ.html.en
| datum přístupu = 2022-10-27
}}</ref>{{Poznámka|Hlavička struktury zůstává stále stejná a sice <code>List</code>, označení <code>PackedArray</code> je platné pouze pro vnitřní implementaci.}}, která je více podobná způsobu, jakým je pole reprezentováno např. v jazyce [[C (programovací jazyk)|C]] jako souvislý blok paměti.
Pole podporují operace jako [[řazení]] (<code>Sort</code>), vektorové operace jako [[vektorový součin]] (<code>Cross</code>) či množinové operace jako [[sjednocení]] (<code>Union</code>). Dvourozměrná pole lze interpretovat jako [[matice]] — v takových případech lze použít maticové operace jako [[maticový součin]] (<code>Dot[A, B]</code> pro matice <code>A</code> a <code>B</code>, popř. totéž zkráceně pomocí tečky <code>A.B</code>), [[determinant]] (<code>Det</code>), apod.<ref>{{Citace elektronického periodika
| titul = Linear Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/LinearAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>
=== Association ===
Asociativní pole jsou [[Immutable object|imutabilní datové struktury]]<ref>{{Citace elektronického periodika
| titul = Associations and immutability - Online Technical Discussion Groups—Wolfram Community
| periodikum = community.wolfram.com
| url = https://community.wolfram.com/groups/-/m/t/1184267
| jazyk = en-US
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = version 10 - How to make use of Associations?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/52393/how-to-make-use-of-associations
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> zavedené ve verzi 10.0 a jsou představována výrazem <code>Association[k1->h1, k2->h2, ..., kN->hN]</code> či ekvivalentně zápisem <code><|k1->h1, k2->h2, ..., kN->hN|></code>, kde <code>k1</code> atd. jsou klíče a <code>h1</code> atd. jsou jim odpovídající hodnoty. Za klíč může přitom sloužit libovolný výraz<ref>{{Citace elektronického periodika
| titul = Association (<nowiki><|...|></nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Association.html.en
| datum přístupu = 2022-10-27
}}</ref>. Seznam klíčů lze obdržet voláním funkce <code>Keys</code>, jim odpovídající hodnoty pak funkcí <code>Values</code>.
Pokud chceme dostat hodnotu pro klíč <code>k</code> v asociativním poli <code>a</code>, píšeme <code>a[k]</code> s jednoduchými hranatými závorkami<ref name="associations" />. Na rozdíl od jiných jazyků si v WL asociativní pole uchovává i informaci o pořadí svých prvků a tak na něj lze použít i indexování známé ze seznamů. Máme-li asociativní pole tvaru <code>a = <|"r"->3, "s"->5, "t"->7, "u"->9|></code>, lze hodnotu 7 obdržet buď voláním <code>a["t"]</code> či indexováním <code><nowiki>a[[3]]</nowiki></code>, protože je pár ("t", 7) třetím prvkem v asociativním poli <code>a</code>. Oba způsoby lze zkombinovat tak, že se pro indexování použije místo indexu samotný klíč, obalený do výrazu <code>Key</code>, a sice <code><nowiki>a[[Key["t"]]]</nowiki></code><ref>{{Citace elektronického periodika
| titul = Part (<nowiki>[[...]]</nowiki>)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Part.html.en
| datum přístupu = 2022-10-27
}}</ref>. Tento hybridní zápis je užitečný ve chvíli, kdy je asociativní pole prvkem nějakého seznamu a/nebo je hodnota pro daný klíč seznamem obsahující další prvky. Máme-li tedy například seznam tvaru:
<syntaxhighlight lang="Mathematica">
s = {3, 2, <|5->{8, "retez"}, "x"->42, y->Sin|>, "a"}
</syntaxhighlight>
lze hodnoty <code>"retez"</code> a <code>42</code> obdržet voláním
<syntaxhighlight lang="Mathematica">
s[[3, Key[5], 2]] (* vrátí "retez" *)
s[[3, "x"]] (* vrátí 42 *)
</syntaxhighlight>
V posledním řádku je využit fakt, že pokud je klíčem [[textový řetězec|řetězec]], lze hlavičku <code>Key</code> vynechat. Asociativní pole nepodporují jen <code>Rule</code>, ale i odložené <code>RuleDelayed</code>, kterýžto rozdíl se projeví například při použití funkcí jako <code>RandomReal</code>:{{Poznámka|Konkrétní navrácené hodnoty jsou mohou lišit od níže vypsaných.}}
<syntaxhighlight lang="Mathematica">
a = <|k:>RandomReal[]|>;
a[k] (* vrátí 0.778739 *)
a[k] (* vrátí 0.003326 *)
</syntaxhighlight>
Asociativní pole lze kromě manuálního vypsání vytvořit různými způsoby<ref name="associations">{{Citace elektronického periodika
| titul = Associations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Associations.html.en
| datum přístupu = 2022-10-27
}}</ref>. Máme-li například seznam výrazů <code>{e1, ..., eN}</code>, pro něž chceme spočíst nějakou vlastnost a výsledná data pak uložit do asociativního pole, lze použít funkci <code>AssociationMap</code>, která vezme jistou funkci <code>f</code> a tu aplikuje zvlášť na každý výraz. Výsledkem je pak asociativní pole tvaru <code><|e1->f[e1], ..., eN->f[eN]|></code>, kde klíče jsou původními výrazy a jim odpovídající hodnoty jsou návratové hodnoty funkce <code>f</code>. Podobně, máme-li seznam klíčů <code>{k1, ..., kN}</code> a zvlášť seznam hodnot <code>{h1, ..., hN}</code>, lze tyto přetvořit do asociativního pole voláním ve tvaru <code>AssociationThread[{k1, ..., kN} -> {h1, ..., hN}]</code>, jež vrátí výraz <code><|k1->h1, ..., kN->hN|></code>.
Obyčejně jsou funkce aplikovány na hodnoty asociativního pole, klíče jsou přeskakovány. Pokud chceme aplikovat danou funkci jen na klíče, lze toto učinit pomocí funkce <code>KeyMap</code>. Chceme-li manipulovat s celým párem (klíč, hodnota), lze použít funkci <code>KeyValueMap</code>. V ryzích funkcích lze navíc místo pozičního slotu použít slot pojmenovaný po daném klíči<ref name="func" />. Uvažme například seznam asociativních polí <code>{a1, a2, ..., aN}</code>, z nichž každé obsahuje klíč <code>"klic"</code>, kde naším úkolem je získat seznam hodnot odpovídajících tomuto klíči. Toto lze učinit kódem <code>#klic & /@ {a1, a2, ..., aN}</code>, kde <code>#klic</code> je slot ryzí funkce.
Asociativní pole <code><|k1->h1, k2->h2, ..., kN->hN|></code> může svým zápisem velmi připomínat seznam <code>{k1->h1, k2->h2, ..., kN->hN}</code>, jehož prvky jsou výrazy <code>Rule</code> tvaru <code>klič->hodnota</code>. Takovýto seznam nicméně nepodporuje vyhledání hodnoty pomocí jejího klíče. Chování asociativního pole lze do jisté míry emulovat použitím ''indexovaných proměnných'' (angl. ''indexed variable'')<ref>{{Citace elektronického periodika
| titul = Making Definitions for Indexed Objects—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#24351
| datum přístupu = 2022-10-27
}}</ref>, což jsou proměnné, pro něž jsou definovány výrazu tvaru <code>proměnná[klíč] = hodnota</code>; např.:
<syntaxhighlight lang="Mathematica">
a[1] = foo;
a["asdf"] = bar;
</syntaxhighlight>
V tomto případě nemá symbol <code>a</code> přiřazenu žádnou hodnotu. Hodnotu mají přiřazenu jen výrazy <code>a[1]</code> a <code>a["asdf"]</code>.
== Operátory ==
=== Aritmetika ===
WL podporuje tradiční [[aritmetické operace]] s čísly<ref>{{Citace elektronického periodika
| titul = Arithmetic Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ArithmeticFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref> jako [[sčítání]] (<code>a + b</code>), [[odčítání]] (<code>a - b</code>), [[násobení]] (<code>a * b</code>), [[dělení]] (<code>a / b</code>), spolu s unárními operaci ve stylu jazyka [[C (programovací jazyk)|C]] jako [[inkrement]] (<code>a++</code>, <code>++a</code>). [[Umocňování]] se značí [[Stříška (nediakritický znak)|stříškou]] (<code>a^b</code>) a pro [[celočíselné dělení]] a [[modulo]] žádné zkrácené zápisy neexistují a lze místo nich použít funkce <code>Quotient</code> a <code>Mod</code>. Znak násobení <code>*</code> lze vynechat, mezery se tak vyhodnocují automaticky jako násobení<ref>{{Citace elektronického periodika
| titul = Arithmetic—Numerical Operations on Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/NumericalOperationsOnFunctions.html#5565
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Toto chování může vést k neočekávanému chování uvnitř funkcí, když se středník zapomene napsat. Kód na řádku nezakončeném středníkem je totiž vynásoben s kódem na řádku následujícím a výsledný výraz je vyhodnocen. Namísto toho, aby byly oba řádky vyhodnoceny zvlášť jeden po druhém.}}.
[[Vektorový součin]] odpovídá funkci <code>Cross</code>, [[maticové násobení]] odpovídá funkci <code>Dot</code> a zapisuje se [[tečka|tečkou]] (<code>a . b</code>). Vynásobení vektoru či matice číslem se provádí po prvcích a tak např. <code>3 * {a, b, c}</code> vrátí <code>{3 a, 3 b, 3 c}</code>. Podobně se násobení chová i při (skalárním) násobení matice vektorem: <code>{a, b, c} * {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{{a, 2 a}, {3 b, 4 b}, {5 c, 6 c}}</code>, zatímco maticové vynásobení <code>{a, b, c} . {{1, 2}, {3, 4}, {5, 6}}</code> vrátí <code>{a + 3 b + 5 c, 2 a + 4 b + 6 c}</code>.
Kromě tradičních operátorů obsahuje WL i množství operátorů bez předdefinovaného chování. Jedním takovým je <code>NonCommutativeMultiply</code><ref>{{Citace elektronického periodika
| titul = NonCommutativeMultiply (**)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html.en
| datum přístupu = 2022-10-26
}}</ref>, jenž lze zapsat jako dvě hvězdičky <code>**</code>. Pomocí <code>UpValues</code> lze tomuto operátoru dodefinovat aritmetická pravidla, podle kterých se má chovat. Konstrukt <code>a ** b</code> tak poté třeba může představovat nekomutativní součin proměnných <code>a</code> a <code>b</code>.
=== Přiřazení ===
WL nabízí dva druhy přiřazení — přímé (striktní, výraz <code>Set</code>) a [[Odložené vyhodnocování|odložené]] (nestriktní, výraz <code>SetDelayed</code>)<ref>{{Citace elektronického periodika
| titul = Immediate and Delayed Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979
| datum přístupu = 2022-10-26
}}</ref>. Při přímém přiřazení je příkazem <code>var = hod</code> do [[proměnná (programování)|proměnné]] <code>var</code> na levé straně přiřazena aktuální hodnota <code>hod</code> na straně pravé. Naproti tomu odložené přiřazení <code>var := hod</code> hodnotu na pravé straně nevyhodnocuje až do chvíle, kdy je proměnná volána. Rozdíl mezi těmito dvěma přiřazeními je dobře patrný, je-li do proměnné přiřazena náhodná hodnota funkcí <code>RandomReal</code> a tato proměnná je následně několikrát po sobě volána:{{Poznámka|Konkrétní číselné hodnoty se mohou v daném běhu programu lišit. Pro inicializaci generátoru náhodných čísel lze použít příkaz <code>SeedRandom</code>.}}
<syntaxhighlight lang="Mathematica">
x = RandomReal[];
y := RandomReal[];
{x, y} (* vrátí {0.211393, 0.882601} *)
{x, y} (* vrátí {0.211393, 0.303523} *)
{x, y} (* vrátí {0.211393, 0.196294} *)
</syntaxhighlight>
Přímé přiřazení se používá pro definici konstant a proměnných, odložené přiřazení se pak běžně využívá při definicích funkcí. Viz též sekci [[#Funkce|„Funkce“]].
Přiřazení lze i řetězit a tak lze psát např. <code>a = b = c = 42</code>. Lze přiřazovat i do několika proměnných současně pomocí seznamů: <code>{a, b, c} = {1, 2, 3}</code>. Tímto způsobem lze přehodit hodnoty dvou proměnných: <code>{a, b} = {b, a}</code><ref>{{Citace elektronického periodika
| titul = Special Forms of Assignment—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#4055
| datum přístupu = 2022-10-26
}}</ref>. Podporovány jsou i kombinace aritmetických operací s přiřazením ve stypu jazyka [[C (programovací jazyk)|C]]: <code>+=</code>, <code>*=</code>, <code>/=</code>, atd.<ref name="assignments">{{Citace elektronického periodika
| titul = Assignments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Assignments.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Porovnávání ===
WL obsahuje tradiční [[Nerovnost (matematika)|porovnávací operátory]] jako „větší než“ (<code>></code>), „menší než“ (<code><</code>), „větší nebo rovno“ (<code>>=</code>) a „menší nebo rovno“ (<code><=</code>)<ref>{{Citace elektronického periodika
| titul = Relational and Logical Operators—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#7679
| datum přístupu = 2022-10-27
}}</ref>. Tyto vztahy odpovídají po řadě funkcím <code>Less</code>, <code>LessEqual</code>, <code>Greater</code> a <code>GreaterEqual</code>. Vztah „rovná se“ se zapisuje dvěma [[rovnítko|rovnítky]] (<code>==</code>, funkce <code>Equal</code>) a vztah „nerovná se“ se zapisuje [[vykřičník]]em následovným rovnítkem (<code>!=</code>, funkce <code>Unequal</code>). Všechny následující výrazy jsou vyhodnoceny jako pravdivé:
<syntaxhighlight lang="Mathematica">
3 > 2; -1 < 0; 2 >= 2; 1 <= 4.5;
1 < 3 < 12.3 (* jsou podporována i zřetězená porovnání *)
</syntaxhighlight>
Kromě testu na rovnost poskytuje WL i test na identitu<ref>{{Citace elektronického periodika
| titul = SameQ (===)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/SameQ.html.en
| datum přístupu = 2022-10-27
}}</ref>, jenž se zapisuje třemi rovnítky (<code>===</code>, funkce <code>SameQ</code>) a jehož opak je vyjádřen symbolem <code>=!=</code> a funkcí <code>UnsameQ</code>. Zatímco rovnost <code>==</code> testuje, zda jsou si dvě čísla numericky rovna, identita <code>===</code> zjišťuje, zda se jedná o skutečně stejná čísla. Tak například výraz <code>2 == 2.0</code> vrátí <code>True</code>, protože [[celé číslo]] 2 typu <code>Integer</code> je numericky rovno [[reálné číslo|reálnému číslu]] 2.0 typu <code>Real</code>, avšak <code>2 === 2.0</code> vrací <code>False</code>, protože se jedná o dva různé typy. Obdobně, máme-li dvě [[proměnná (programování)|proměnné]] <code>x</code> a <code>y</code>, jimž nebyly dosud přiřazeny žádné hodnoty, tak výraz <code>x == y</code> zůstane nevyhodnocen, protože nelze určit, zda si dvě hodnoty jsou rovny, zatímco <code>x === y</code> vrátí rovnou <code>False</code>.
Kromě výše uvedených funkcí jako <code>Equal</code> či <code>Greater</code>, které berou dva parametry, poskytuje WL i jejich operátorové podoby<ref>{{Citace elektronického periodika
| titul = Testing Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TestingExpressions.html.en
| datum přístupu = 2022-10-27
}}</ref>, kde je dosazen pouze parametr první. Místo zápisu <code>Equal[x, y]</code> (jenž je ekvivalentní zápisu <code>x == y</code>) lze psát <code>EqualTo[x][y]</code>, kde <code>EqualTo</code> je operátorová obdoba funkce <code>Equal</code>. Výraz <code>EqualTo[x][y]</code> je nutno číst jako funkci <code>EqualTo[x]</code> (parametrizovanou proměnnou <code>x</code>) aplikovanou na proměnnou <code>y</code>. Operátorové podoby srovnávacích funkcí lze například využít ve chvíli, kde chceme porovnávat celé [[Pole (datová struktura)|pole]] čísel s jednou jedinou hodnotou. Tak například:
<syntaxhighlight lang="Mathematica">
EqualTo[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, True, False, False, False} *)
GreaterThan[3] /@ {1, 2, 3, 4, 5, 6} (* vrátí {False, False, False, True, True, True} *)
</syntaxhighlight>
kde <code>GreaterThan</code> je operátorová forma funkce <code>Greater</code>.
=== Logické operátory ===
[[Pravdivostní hodnota|Pravdivostní hodnoty]] pravda a nepravda jsou představovány konstantami <code>True</code> a <code>False</code>. Základní [[logická operace|logické operace]] jsou pak zadány těmito funkcemi<ref>{{Citace elektronického periodika
| titul = Logic & Boolean Algebra—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LogicAndBooleanAlgebra.html.en
| datum přístupu = 2022-10-27
}}</ref>: [[Konjunkce (logika)|konjunkce]] pomocí <code>And</code> (místo <code>And[a, b]</code> lze psát též <code>a && b</code>), [[disjunkce]] pomocí <code>Or</code> (<code>a || b</code>) a [[negace]] pomocí <code>Not</code> (<code>!a</code>){{Poznámka|Poznamenejme, že vykřičník musí stát před negovaným výrazem. Pokud stojí za ním (<code>a!</code>), je vykřičník interpretován jako [[faktoriál]]. Pro zajímavost dodejme, že dva vykřičníky za výrazem (<code>a!!</code>) označují [[dvojitý faktoriál]].}}. Funkce <code>And</code> a <code>Or</code> jsou [[zkrácené vyhodnocování|vyhodnocovány zkráceně]] a tak je-li výsledná pravdivostní hodnota známa dříve, než se vyhodnotí všechny výrazy, nejsou tyto vyhodnoceny. Podporovány jsou i další logické operace jako <code>Xor</code>, <code>Nand</code>, <code>Implies</code>, atd. Ve WL neexistují speciální znaky pro [[Bitová operace|bitové logické operace]] a je třeba použít názvy odpovídajících funkcí jako <code>BitAnd</code>, <code>BitOr</code>, <code>BitNot</code>, atd.<ref>{{Citace elektronického periodika
| titul = Bitwise Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/BitwiseOperations.html.en
| datum přístupu = 2022-10-27
}}</ref>
WL podporuje i [[kvantifikátor]]y ''pro všechny'' (<code>ForAll</code>) a ''existuje'' (<code>Exists</code>)<ref>{{Citace elektronického periodika
| titul = Quantifiers—Manipulating Equations and Inequalities—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ManipulatingEquationsAndInequalities.html#8610
| datum přístupu = 2022-10-27
}}</ref>. Komplikované logické výrazy lze zjednodušit pomocí funkcí <code>Resolve</code>, <code>BooleanConvert</code> či <code>Simplify</code>. Některé výrazy nelze vyhodnotit ani jako pravdu či nepravdu. Takové výrazy jsou programem posílány nevyhodnocené. Chceme-li vynutit jejich vyhodnocení (na <code>False</code> v případě nerozhodnutelných výrazů), lze je obalit do funkce <code>TrueQ</code>. Pro převod pravdivostní hodnoty na číslo lze použít funkci <code>Boole</code>, která převede <code>True</code> na 1 a <code>False</code> na 0. Ve WL neexistuje datový typ odpovídající typu <code>bool</code> či <code>boolean</code> z jiných programovacích jazyků a pokud je třeba specifikovat, že daná proměnná <code>var</code> nabývá pouze pravdivostních hodnot, lze psát <code>Element[var, True|False]</code>.
== Řídicí struktury ==
=== Podmínky ===
Podmínky lze implementovat různými způsoby<ref>{{Citace elektronického periodika
| titul = Conditionals—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#1655
| datum přístupu = 2022-10-27
}}</ref>. Nejčastějším je patrně konstrukt <code>If</code><ref>{{Citace elektronického periodika
| titul = If—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/If.html.en
| datum přístupu = 2022-10-27
}}</ref>, jehož základní syntaxe zní <code>If[podm, vyraz1, vyraz2]</code>, kde <code>podm</code> je podmínka, která je buď pravda (<code>True</code>), v kterémžto případě se vyhodnotí <code>vyraz1</code> či nepravda (<code>False</code>), v kterémžto případě se vyhodnotí <code>vyraz2</code>. Např.
<syntaxhighlight lang="Mathematica">
x = 2;
If[x < 1, y = 3, y = 5];
y (* vrátí 5 *)
</syntaxhighlight>
Podmínky jsou na rozdíl od populárních jazyků jako [[C (programovací jazyk)|C]] či [[Python]] představovány [[Výraz (programování)|výrazem]], který lze vyhodnotit. Lze tak předchozí kód přepsat do tvaru
<syntaxhighlight lang="Mathematica">
x = 2;
y = If[x < 1, 3, 5];
y (* vrátí 5 *)
</syntaxhighlight>
Na rozdíl od některých jiných jazyků, <code>If</code> má tři argumenty, přičemž třetí argument je vyhodnocen, nelze-li určit [[pravdivostní hodnota|pravdivostní hodnotu]] prvního argumentu. Pro příklad uvažme, že [[proměnná (programování)|proměnná]] <code>x</code> nemá přiřazenu žádnou hodnotu a nelze tak určit, zda je menší nebo větší než jedna:
<syntaxhighlight lang="Mathematica">
y = If[x < 1, 3, 5, "nevím"];
y (* vrátí "nevím" *)
</syntaxhighlight>
Řetěz <code>If</code> výrazů lze nahradit funkcí <code>Switch</code><ref>{{Citace elektronického periodika
| titul = Switch—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Switch.html.en
| datum přístupu = 2022-10-27
}}</ref>, podobně jako v jiných jazycích, jejíž syntaxe zní <code>Switch[vstup, vzor1, vyraz1, vzor2, vyraz2, ..., vzorN, vyrazN]</code>. První argument <code>vstup</code> je vyhodnocen a výsledná hodnota je porovnávána postupně s výrazy <code>vzor1</code>, <code>vzor2</code>, atd. Ve chvíli, kdy je nalezena shoda mezi hodnotou <code>vstup</code> a jistým vzorem <code>vzorj</code>, je vyhodnocen kód <code>vyrazj</code> a běh programu je poté přenesen za konec výrazu <code>Switch</code>. Jako <code>vzor1</code> až <code>vzorN</code> lze použít obecné vzory a není tedy nutná přesná shoda mezi <code>vzorj</code> a vstupní hodnotou. Roli výchozího chování, které je např. v jazyce [[Java (programovací jazyk)|Java]] umožněno klíčových slovem <code>default</code>, plní vzor <code>_</code>, který lze umístit na pozici argumentu <code>vzorN</code>. Chceme-li tedy například udat slovní hodnocení na základě školní známky s tím, že pro známky mimo rozsah vypíšeme chybovou hlášku, můžeme psát:
<syntaxhighlight lang="Mathematica">
Switch[znamka,
1, "výborně",
2, "chvalitebně",
3|4|5, "příště se lépe připrav",
_, "neplatná známka"
]
</syntaxhighlight>
V případě, že <code>znamka</code> je 3 nebo 4 nebo 5 vrátí <code>Switch</code> jako návratovou hodnotu [[textový řetězec|řetězec]] <code>"příště se lépe připrav"</code>. Pokud není známka [[celé číslo]] mezi 1 a 5, tak <code>Switch</code> vrátí řetězec <code>"neplatná známka"</code>.
Ve WL existuje i funkce <code>Which</code><ref>{{Citace elektronického periodika
| titul = Which—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Which.html.en
| datum přístupu = 2022-10-27
}}</ref> se syntaxí <code>Which[podm1, vyraz1, podm2, vyraz2, ..., podmN, vyrazN]</code>, ve které dochází postupně k vyhodnocování podmínek <code>podm1</code>, <code>podm2</code>, atd. a ve chvíli, kdy je daná podmínka <code>podmj</code> vyhodnocena jako <code>True</code>, tak se provede za ní specifikovaný kód <code>vyrazj</code>. Roli klíčového slova <code>default</code> zde pak může plnit [[literál]] <code>True</code> vložený jako poslední podmínka <code>podmN</code>. Chceme-li tedy například určit denní dobu v závislosti na hodině zadané v proměnné <code>hod</code> a současně vrátit [[chybové hlášení]] v případě, že <code>hod</code> není v rozmezí 0-24, můžeme psát:
<syntaxhighlight lang="Mathematica">
Which[
0<=hod<12, "před polednem",
hod==12, "v poledne",
12<hod<=24, "po poledni",
True, "hod mimo rozsah"
]
</syntaxhighlight>
=== Cykly a jejich ekvivalenty ===
WL nabízí cykly typické pro další programovací jazyky, jako [[Cyklus for|for cyklus]] (<code>For</code>), [[Cyklus while-do|while cyklus]] (<code>While</code>) a [[do-while cyklus]] (reprezentovaný příkazem <code>Until</code> uvedeným ve verzi 13.1)<ref>{{Citace elektronického periodika
| titul = Looping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/LoopingConstructs.html.en
| datum přístupu = 2022-10-27
}}</ref>. Syntaxe for cyklu je velmi blízká syntaxi pro tento cyklus v jazyce [[C (programovací jazyk)|C]] (konkrétně <code>For[počátek, konec, inkrement, tělo]</code><ref>{{Citace elektronického periodika
| titul = For—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/For.html.en
| datum přístupu = 2022-10-27
}}</ref>). Používat tento příkaz se nicméně nedoporučuje<ref>{{Citace elektronického periodika
| titul = core language - Why should I avoid the For loop in Mathematica?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref> a místo toho je upřednostňováno používání specializovanějších příkazů<ref>{{Citace elektronického periodika
| titul = performance tuning - Alternatives to procedural loops and iterating over lists in Mathematica
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists-in-mathematica
| jazyk = en
| datum přístupu = 2022-10-27
}}</ref>, z nichž některé jsou uvedeny níže.
Je-li cílem provést tutéž akci pro předem daný počet indexů, lze použít funkci <code>Do</code>, jejíž syntaxe zní <code>Do[...kód potenciálně závisející na i..., {i, start, konec}]</code><ref>{{Citace elektronického periodika
| titul = Repetitive Operations—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#3565
| datum přístupu = 2022-10-27
}}</ref>. Pokud se argument <code>start</code> vynechá, index <code>i</code> jde od jedničky. Vypsání tří po sobě jdoucích čísel 1, 2, 3 tak lze provést kódem <code>Do[Print[i], {i, 3}]</code>. Je-li naopak cílem vytvořit pole hodnot na základě jistého předpisu, lze použít příkaz <code>Table</code> nebo <code>Array</code>, jejichž použití zní:
<syntaxhighlight lang="Mathematica">
Table[a[i], {i, 3}] (* vrátí: {a[1], a[2], a[3]} *)
Array[a, {3}] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
Funkce <code>Table</code> umožňuje místo [[Index (matematika)|indexu]] coby číselného pořadí použít přímo prvky pole a napodobuje tak chování konstruktu <code>foreach</code> z jiných jazyků. Srovnej:
<syntaxhighlight lang="Mathematica">
seznam = {"a", "b", "c"};
Table[str<>"x", {str, seznam}] (* vrátí: {"ax", "bx", "cx"} *)
</syntaxhighlight>
Vícerozměrná [[pole (datová struktura)|pole]] lze vytvořit příkazem <code>Table</code>, kde je uveden příslušný počet indexových proměnných s odpovídajícími rozsahy<ref>{{Citace elektronického periodika
| titul = Making Tables of Values—Lists—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Lists.html#23192
| datum přístupu = 2022-10-27
}}</ref>. Například:
<syntaxhighlight lang="Mathematica">
Table[a[i, j], {i, 2}, {j, -1, 1}]
(* vrátí: {{a[1, -1], a[1, 0], a[1, 1]}, {a[2, -1], a[2, 0], a[2, 1]}} *)
</syntaxhighlight>
Poznamenejme, že místo příkazu <code>Do</code> lze použít funkci <code>Scan</code> a podobně místo <code>Table</code> lze použít funkci <code>Map</code>. Výše uvedený příklad lze přepsat do tvaru:
<syntaxhighlight lang="Mathematica">
Map[a, Range[3]] (* vrátí: {a[1], a[2], a[3]} *)
a /@ Range[3] (* vrátí: {a[1], a[2], a[3]} *)
</syntaxhighlight>
kde <code>Range[n]</code> vrací pole čísel tvaru <code>{1, 2, 3, ..., n}</code>. Druhý řádek je pouze kompaktní zápis řádku prvního, se kterým je ekvivalentní<ref name="map">{{Citace elektronického periodika
| titul = Map (/@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Map.html.en
| datum přístupu = 2022-10-27
}}</ref>. Používáním funkce <code>Map</code> lze elegantně provádět stejné operace jako s <code>Table</code> s tou výhodou, že není třeba používat explicitně indexovou proměnnou.
Další častou situací je, když je cyklus použit pro opakovanou aplikaci téže funkce na jistou počáteční hodnotu<ref>{{Citace elektronického periodika
| titul = Applying Functions Repeatedly—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#23850
| datum přístupu = 2022-10-27
}}</ref>. Tento případ lze ve WL řešit použitím funkce <code>Nest</code>, jejíž první parametr udává funkci, jež má být aplikována, druhý parametr udává počáteční hodnotu a parametr třetí pak počet opakování:
<syntaxhighlight lang="Mathematica">
Nest[f, x, 3] (* vrátí: f[f[f[x]]] *)
</syntaxhighlight>
Potřebujeme-li v každém opakování zvolit dodatečnou hodnotu, lze místo <code>Nest</code> použít funkci <code>Fold</code>, jejíž první parametr je aplikovaná funkce, parametr druhý je počáteční hodnota a parametr třetí je seznam dodatečných hodnot
<syntaxhighlight lang="Mathematica">
Fold[f, x, {a, b, c}] (* vrátí: f[f[f[x, a], b], c] *)
</syntaxhighlight>
=== Výjimky ===
Vyhodnocování kódu lze programově dočasně přerušit funkcí <code>Interrupt</code>, která vyvolá [[dialogové okno]], v němž může uživatel určit, jak dále postupovat. Ukončit okamžitě vyhodnocování lze programově funkcí <code>Abort</code>, jež vrátí hodnotu <code>$Aborted</code>. Některé funkce při nesplnění očekávané akce vrátí <code>$Failed</code>. Přerušit standardní tok vyhodnocování příkazů lze vložením výrazu <code>Throw</code> na dané místo kódu. Tento výraz musí být posléze zachycen funkcí <code>Catch</code>, do níž je zabalen dotčený kód<ref>{{Citace elektronického periodika
| titul = Flow Control—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/FlowControl.html.en
| datum přístupu = 2022-10-27
}}</ref>, viz např.:
<syntaxhighlight lang="Mathematica">
Catch[prikaz1; prikaz2; Throw[aha]; prikaz3] (* vrátí: aha *)
</syntaxhighlight>
Kód může vracet i zprávy příkazem <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Textual Input and Output—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TextualInputAndOutput.html#12413
| datum přístupu = 2022-10-27
}}</ref>. Tyto zprávy mohou být zachycovány funkcí <code>Check</code>. Zpráva pro daný symbol <code>f</code> se specifikuje syntaxí
<code>f::jmenozpravy = "text zprávy"</code>. Šíření dané zprávy z konkrétního výrazu lze potlačit pomocí funkce <code>Quiet</code>, potlačení zprávy či skupiny zpráv v rámci celého systému lze funkcí <code>Off</code> a její znovuzprovoznění lze provést funkcí <code>On</code>. Srovnej funkci:
<syntaxhighlight lang="Mathematica">
deleni::delnul = "Dělení nulou"; (* definice chybové zprávy *)
deleni[a_, b_] := If[b != 0, a/b, Message[deleni::delnul];$Failed]; (* definice funkce *)
</syntaxhighlight>
a její volání pro různé vstupní hodnoty:
<syntaxhighlight lang="Mathematica">
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: $Failed *)
Quiet[deleni[3, 0]] (* nevypíše chybovou hlášku a vrátí: $Failed *)
Check[deleni[3, 0], "příště neděl nulou"] (* vypíše chybovou hlášku "Dělení nulou" a vrátí: "příště neděl nulou" *)
</syntaxhighlight>
Použít lze i funkci <code>Assert</code>, která vyvolá chybovou zprávu ve chvíli, kdy podmínka specifikovaná uvnitř <code>Assert</code> ''nevrátí'' <code>True</code>. Pro zjišťování hodnot proměnných a výrazů uvnitř větších bloků kódu lze užít funkci <code>Echo</code> a její příbuzné<ref>{{Citace elektronického periodika
| titul = Print Intermediate Values of a Variable—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/PrintIntermediateValuesOfAVariable.html.en
| datum přístupu = 2022-10-27
}}</ref><ref>{{Citace elektronického periodika
| titul = Tuning & Debugging—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/TuningAndDebugging.html.en
| datum přístupu = 2022-10-27
}}</ref>.
Ve verzi 12.2 byla zavedena modernější sada funkcí<ref>{{Citace elektronického periodika
| titul = Robustness & Error Handling—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RobustnessAndErrorHandling.html.en
| datum přístupu = 2022-10-27
}}</ref> v čele s funkcemi <code>Confirm</code> a <code>Enclose</code>. Tyto funkce při neúspěchu vrátí výraz <code>Failure</code>, jehož tělo obsahuje doplňující informace o chybě{{Poznámka|Některé funkce vrací kromě tohoto výrazu při neúspěchu i obdobný výraz <code>Success</code> při úspěšném proběhnutí.}}. Funkci <code>deleni</code> z příkladu výše lze s pomocí funkcí <code>ConfirmBy</code> a <code>Enclose</code> přepsat do tvaru
<syntaxhighlight lang="Mathematica">
deleni[a_, b_] := Enclose[a/ConfirmBy[b, # != 0 &, "Dělení nulou"]] (* definice funkce spolu s chybovým hlášením *)
deleni[3, 2] (* vrátí: 3/2 *)
deleni[3, 0] (* vrátí: Failure[...], jenž obsahuje doplňující informace o chybě včetně hlášky "Dělení nulou" *)
</syntaxhighlight>
== Vzory a nahrazovací pravidla ==
=== Vzory ===
Jedním ze specifik WL je podpora široké škály ''vzorů'' (angl. ''patterns'')<ref>{{Citace elektronického periodika
| titul = Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou svým způsobem prototypy výrazů a lze je chápat jako [[regulární výraz|regulární výrazy]] aplikované na kód a data kódem zpracovávaná. S jejich pomocí lze vyhledávat části kódu či zpracovávaných dat a nahrazovat tyto kódem jiným.
Například [[podtržítko]] <code>_</code> označuje libovolný výraz, dvě podtržítka <code>__</code> označují [[posloupnost]] jednoho a více výrazů a tři podtržítka <code>___</code> označují posloupnost libovolného nezáporného počtu výrazů<ref>{{Citace elektronického periodika
| titul = Blank—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Blank.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tyto a podobné vzory lze použít například při zjišťování, zda daný výraz vyhovuje jistým podmínkám, či k provádění úprav dat způsobem, který připomíná práci funkcí. Pokud chceme například zjistit, zda je zadaný seznam <code>sez</code> neprázdný, lze toto provést voláním <code>MatchQ[sez, {__}]</code>, kde vzor <code>{__}</code> označuje seznam s alespoň jedním prvkem a funkce <code>MatchQ</code> zjišťuje, zda daný výraz, zde <code>sez</code>, vyhovuje danému vzoru.
Každý výraz ve WL má hlavičku. Tuto lze specifikovat připojením jejího názvu za podtržítko<ref>{{Citace elektronického periodika
| titul = Specifying Types of Expression in Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#13787
| datum přístupu = 2022-10-26
}}</ref>. Chceme-li tedy zjistit, zda daný seznam <code>sez</code> obsahuje pouze [[reálná čísla]], lze toto provést voláním <code>MatchQ[sez, {___Real}]</code>, kde <code>___Real</code> označuje posloupnost libovolného počtu reálných čísel. Části vzoru lze i přiřadit jméno, což je výhodné při použití v pravidlech a definicích [[funkce (programování)|funkcí]]. Funkce se běžně definují způsobem: <code>f[x_] := (nějaký kód závislý na x)</code>, kde konstrukt <code>x_</code> je vzor označující libovolný výraz, jemuž je přiřazeno jméno <code>x</code>. V případě složitějších vzorů lze použít místo podtržítek tečky a jméno se pak udává volitelně před dvojtečku<ref>{{Citace elektronického periodika
| titul = Naming Pieces of Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#5819
| datum přístupu = 2022-10-26
}}</ref>. Například konstrukt <code>x:({a, b}..)</code> označuje vzor pojmenovaný <code>x</code>, který odpovídá posloupnosti jednoho či více seznamů tvaru <code>{a, b}</code>.
[[Množina|Množinu]] výrazů vyhovujících danému vzoru lze úžeji specifikovat pomocí podmínek (<code>Condition</code>) a testovacích funkcí (<code>PatternTest</code>)<ref>{{Citace elektronického periodika
| titul = Putting Constraints on Patterns—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#1615
| datum přístupu = 2022-10-26
}}</ref>. Například vzor <code>x_List/;Length[x]<=5</code> označuje seznam s nanejvýš pěti prvky. Tento vzor je tvaru <code>vzor/;podminka</code>, kde <code>podminka</code> je výraz, který musí vrátit <code>True</code> či <code>False</code>. Alternativou je použití testovací funkce. Předchozí vzor lze ekvivalentně přepsat do tvaru <code>x_List?(Length[#]<=5&)</code>, jenž je tvaru <code>vzor?test</code>, kde <code>test</code> je funkce, která po aplikování na vzor musí vrátit <code>True</code> či <code>False</code>. Podobně lze postupovat i když místo ryzí funkce použijeme funkci standardní. Například vzor <code>a_?EvenQ</code> označuje libovolný výraz, pro nějž funkce <code>EvenQ</code> vrátí <code>True</code>. Vzhledem k tomu, že <code>EvenQ</code> testuje, kde je vstupní parameter [[Sudá a lichá čísla|sudé číslo]], označuje tento vzor tedy sudé číslo.
Vzory jsou podporovány mnoha funkcemi jako <code>Switch</code> při porovnávání jednotlivých případů se vstupní hodnotou, <code>Cases</code> pro výběr prvků ze seznamu, které splňují dodatečná kriteria atd.<ref>{{Citace elektronického periodika
| titul = Pattern Matching Functions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/PatternMatchingFunctions.html.en
| datum přístupu = 2022-10-26
}}</ref>
=== Pravidla ===
WL umožňuje práci s ''nahrazovacími pravidly'' (angl. ''rules'', popř. ''transformation rules'')<ref>{{Citace elektronického periodika
| titul = Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Rules.html.en
| datum přístupu = 2022-10-26
}}</ref>, díky nimž lze nahradit část výrazu výrazem jiným. Máme-li například seznam tvaru <code>{a, 2, a, 3}</code>, který chceme změnit do tvaru <code>{1, 2, 1, 3}</code>, můžeme toto provést voláním
<syntaxhighlight lang="Mathematica">
{a, 2, a, 3} /. a->1 (* vrátí: {1, 2, 1, 3} *)
</syntaxhighlight>
kde <code>a->1</code> je pravidlo, které udává, že každý výskyt výrazu <code>a</code> se má nahradit číslem 1. Podobně jako v případě přiřazení, existuje i přímé a odložené pravidlo. Přímé pravidlo (<code>Rule</code>, zkráceně <code>-></code>) vyhodnotí pravou stranu přiřazení ve chvíli, kdy je toto pravidlo definováno, zatímco odložené pravidlo (<code>RuleDelayed</code>, zkráceně <code>:></code>) vyhodnotí pravou stranu až ve chvíli volání<ref>{{Citace elektronického periodika
| titul = Transformation Rules—Patterns and Transformation Rules—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/PatternsAndTransformationRules.html#24290
| datum přístupu = 2022-10-26
}}</ref>. Srovnej:
<syntaxhighlight lang="Mathematica">
{a, a, a} /. a->RandomReal[] (* vrátí: {0.209308, 0.2093080, 0.209308} *)
{a, a, a} /. a:>RandomReal[] (* vrátí: {0.827961, 0.0109041, 0.161149} *)
</syntaxhighlight>
Jak levá, tak pravá strana pravidla může mít velmi komplikovanou strukturu založenou na vzorech. Toto lze efektivně využít například ve chvíli, kdy nelze dopředu určit, čím se má daný výraz nahradit, protože jeho tvar závisí na tvaru nahrazované hodnoty. Srovnej následující kód:
<syntaxhighlight lang="Mathematica">
{x, 10, 3., 1, 2, -2} /. a_Integer?(#>1&):>ToString[a+1]<>" atd."
(* vrátí: {x, "11 atd.", 3., 1, "3 atd.", -2} *)
</syntaxhighlight>
Tento kód vyhledá v seznamu všechny výskyty [[celé číslo|celých čísel]] větších než jedna a nahradí je [[textový řetězec|řetězcem]], který obsahuje číslo o jedno větší s dodatkem <code>" atd."</code>.
Syntax <code>vyraz /. a->b</code> je ekvivalentní zápisu <code>ReplaceAll[vyraz, a->b]</code>, což je dále ekvivalentní zápisu <code>ReplaceAll[vyraz, Rule[a, b]]</code>. Konstrukt <code>a->b</code> samotný žádné nahrazování neprovádí, jedná se pouze o recept, ''jak'' se má nahrazení provést. Samotné provedení má ale na starosti funkce <code>ReplaceAll</code> a jí příbuzné funkce jako <code>ReplaceRepeated</code> (zkráceně <code>//.</code>)<ref>{{Citace elektronického periodika
| titul = Applying Transformation Rules—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#18035
| datum přístupu = 2022-10-26
}}</ref>.
== Blokové struktury ==
Základními blokovými strukturami jsou ve WL konstrukty <code>Block</code>, <code>Module</code> a <code>With</code>, z nichž má každý trochu jinou funkcionalitu<ref>{{Citace elektronického periodika
| titul = Scoping Constructs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/ScopingConstructs.html.en
| datum přístupu = 2022-09-18
}}</ref><ref name="use_cases">{{Citace elektronického periodika
| titul = What are the use cases for different scoping constructs?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs
| jazyk = en
| datum přístupu = 2022-09-18
}}</ref>, jak popsáno níže.
=== Block ===
<code>Block</code> provádí [[dynamic scoping]], kde se při provádění bloku dočasně přepíše hodnota dané [[proměnná (programování)|proměnné]]. Syntaxe zní <code>Block[{var1, var2, ..., varN}, telo]</code>, kde <code>var1</code> atd. jsou [[lokální proměnná|lokální proměnné]] a <code>telo</code> je blok kódu. Proměnné lze rovnou i inicializovat a psát <code>Block[{var1 = hod1, var2 = hod2, ..., varN = hodN}, telo]</code><ref>{{Citace elektronického periodika
| titul = Blocks and Local Values—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#30189
| datum přístupu = 2022-10-26
}}</ref>, přičemž inicializovány nemusejí být všechny. Uvažme následující příklad:
<syntaxhighlight lang="Mathematica">
a = 42;
Block[{a, b = 3, c},
a = b;
Print["uvnitr Block: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
Tento kód vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Block: 3 ... c
42
</syntaxhighlight>
Uvnitř <code>Block</code> můžeme přiřazovat do lokálních proměnných, viz příkaz <code>a = b</code> výše. Pokud nemá daná lokální proměnná přiřazenu hodnotu, je vrácena jako symbol, viz řádek <code>"uvnitr Block: 3 ... c"</code> ve výpisu. Vzhledem ke způsobu lokalizace v <code>Block</code> není třeba, aby lokální proměnná byla explicitně zmíněna v těle, srovnej následující kód:
<syntaxhighlight lang="Mathematica">
b := a + 1 (* odložené přiřazení do proměnné b *)
a = 2; (* globální hodnota proměnné a *)
Block[{a = 5}, b] (* vrátí: 6 *)
b (* vrátí: 3 *)
</syntaxhighlight>
=== Module ===
<code>Module</code> provádí [[lexical scoping]], kde jsou proměnné interně přejmenovávány tak, že mají unikátní název, přičemž jejich viditelnost není omezena na tělo bloku. Syntaxe je zcela analogická té pro <code>Block</code><ref>{{Citace elektronického periodika
| titul = Modules and Local Variables—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#7693
| datum přístupu = 2022-10-26
}}</ref>. Pro srovnání s <code>Block</code><ref>{{Citace elektronického periodika
| titul = Blocks Compared with Modules—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#32372
| datum přístupu = 2022-10-26
}}</ref> uvažme kód:
<syntaxhighlight lang="Mathematica">
a = 42;
Module[{a, b = 3, c},
a = b;
Print["uvnitr Module: ", a, " ... ", c];
];
Print[a];
</syntaxhighlight>
jenž vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr Module: 3 ... c$65048
42
</syntaxhighlight>
Jak vidno, lokální proměnná <code>c</code> má pozměněné jméno{{Poznámka|Jméno vznikne připojením znaku [[dolar]]u <code>$</code> ke jménu proměnné, za který je dále vloženo číslo, které je pro daný běh jádra jedinečné a je uloženo do interní proměnné <code>$ModuleNumber</code>, jež se při každém volání inkrementuje. Lokální proměnné v <code>Module</code> navíc dostávají dodatečný atribut <code>Temporary</code><ref>{{Citace elektronického periodika
| titul = Temporary—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Temporary.html.en
| datum přístupu = 2022-10-26
}}</ref>.}}. Tímto způsobem je možné, na rozdíl od <code>Block</code>, použít původně lokální proměnnou i po skončení bloku <code>Module</code>. Pro ilustraci uvažme následující kód, kde je v těle <code>Module</code> definována funkce <code>f</code> a tato je posléze vrácena:
<syntaxhighlight lang="Mathematica">
Module[{f}, f[x_] := x^2; f] (* vrátí: f$65834 *)
f$65834[y] (* vrátí y^2 *)
</syntaxhighlight>
Původně lokální proměnná <code>f</code> je přejmenována na <code>f$65834</code> a jako takovou ji lze použít i vně <code>Module</code>.
=== With ===
<code>With</code> provádí lokalizaci konstant, to jest proměnných, jimž nelze po zbytek bloku měnit hodnotu<ref>{{Citace elektronického periodika
| titul = Local Constants—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#19459
| datum přístupu = 2022-10-26
}}</ref>. Nelze tak do takových proměnných přiřazovat, na rozdíl od <code>Block</code> a <code>Module</code>. Syntaxe je opět zcela analogická té pro <code>Block</code> s tím, že každou lokální proměnnou je nutno inicializovat, srovnej kód:
<syntaxhighlight lang="Mathematica">
a = 42;
With[{a = 3},
Print["uvnitr With: ", a];
];
Print[a];
</syntaxhighlight>
jež vypíše:
<syntaxhighlight lang="Mathematica">
uvnitr With: 3
42
</syntaxhighlight>
Blok <code>With</code> je v mnoha ohledech spíše než bloku <code>Block</code> podobný substitučním funkcím jako <code>ReplaceAll</code>. Na rozdíl od nich substituce neprobíhá po vyhodnocení výrazu, ale před ním<ref>{{Citace elektronického periodika
| titul = Substitute Values of Variables in Functions That Hold Their Arguments—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SubstituteValuesOfVariablesInFunctionsThatHoldTheirArguments.html.en
| datum přístupu = 2022-10-26
}}</ref>, srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := If[x < 1, "maly", "velky", x]; (* definice funkce f *)
With[{x = 2}, f[x]] (* vrátí: "velky" *)
f[x] /. x->2 (* vrátí: 2 *)
</syntaxhighlight>
Na prvním řádku je definována funkce <code>f</code>, která vrátí buď <code>"maly"</code>, je-li vstupní parametr menší než 1, anebo <code>"velky"</code>, je-li parametr větší než 1. V případě, že vstupní parametr nemá přiřazenu žádnou hodnotu, vrátí funkce <code>f</code> tento parametr nevyhodnocený. Na druhém řádku je v bloku <code>With</code> do proměnné <code>x</code> přiřazena hodnota 2 a tato je posléze poslána do funkce <code>f</code>. Na třetím řádku je obdobná situace, kde se použije substituční pravidlo, kterým se parametr <code>x</code> nahradí hodnotou 2. Tato substituce ale na rozdíl od druhého řádku probíhá až po vyhodnocení funkce <code>f</code>, čímž pádem obdržíme jiný výsledek.
== Strukturování kódu ==
{{Viz též|Mathematica#Strukturování kódu}}
=== Jmenné prostory ===
Každý symbol ve WL je součástí nějakého [[jmenný prostor|jmenného prostoru]], kterým se ve WL říká ''kontexty'' (angl. ''contexts'')<ref>{{Citace elektronického periodika
| titul = Contexts—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#27982
| datum přístupu = 2022-10-26
}}</ref>. Základním kontextem pro předdefinované symboly je <code>System</code>, výchozím kontextem pro uživatelem definované symboly je pak <code>Global</code>. Stejně pojmenované symboly ve dvou různých noteboocích či buňkách lze lokalizovat tím, že se jim přiřadí kontext jedinečný pro daný notebook či buňku<ref>{{Citace elektronického periodika
| titul = Evaluation > Notebook's Default Context—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/menuitem/NotebookDefaultContext.html.en
| datum přístupu = 2022-10-26
}}</ref>. Definovat lze i vlastní kontexty. Symbol <code>x</code> s explicitně vypsaným kontextem <code>mujkontext</code> se udává kódem <code>mujkontext`x</code>, kde <code>`</code> je [[zpětný apostrof]]. Kontexty lze i vnořovat a psát tak např. <code>nadkontext`podkontext`x</code>. Aktuální kontext je uložen v proměnné <code>$Context</code>, zjistit kontext daného symbolu lze funkcí <code>Context</code>. Funkce <code>Contexts</code> vrací seznam všech dostupných kontextů a proměnná <code>$ContextPath</code> obsahuje seznam kontextů, které jsou prohledávány při hledání definice pro zadaný symbol. Každý balík definuje nový kontext a při nahrání balíku funkcí <code>Needs</code> je tento kontext vložen do proměnné <code>$Packages</code>. Po nahrání balíku není nutné explicitně vypisovat u každého symbolu jeho kontext.
Vypsat všechny symboly v daném kontextu lze příkazem <code>?jmenokontextu`*</code>, kde <code>jmenokontextu</code> je jméno daného kontextu. Vypsat všechny symboly definované uživatelem v daném běhu jádra tak lze voláním <code>?Global`*</code>. Viz též oddíl [[#Nápověda|„Nápověda“]].
=== Balíky ===
{{Viz též|Mathematica#Interní struktura balíku}}
Balíky (angl. ''packages'') jsou ucelené kusy kódu zabaleného do kontextu a uložené v samostatném souboru s příponou <code>.wl</code><ref>{{Citace elektronického periodika
| titul = Create a Package File—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/CreateAPackageFile.html.en
| datum přístupu = 2022-10-26
}}</ref>. Kód balíku začíná výrazem <code>BeginPackage</code> a končí výrazem <code>EndPackage</code>. Funkce a proměnné, které jsou používány pouze uvnitř balíku a které nemají být přímo přístupny uživateli balíku, lze vložit mezi výrazy <code>Begin</code> a <code>End</code>. Typický balík má následující strukturu<ref>{{Citace elektronického periodika
| titul = Setting Up Wolfram Language Packages—Modularity and the Naming of Things—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ModularityAndTheNamingOfThings.html#5934
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
BeginPackage["NovyKontext`"] (* počátek balíku a definice kontextu *)
novaFunkce::usage = "Dokumentační řetězec nové funkce."; (* tím, že funkci uvedeme před příkazem Begin, zajistíme, že je viditelná po načtení balíku uživateli *)
Begin["`Private`"] (* počátek části kódu, jež není přímo přístupná uživateli *)
novaFunkce[x_] := interniFunkce[x]^2 (* definice funkce *)
interniFunkce[x_] := x + 1 (* tato funkce není viditelná uživateli *)
End[] (* konec interních definic *)
EndPackage[] (* konec balíku *)
</syntaxhighlight>
Balík funkcí lze načíst buď pomocí funkce <code>Get</code>, jež vyhodnotí kód v balíku při každém volání této funkce, nebo funkcí <code>Needs</code>, která vyhodnotí kód balíku jen při prvním volání. Externí programy, jež dokážou komunikovat s jádrem protokolem [[WSTP]], lze propojit s jádrem pomocí funkce <code>Install</code>. [[Dynamická knihovna|Dynamické knihovny]] lze nahrát přímo do výpočetního jádra voláním funkce <code>LibraryLoad</code> a příbuzných funkcí<ref>{{Citace elektronického periodika
| titul = Wolfram LibraryLink User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/LibraryLink/tutorial/Overview.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Paclety ===
Nadstavbou balíků jsou ''paclety'' (angl. ''paclets'')<ref>{{Citace elektronického periodika
| titul = Paclets Overview—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Paclets.html.en
| datum přístupu = 2022-10-26
}}</ref>, což jsou v podstatě [[Archivní soubor|archivy]], jež mohou obsahovat řadu balíků s kódem ve WL i jiných [[programovací jazyk|programovacích jazycích]], [[Dokumentace k softwaru|dokumentaci]], [[Dynamická knihovna|dynamické knihovny]] či [[stylopis]]y. Paclet se z obyčejného archivu stane tím, že se do archivu vloží soubor s názvem <code>PacletInfo.wl</code>, jež obsahuje výraz s hlavičkou <code>PacletObject</code> (do verze 12.1 s hlavičkou <code>Paclet</code>), jež obsahuje [[metadata]] o souborech v archivu obsažených. Paclety nabízejí širší funkcionalitu než balíky a je nutné je do výpočetního systému nejdříve nainstalovat funkcí <code>PacletInstall</code>. Od verze 12.1 lze paclety centrálně ukládat do online repozitáře<ref>{{Citace elektronického periodika
| titul = Wolfram Language Paclet Repository
| periodikum = resources.wolframcloud.com
| url = https://resources.wolframcloud.com/PacletRepository
| datum přístupu = 2022-10-26
}}</ref>.
== Funkce ==
=== Základní použití ===
[[Funkce (programování)|Funkce]] lze volat pomocí jednoduchých [[hranatá závorka|hranatých závorek]], do nichž jsou vepsány vstupní parametry, např.: <code>Sin[0.9]</code>, <code>Table[i,{i,3}]</code> či <code>f[3]</code> pro uživatelem definovanou funkci <code>f</code><ref name="func">{{Citace elektronického periodika
| titul = Function (&,{{!}}->)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Function.html.en
| datum přístupu = 2022-10-26
}}</ref>. Základní tvar definice funkce jedné [[proměnná|proměnné]] vypadá následovně:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
</syntaxhighlight>
kde na levé straně je výraz tvaru <code>jmenofunkce[vstup_]</code> a na pravé straně [[Odložené vyhodnocování|odloženého přiřazení]] je tělo funkce zpracovávající vstup. Je-li potřeba při výpočtu použít dodatečné proměnné, lze tyto [[lokální proměnná|lokalizovat]] pomocí bloků <code>Block</code>, <code>With</code> či <code>Module</code>:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{y}, (* lokální proměnná y *)
y = x^2;
y + 1 (* popř. Return[y + 1]; *)
]
</syntaxhighlight>
Všimněme si, že není nutno použít příkaz <code>Return</code>, protože blok vrací automaticky hodnotu na posledním řádku.{{Poznámka|Pokud je tento řádek ukončen [[středník]]em, je [[návratová hodnota|návratovou hodnotou]] symbol <code>Null</code>.}}
Funkce jsou [[first-class objekt]]y a tak lze s nimi nakládat stejně jako s proměnnými, srovnej:
<syntaxhighlight lang="Mathematica">
fun = Cos;
If[podm, fun = Sin];
fun[0.2]
</syntaxhighlight>
Tento kód aplikuje na číslo <math>0,2</math> buď [[cosinus]], anebo [[sinus]] v závislosti na [[pravdivostní hodnota|pravdivostní hodnotě]] proměnné <code>podm</code>.
=== Definice ===
==== Přetěžování a polymorfizmus ====
Při definici funkce lze uplatnit širokou paletu vzorů, které specifikují, v jakých případech má být daná definice použita. Jedné funkci lze přiřadit vícero definic pro různé druhy vstupů a WL tak umožňuje [[přetěžování]] a [[Polymorfismus (programování)|polymorfizmus]]<ref>{{Citace elektronického periodika
| titul = Notes for Programming Language Experts about Wolfram Language
| periodikum = www.wolfram.com
| url = https://www.wolfram.com/language/for-experts/index.html.en
| jazyk = en
| datum přístupu = 2022-09-21
| url archivu = https://web.archive.org/web/20221004001524/https://www.wolfram.com/language/for-experts/index.html.en
| datum archivace = 2022-10-04
}}</ref>. Pokud danému vstupu nevyhovuje ani jedna definice, zůstává volaný výraz nevyhodnocen. Pokud naopak danému vstupu vyhovuje více definic, je použita ta, která je nejspecifičtější. Srovnej:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2 (* funkce f jedné proměnné *)
f[x_, y_] := x + y (* tatáž funkce, ale definována pro dva vstupní parametry *)
f[x_, y_?EvenQ] := "sude cislo na vstupu" (* opět tatáž funkce, ale nyní je její akce definována pro případy, kdy je druhý vstup sudé číslo *)
</syntaxhighlight>
Voláme-li tuto funkci <code>f</code> na různé vstupy, můžeme obdržet:
<syntaxhighlight lang="Mathematica">
f[4] (* vrátí: 16 *)
f[4, 2] (* vrátí: "sude cislo na vstupu" *)
f[4, 3] (* vrátí: 7 *)
f[4, 3, 7] (* vrátí: f[4, 3, 7] *)
</syntaxhighlight>
Podporovány jsou i složitější vzory<ref name="patt_comm">{{Citace elektronického periodika
| titul = Patterns for Some Common Types of Expression—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>. Například následující funkce vypíše číslo 1 tehdy, kdy je první vstup [[kladné číslo|kladný]] a druhý vstup je větší než ten první. Ve všech ostatních případech vypíše 0:
<syntaxhighlight lang="Mathematica">
f[x_?Positive, y_]/;(y > x) := 1
f[_, _] := 0
</syntaxhighlight>
==== Vstupní a výchozí hodnoty ====
Vstupním parametrům lze zadávat [[výchozí hodnota|výchozí hodnoty]] a to dvěma způsoby. Buď pomocí výrazu <code>Default</code>, anebo syntaxí používající [[dvojtečka|dvojtečku]] v definici funkce<ref>{{Citace elektronického periodika
| titul = Optional and Default Arguments—Patterns—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Patterns.html#17673
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Default[f] = 3; (* výchozí hodnota parametru funkce f je 3 *)
f[x_.] := x + 1 (* aby byla použita výchozí hodnota, je nutno ke vzoru x_ připojit tečku *)
g[x_ : 3] := x + 1 (* ekvivalentní definice pomocí dvojtečky *)
f[] (* vrátí: 4 *)
g[] (* vrátí: 4 *)
</syntaxhighlight>
Lze navíc i omezit obor možných vstupních hodnot tím, že se specifikuje podmínka<ref name="patt_comm" />, kterou musí vstupní parametr splňovat. Například následujícím kódem lze definovat funkci <code>h</code>, která pro [[Sudá a lichá čísla|sudé číslo]] vrátí číslo o jedna menší, pro [[Sudá a lichá čísla|liché číslo]] zůstane nevyhodnocena a pokud není zadán žádný vstup, použije se automaticky hodnota vstupu rovná 2:
<syntaxhighlight lang="Mathematica">
h[x : _?EvenQ : 2] := x - 1 (* h[vstup : podminka : vychoziHodnota] := atd. *)
h[1] (* vrátí: h[1] *)
h[2] (* vrátí: 1 *)
h[] (* vrátí: 1 *)
</syntaxhighlight>
==== Druhy přiřazení ====
Při definicích funkcí je nutné dbát rozdílu mezi přímým a odloženým přiřazením<ref>{{Citace elektronického periodika
| titul = Making Definitions for Functions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#9133
| datum přístupu = 2022-10-26
}}</ref>, viz sekci [[#Přiřazení|„Přiřazení“]]. Srovnej následující tři definice, kde jsme nejdříve do [[globální proměnná|globální proměnné]] <code>x</code> uložili hodnotu 5:
<syntaxhighlight lang="Mathematica">
f1[x] = x^2; (* bez vzoru a odloženého přiřazení *)
f2[x_] = x^2; (* vzor a přímé přiřazení *)
f3[x_] := x^2; (* vzor a odložené přiřazení *)
{f1[y], f2[y], f3[y]} (* vrátí: {f1[y], 25, y^2} *)
</syntaxhighlight>
V prvním řádku se při definici funkce <code>f1</code> použije hodnota globální proměnné <code>x</code>, to jest 5, a první řádek tak odpovídá přiřazení <code>f1[5] = 25</code>. Funkce <code>f1</code> tak má definovanou hodnotu jen pro jeden jediný vstup a tím je číslo 5. Ve druhém řádku je v hlavičce funkce použit vzor <code>x_</code>, na pravé straně přiřazení ale vystupuje opět [[globální proměnná]], jež je [[druhá mocnina|umocněna na druhou]]. Druhý řádek tak odpovídá situaci, kde funkce <code>f2</code> pro jakýkoliv vstup vrátí hodnotu 25. Třetí řádek používá jak vzor <code>x_</code>, tak odložené přiřazení, které propojí hodnotu vzoru na levé straně se symbolem <code>x</code> na straně pravé. Tato poslední definice se chová očekávaným způsobem.
Ačkoli je třeba obyčejně používat odložené přiřazení, jak plyne z předchozího odstavce, někdy je přeci jen výhodné použít přiřazení přímé. A to v případě, kdy je vhodné definovat hodnotu funkce pro konkrétní hodnoty vstupů. Chceme-li například ručně definovat funkci [[sinc]], jež je pro nenulová <math>x</math> dána vztahem <math>sinc(x) = sin(x)/x</math>, přičemž pro nulové <math>x</math> dodefinovat <math>sinc(0) = 1</math>{{Poznámka|Takto definovaná funkce [[sinc]] je spojitá ve všech bodech. Také podotkněme, že ve WL existuje předdefinovaná funkce <code>Sinc</code>.}}, lze toto učinit následujícím kódem:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Sin[x]/x;
sinc[0] = 1;
</syntaxhighlight>
Výpočetní systém rozpozná, že definice na druhém řádku je specifičtější než ta na řádku prvním<ref>{{Citace elektronického periodika
| titul = The Ordering of Definitions—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#26982
| datum přístupu = 2022-10-26
}}</ref> a při volání <code>sinc[0]</code> je tak aplikována jako první, čímž obdržíme správný výsledek 1. Alternativním způsobem k výše uvedené definici je použití funkce <code>Piecewise</code>:
<syntaxhighlight lang="Mathematica">
sinc[x_] := Piecewise[{{Sin[x]/x, x != 0}}, 1]
</syntaxhighlight>
==== Memoizace ====
Někdy je výpočet hodnoty dané funkce na konkrétní vstup náročný a zdlouhavý. Pokud se tento výpočet v kódu opakuje, lze jeho výsledek dynamicky uložit jako součást definice dané funkce metodou zvanou [[memoizace]]. Mějme funkci <code>f</code>, jejíž definice zní <code>f[x_] := (tělo funkce)</code>. Pokud místo tohoto zápisu užijeme zápisu<ref>{{Citace elektronického periodika
| titul = Functions That Remember Values They Have Found—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#202640595
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
f[x_] := f[x] = (tělo funkce)
</syntaxhighlight>
dojde při každém volání funkce k vyhodnocení jejího těla pro konkrétní vstup, třeba <code>32</code>, a výsledek je uložen do výrazu <code>f[32]</code>, který se tak stává součástí definice funkce <code>f</code>. Takto lze dynamicky během běhu kódu měnit definice funkcí i jiných objektů. Viz příklady [[Wolfram Language#Fibonacciho posloupnost|„Fibonacciho posloupnost“]] a [[Wolfram Language#Faktoriál|„Faktoriál“]] v článku [[Wolfram Language]].
==== Třídy funkcí a uzávěry ====
Lze vytvářet i konstrukty s více než jen jednou hranatou závorkou, např. <code>g[x_][y_] := y^x</code>. Takto definovanou funkci lze chápat jako celou třídu funkcí, kde první vstup hraje roli parametru, jež rozlišuje mezi jednotlivými funkcemi dané třídy. Výraz <code>g[2]</code> není vyhodnocen až do chvíle, než je aplikován na nějaký vstup a lze ho chápat jako operátor [[druhá mocnina|druhé mocniny]], protože <code>f[2][x]</code> vrátí <code>x^2</code>.
Podobně se chovají [[uzávěr (programování)|uzávěry]] – funkce implementované pomocí <code>Module</code><ref name="use_cases" />, které vracejí jako hodnotu jinou funkci. Je-li při definici vnitřní funkce použit vstupní parametr funkce vnější, je tento parametr držen v definici vnitřní funkce i po opuštění těla funkce vnější{{Poznámka|Toto chování se obecně označuje jako [[uzávěr (programování)|uzávěr]] či anglicky ''closure''.}}:
<syntaxhighlight lang="Mathematica">
f[x_] := Module[{k}, (* uzávěr *)
k[y_] := x + y; (* definuj lokálně funkci k *)
k (* vrať funkci s uloženou hodnotou proměnné x *)
]
g = f[3]; (* vrátí funkci, která ke vstupu přičítá 3 *)
g[5] (* vrátí: 8 *)
</syntaxhighlight>
=== Ryzí funkce ===
WL podporuje [[anonymní funkce]], které nazývá ''ryzí funkce'' (angl. ''pure functions'')<ref name="pure">{{Citace elektronického periodika
| titul = Pure Functions—Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html#17469
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce jsou reprezentovány jako výrazy s hlavičkou <code>Function</code>, běžně se ale zapisují následující notací:
<syntaxhighlight lang="Mathematica">
(výraz obsahující symbol #) &
</syntaxhighlight>
Symbol <code>#</code> (neboli <code>Slot</code>) představuje vstupní parametr a [[ampersand]] na konci určuje, že se jedná o ryzí funkci. Pokud je vstupních parametrů více, lze každému slotu udělit číslo{{Poznámka|Výraz <code>#0</code> označuje funkci samotnou, což lze využít např. při [[Rekurze (programování)|rekurzi]].}}, viz například:
<syntaxhighlight lang="Mathematica">
(#1 + #2) & (* součet dvou vstupů *)
</syntaxhighlight>
Pokud není třeba přistupovat ke každému vstupu zvlášť, lze použít zápis <code>##n</code>, který představuje všechny vstupy od <code>n</code>-tého počínaje<ref name="pure" />. Pokud jsou vstupními parametry klíče [[asociativní pole|asociativního pole]], lze sloty pojmenovat:
<syntaxhighlight lang="Mathematica">
asoc = <|"jmeno"->"Alik", "vek"->15|>;
(#jmeno <> "u")&[asoc] (* vrátí: "Aliku" *)
</syntaxhighlight>
Ryzí funkci lze definovat i následujícím způsobem známým z [[matematika|matematiky]]<ref name="func" />{{Poznámka|Tento zápis lze použít od verze 12.2, ačkoli již v předchozích verzích lze tohoto způsobu použít, pokud se místo <code><nowiki>|-></nowiki></code> rovnou použije znak <code>\[Function]</code>.}}:
<syntaxhighlight lang="Mathematica">
x |-> (výraz obsahující symbol x)
</syntaxhighlight>
kde místo slotů použijeme pojmenované parametry. Tato syntaxe definuje funkci. Chceme-li tuto pojmenovat pro pozdější použití, lze to učinit standardním přiřazením:
<syntaxhighlight lang="Mathematica">
druhaMocnina = x |-> x^2; (* definice *)
druhaMocnina[3] (* volání, vrátí: 9 *)
</syntaxhighlight>
=== Aplikace ===
==== Pomocí zvláštní notace ====
Funkci lze na vstupní parametry aplikovat různými způsoby — buď pomocí speciálních funkcí jako <code>Apply</code>, jak je rozebráno níže, anebo pomocí odpovídající syntaxe, jak si ukážeme v následujícím. Notací pro aplikaci nějaké funkce <code>f</code> na vstupní parametry existuje několik<ref>{{Citace elektronického periodika
| titul = Special Ways to Input Expressions—Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/Expressions.html#3012
| datum přístupu = 2022-10-26
}}</ref>, viz tabulku níže:
{| class="wikitable"
|+ Aplikace funkce na vstupní parametry
! Druh !! Syntaxe !! Popis !! Příklad
|-
| Normální notace || <code>f[vstupy]</code> || vstupní parametry v [[hranaté závorky|hranatých závorkách]], před nimiž je napsáno jméno funkce || <code>Mod[5, 2] (* vrátí: 1 *)</code>
|-
| Prefixová notace || <code>f@vstup</code> || jméno funkce následované [[zavináč|zavináčem]] a vstupním parametrem || <code>Print@"Ahoj!" (* vypíše: Ahoj! *)</code>
|-
| Infixová notace || <code>vstup1~f~vstup2</code> || první a druhý vstupní parametr jsou odděleny dvěma [[vlnovka]]mi, mezi něž je vloženo jméno funkce || <code>{a, b}~Join~{c} (* vrátí: {a, b, c} *)</code>
|-
| Postfixová notace || <code>vstup//f</code> || za vstupními parametry následuje dvojité [[lomítko]] a jméno funkce || <code>{{1}, {2}}//Flatten (* vrátí: {1, 2} *)</code>
|}
Tyto notace nejsou zcela ekvivalentní. Jednak se liší v precedenci vyhodnocování<ref>{{Citace elektronického periodika
| titul = Operator Input Forms—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/OperatorInputForms.html.en
| datum přístupu = 2022-10-25
}}</ref>, jednak umožňuje prefixová a postfixová notace jen jediný vstup a infixová notace vstupy dva. V tabulce jsou notace seřazeny s klesající precedencí a tak např. <code>f @ 23 // g</code> vrátí <code>g[f[23]]</code>. Pokud jde o počet parametrů, tak lze daná omezení částečně obejít tím, že se všechny vstupní parametry vepíšou do seznamu a tento seznam se předá jako jediný parametr dané funkci, viz např. <code>f @ {a, b, c}</code>, které vrátí <code>f[{a, b, c}]</code>. Je samozřejmě nutné odpovídajícím způsobem upravit i definici funkce, má-li tato brát vstupní parametry jako prvky seznamu.
==== Pomocí funkcí vyšších řádů ====
Aplikaci libovolné funkce na vstupní parametry lze provést i pomocí funkce <code>Apply</code><ref>{{Citace elektronického periodika
| titul = Apply (@@)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/Apply.html.en
| datum přístupu = 2022-10-26
}}</ref>:
<syntaxhighlight lang="Mathematica">
Apply[f, {a, b, c}] (* vrátí: f[a, b, c] *)
f @@ {a, b, c} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Funkce <code>Apply</code> má širší okruh použití, kdy lze s pomocí jejího druhého parametru nastavit, jak se daná funkce aplikuje na vícero vstupních hodnot umístěných do seznamů či jiných výrazů:
<syntaxhighlight lang="Mathematica">
Apply[f, {{1, 2}, {3, 4}}, {1}] (* vrátí: {f[1, 2], f[3, 4]} *)
f @@@ {{1, 2}, {3, 4}} (* ekvivalentní kompaktní zápis *)
</syntaxhighlight>
Podobně se chová funkce <code>Map</code><ref name="map" />:
<syntaxhighlight lang="Mathematica">
Map[f, {1, 2, 3, 4}] (* vrátí: {f[1], f[2], f[3], f[4]} *)
f /@ {1, 2, 3, 4} (* ekvivalentní kompaktní zápis *)
Map[f, {{1, 2}, {3, 4}}, {2}] (* vrátí: {{f[1], f[2]}, {f[3], f[4]}} *)
Map[f, {{1, 2}, {3, 4}}] (* vrátí: {f[{1, 2}], f[{3, 4}]} *)
</syntaxhighlight>
Aplikaci několika funkcí lze i řetězit způsobem, který reflektuje matematické [[skládání funkcí]]. Výrazem <code>Composition[f,g]</code> či ekvivalentně <code>f @* g</code> je představována funkce, která na daný vstup <code>x</code> vrátí <code>f[g[x]]</code>. Je podporována i postfixová varianta <code>RightComposition[f,g]</code> či ekvivalentně <code>f /* g</code>, která na daný vstup <code>x</code> vrátí <code>g[f[x]]</code>. Srovnej tři řádky se stejnou funkcionalitou:
<syntaxhighlight lang="Mathematica">
f /@ (g /@ {1, 2, 3}) (* vrátí: {f[g[1]], f[g[2]], f[g[3]]} *)
f[g[#]]& /@ {1, 2, 3} (* totéž s využitím ryzí funkce *)
f @* g /@ {1, 2, 3} (* totéž s využitím skládání funkcí *)
</syntaxhighlight>
WL nabízí řadu dalších funkcí, s jejichž pomocí lze programově aplikovat funkci na různě strukturované vstupy<ref>{{Citace elektronického periodika
| titul = Functional Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>, viz např. funkce <code>Nest</code> a <code>Fold</code> v sekci [[#Cykly a jejich ekvivalenty|„Cykly a jejich ekvivalenty“]]. Dalšími funkcemi jsou např. <code>Thread</code> a <code>MapThread</code> s následující funkcionalitou:
<syntaxhighlight lang="Mathematica">
Thread[{a, b, c} -> {1, 2, 3}] (* vrátí: {a->1, b->2, c->3} *)
MapThread[f, {{a, b, c}, {1, 2, 3}}] (* vrátí: {f[a, 1], f[b, 2], f[c, 3]} *)
</syntaxhighlight>
Ve verzi 12.2 byla zavedena funkce <code>ApplyTo</code>, která zobecňuje přiřazovací operátory typu <code>*=</code> na libovolný zadaný operátor. Předpokládejme, že do [[Proměnná (programování)|proměnné]] <code>x</code> je uložena hodnota <code>h</code> a na tuto proměnnou chceme aplikovat funkci <code>f</code> a výslednou hodnotu opět uložit do proměnné <code>x</code>. Toto lze provést kódem <code>x = f[x]</code>, kde je nutno dvakrát vypsat jméno proměnné. Totéž lze provést i kódem <code>ApplyTo[x, f]</code> či ekvivalentně <code>x //= f</code>.
=== Volby ===
Chování funkce lze ovlivnit nejen vstupy, ale i ''volbami'' (angl. ''options'')<ref>{{Citace elektronického periodika
| titul = Manipulating Options—Functions and Programs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FunctionsAndPrograms.html#15639
| datum přístupu = 2022-10-26
}}</ref>, které připomínají pojmenované argumenty v [[Python]]u{{Poznámka|Na rozdíl od Pythonu ale nemusejí mimo jiné stát až na konci seznamu argumentů a nelze též tentýž parametr jednou volat jako poziční a jindy jako pojmenovaný.}}. Volby mají tvar přiřazovacích pravidel <code>nazevVolby -> jejiHodnota</code>{{Poznámka|Ve výjimečných případech je nutno použít odložené nahrazení <code>nazevVolby :> jejiHodnota</code>.}}, přičemž jejich název může být buď symbol nebo [[Textový řetězec|řetězec]]. Konkrétní hodnotu dané volby lze vepsat jako pravidlo při volání funkce do hranatých závorek spolu s ostatními argumenty. Například nadpis [[Graf funkce|graf]]u vytvořeného funkcí <code>Plot</code> lze specifikovat volbou <code>PlotLabel</code>:
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, Pi}, PlotLabel->"Graf funkce sinus"] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Hodnotu voleb lze změnit i funkcí <code>SetOptions</code> a to následovně:
<syntaxhighlight lang="Mathematica">
SetOptions[Plot, PlotLabel->"Graf funkce sinus"];
Plot[Sin[x], {x, 0, Pi}] (* nadpis grafu zní "Graf funkce sinus" *)
</syntaxhighlight>
Tento druhý způsob je vhodnější například ve chvílích, kdy je třeba měnit volbu u několikera volání téže funkce.
Volby lze dodat i do uživatelem definovaných funkcí. Nejprve je třeba výrazem <code>Options</code> určit, jaké volby má daná funkce podporovat. Do definice funkce je pak třeba vložit vzor <code>OptionsPattern[]</code>{{Poznámka|Do verze 6 se místo <code>OptionsPattern[]</code> používal vzor ve stylu <code>opts___?OptionQ</code> a místo <code>OptionValue</code> bylo nutno psát kód ve stylu <code>volba /. {opts} /. Options[funkce]</code><ref>{{Citace elektronického periodika
| titul = wolfram mathematica - What are the benefits of switching from Rule and /. to OptionsPattern[] and OptionValue in a large application?
| periodikum = Stack Overflow
| url = https://stackoverflow.com/questions/6617511/what-are-the-benefits-of-switching-from-rule-and-to-optionspattern-and-opti
| jazyk = en
| datum přístupu = 2022-10-25
}}</ref>.}} a v těle funkce pak funkcí <code>OptionValue</code> získat hodnotu dané volby<ref>{{Citace elektronického periodika
| titul = Options Management—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/OptionsManagement.html.en
| datum přístupu = 2022-10-25
}}</ref>. Jednoduchá funkce pak může vypadat následovně:
<syntaxhighlight lang="Mathematica">
Options[f] = {"MojeVolba"->True}; (* definuj volby *)
f[x_, OptionsPattern[]] := Module[{v}, (* do seznamu parametrů je vložen vzor OptionsPattern[] *)
v = OptionValue["MojeVolba"]; (* do proměnné v vlož hodnotu volby "MojeVolba" *)
If[v, x, x^2]
];
f[3, "MojeVolba"->False] (* volání funkce, vrátí: 9 *)
</syntaxhighlight>
=== Atributy ===
Každá funkce ve WL se může vyznačovat i jedním či více ''atributy'' (angl. ''attributes''), jež specifikují obecné chování funkce<ref>{{Citace elektronického periodika
| titul = Attributes—Evaluation of Expressions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/EvaluationOfExpressions.html#9508
| datum přístupu = 2022-10-26
}}</ref>{{Poznámka|Atributy ve WL nemají nic společného s datovými položkami, které se též nazývají atributy, známými z [[objektově orientované programování|objektově orientovaného programování]].}}. Seznam všech atributů dané funkce <code>f</code> lze održet voláním <code>Attributes[f]</code>. Atribut nový lze nastavit funkcí <code>SetAttributes</code> a stávající atribut lze smazat funkcí <code>ClearAttributes</code>. Například funkce <code>Sin</code>, představující [[sinus]], má ve verzi 13.1.0 atributy <code>{Listable, NumericFunction, Protected}</code>. Atribut <code>Listable</code> značí, že se má při aplikaci na seznam tato funkce aplikovat automaticky na každý člen seznamu zvlášť. Atribut <code>NumericFunction</code> říká, že funkce na číselné vstupy vrátí číselnou hodnotu a konečně atribut <code>Protected</code> značí, že funkci <code>Sin</code> nelze přímo předefinovat{{Poznámka|Atribut <code>Protected</code> lze odstranit funkcí <code>Unprotect</code> a definici funkce lze pak změnit.}}. Roli atributu <code>Listable</code> lze snadno ilustrovat na následujícím příkladu, kde je tento atribut přiřazen symbolu <code>g</code>:
<syntaxhighlight lang="Mathematica">
SetAttributes[g, Listable]; (* symbolu g je nastaven atribut Listable *)
g[{1, 2, 3}] (* vrátí: {g[1], g[2], g[3]} *)
ClearAttributes[g, Listable]; (* atribut Listable je smazán *)
g[{1, 2, 3}] (* vrátí: g[{1, 2, 3}] *)
</syntaxhighlight>
Všimněme si, že jsme výše ani žádnou definici symbolu <code>g</code> nepřiřadili. Uvedené chování je určeno čistě atributem.
Atributů existuje celá řada<ref>{{Citace elektronického periodika
| titul = Attributes—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Attributes.html.en
| datum přístupu = 2022-10-25
}}</ref>. Například atribut <code>HoldAll</code> říká, že se vstupní argumenty nemají před voláním funkce vyhodnotit. Standardně se například výraz <code>f[1+1]</code> nejprve vyhodnotí jako <code>f[2]</code> a teprve tehdy je volána funkce <code>f</code>. Pokud má <code>f</code> ale atribut <code>HoldAll</code>, je do <code>f</code> přímo zaslán výraz <code>1+1</code>, jenž je interně interpretován jako <code>Plus[1,1]</code> a lze na něm provádět v těle funkce dodatečné operace.
=== Chybová a dokumentační hlášení ===
Pro danou funkci <code>f</code> lze specifikovat text chybových hlášení syntaxí <code>f::jmeno = "text"</code>, kde <code>jmeno</code> je jméno chybové hlášky a <code>"text"</code> je její znění<ref>{{Citace elektronického periodika
| titul = Set Up Error Checking and Messages in a Function—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/workflow/SetUpErrorCheckingAndMessagesInAFunction.html.en
| datum přístupu = 2022-10-25
}}</ref>. Danou hlášku lze v těle funkce vyvolat funkcí <code>Message</code><ref>{{Citace elektronického periodika
| titul = Messages—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/Messages.html.en
| datum přístupu = 2022-10-25
}}</ref>. Srovnej
<syntaxhighlight lang="Mathematica">
f::nedelnulou = "Dělení nulou!";
f[x_, y_] := If[y == 0, Message[f::nedelnulou], x/y]
</syntaxhighlight>
Při volání funkce <code>f[x, 0]</code> vypíše tato text <code>"Dělení nulou!"</code>. Chybové hlášení může obsahovat i parametry, které se vkládají do řetězce stylem používaným funkcí <code>StringForm</code>:
<syntaxhighlight lang="Mathematica">
f::spatnyvstup = "Špatný vstup: ``";
f[x_] := If[x != 0, Message[f::spatnyvstup, x], x]
</syntaxhighlight>
Při volání <code>f[32]</code> vypíše funkce hlášení <code>"Špatný vstup: 32"</code>.
Zvláštní postavení má hlášení s vyhrazeným názvem <code>usage</code><ref name="docu" /><ref>{{Citace elektronického periodika
| titul = MessageName (::)—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/MessageName.html.en
| datum přístupu = 2022-10-25
}}</ref>, které místo chybového hlášení představuje [[dokumentační řetězec]], který se vypíše při vyvolání [[Počítačová nápověda|nápovědy]] pro danou funkci:
<syntaxhighlight lang="Mathematica">
f::usage = "Zbytečná funkce";
f[x_] := 1
?f (* vypíše "Zbytečná funkce" *)
</syntaxhighlight>
=== Pokročilé definice ===
Při volání funkce může dát editor uživateli na srozuměnou, zda je do volání třeba doplnit parametry. Například v případě, kdy uživatel napíše do volání funkce parametry dva a je přitom povolen jen jeden, je druhý parametr zvýrazněn červeně. Informaci tohoto rázu lze k definované funkci přiřadit pomocí výrazu <code>SyntaxInformation</code>. V sekci [[Wolfram Language#Pokročilá definice funkce|„Pokročilá definice funkce“]] článku [[Wolfram Language]] lze nalézt příklad definice funkce využívající tuto a další pokročilé možnosti probrané výše.
Ve WL jsou funkce interně reprezentovány jako nahrazovací pravidla v seznamech, které lze vyvolat funkcemi <code>UpValues</code>, <code>DownValues</code>, <code>OwnValues</code> či <code>SubValues</code><ref>{{Citace elektronického periodika
| titul = Associating Definitions with Different Symbols—Transformation Rules and Definitions—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972
| datum přístupu = 2022-10-26
}}</ref><ref name="assignments" /><ref>{{Citace elektronického periodika
| titul = assignment - What is the distinction between DownValues, UpValues, SubValues, and OwnValues?
| periodikum = Mathematica Stack Exchange
| url = https://mathematica.stackexchange.com/questions/96/what-is-the-distinction-between-downvalues-upvalues-subvalues-and-ownvalues
| jazyk = en
| datum přístupu = 2022-10-26
}}</ref>. Tyto funkce lze aplikovat na kterýkoliv symbol ve WL, ne jen na funkce. Seznam vrácený funkcí <code>OwnValues</code> obsahuje pravidla vyplývající z přiřazení nějaké hodnoty danému symbolu:
<syntaxhighlight lang="Mathematica">
a = 3;
OwnValues[a] (* vrátí: {HoldPattern[a]:>3} *)
</syntaxhighlight>
kde hlavička <code>HoldPattern</code> zajišťuje, že se výraz <code>a</code> automaticky nevyhodnotí na hodnotu 3. Podobně seznam <code>DownValues</code> obsahuje pravidla, jež vyplývají z přiřazení ve tvaru <code>f[var_] := telo</code> typické pro funkce:
<syntaxhighlight lang="Mathematica">
f[x_] := x^2
DownValues[f] (* vrátí: {HoldPattern[f[x_]]:>x^2 *)
</syntaxhighlight>
Funkce lze ale definovat i se dvěma a více posloupnostmi argumentů, kde je každý uzavřen mezi hranaté závorky. Takováto přiřazení jsou uchovávána v seznamu vyvolaným funkcí <code>Subvalues</code>:
<syntaxhighlight lang="Mathematica">
f[x_][y_] := x^y
SubValues[f] (* vrátí: {HoldPattern[f[x_][y_]]:>x^y *)
</syntaxhighlight>
Tím se dostáváme k poslednímu seznamu přiřazení spravovaného funkcí <code>UpValues</code><ref>{{Citace elektronického periodika
| titul = UpValues—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ref/UpValues.html.en
| datum přístupu = 2022-10-26
}}</ref>. Tato přiřazení odpovídají definicím, kdy namísto specifikování toho, jak má daná funkce působit na vstupní hodnoty, určíme pro konkrétní hodnotu, jak na ní má působit daná funkce. Uvažme situaci, kdy definujeme novou symbolickou konstantu <code>konst</code> a chceme, aby funkce [[sinus]] měla pro tuto konstatu hodnotu <math>0,2</math>, to jest <code>Sin[konst] = 0.2</code>, aniž bychom třeba konstantě samotné přiřadili jakoukoli hodnotu. Buď můžeme zasáhnout do definice předdefinované funkce <code>Sin</code> a uměle do ní vložit přiřazení <code>Sin[konst] = 0.2</code>, anebo můžeme toto přiřazení vložit do definice konstanty <code>konst</code>, čímž nedojde k jakékoliv manipulaci s definicí funkce <code>Sin</code>. Tento druhý způsob odpovídá přiřazení ve smyslu <code>UpValues</code>. Tato přiřazení mají speciální syntaxi, kde rozdíly mezi všemi čtyřmi způsoby níže leží za rámcem tohoto článku:
<syntaxhighlight lang="Mathematica">
a/:f[a] = hod (* definice pomocí TagSet *)
a/:f[a] := hod (* definice pomocí TagSetDelayed *)
f[a] ^= hod (* definice pomocí UpSet *)
f[a] ^:= hod (* definice pomocí UpSetDelayed *)
</syntaxhighlight>
Výše uvedený příklad by tak šlo definovat způsobem <code>konst/:Sin[konst] = 0.2</code>.
== Ostatní ==
V následujícím je neúplný výčet některých dalších sad funkcí seskupených podle jejich funkcionality.
=== Externí soubory ===
Data lze získat funkcí <code>Import</code>, exportovat pak funkcí <code>Export</code><ref>{{Citace elektronického periodika
| titul = Importing and Exporting—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/ImportingAndExporting.html.en
| datum přístupu = 2022-10-26
}}</ref>. Uložit definici nějaké proměnné, funkce či datové struktury lze funkcí <code>Save</code>, jež vytvoří externí [[textový soubor]], nebo funkcí <code>DumpSave</code>, jež vytvoří externí [[binární soubor]]. Získat kód z externího souboru lze funkcí <code>Get</code> (zkráceně <code><<</code>), uložit data či kód do externího souboru lze funkcí <code>Put</code> (<code>>></code>) či <code>PutAppend</code> (<code>>>></code>), která původní obsah nepřepisuje a jen přidává další obsah na konec souboru<ref>{{Citace elektronického periodika
| titul = Files, Streams, and External Operations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/FilesStreamsAndExternalOperations.html.en
| datum přístupu = 2022-10-26
}}</ref>.
<syntaxhighlight lang="Mathematica">
data = Import["staradata.txt"]; (* importuj data ze souboru "staradata.txt" *)
data >> "novadata.txt" (* zapiš hodnotu proměnné data do souboru "novadata.txt" *)
</syntaxhighlight>
=== Úprava výrazů ===
Podporováno je mnoho funkcí pro [[algebraická operace|algebraické]] a další úpravy [[symbolický výraz|symbolických výrazů]]<ref>{{Citace elektronického periodika
| titul = Algebraic Manipulation—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html.en
| datum přístupu = 2022-10-26
}}</ref><ref>{{Citace elektronického periodika
| titul = Algebraic Calculations—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html.en
| datum přístupu = 2022-10-26
}}</ref>. Zjednodušit daný výraz lze funkcí <code>Simplify</code>, která aplikuje na vstupní výraz různá transformační pravidla ve snaze tento výraz zjednodušit. Větším počtem transformačních pravidel disponuje příbuzná funkce <code>FullSimplify</code>. Je-li důležité při zjednodušení uvést i všechny podmínky, za kterých lze vstupní výraz zjednodušit, je vhodnější použít funkci <code>Reduce</code>. Řešení rovnic a jejich soustav lze funkcí <code>Solve</code>, [[logický výraz|logické výrazy]] lze zjednodušovat pomocí funkce <code>Resolve</code> apod.
<syntaxhighlight lang="Mathematica">
Simplify[Sin[x]^2 + Cos[x]^2] (* vrátí: 1 *)
Solve[x^2 + 3x + 2 == 0] (* vrátí: {{x->-2}, {x->-1}} *)
Reduce[x^2 + 3x + 2 == 0] (* vrátí: x == -2 || x == -1 *)
</syntaxhighlight>
=== Regulární výrazy ===
WL umožňuje zadávat [[regulární výraz|regulární výrazy]] dvěma způsoby. Buď lze do funkce <code>RegularExpression</code> vepsat řetězec ve stylu jazyka [[Perl]], který odpovídá danému regulárnímu výrazu, anebo lze použít ''řetězcové vzory'' (angl. ''string patterns''), které jsou řetězcovou obdobou WL vzorů<ref name="string_patterns" />. Řetězcové vzory jsou výrazy s hlavičkou <code>StringExpression</code>, které mají syntaxi velmi podobnou vzorům s hlavním rozdílem, že jednotlivé části vzoru jsou pospojovány dvojitými [[vlnovka]]mi <code>~~</code> a jsou podporovány primitivy specifické pro řetězce<ref name="strings" />. Například vzor <code>"t"~~_~~"k"</code> představuje řetězce o třech znacích, jejichž první znak je <code>"t"</code> a poslední znak je <code>"k"</code>. Takovému vzoru vyhovují například slova ''tak'', ''tik'', ''tok'', ''tuk''.
<syntaxhighlight lang="Mathematica">
StringMatchQ["tak", "t"~~_~~"k"] (* vrátí: True *)
StringMatchQ["taak", "t"~~_~~"k"] (* vrátí: False *)
</syntaxhighlight>
=== Paralelizované výpočty ===
[[Paralelizace]] je umožněna funkcemi jako <code>Parallelize</code>, <code>ParallelTable</code> či <code>ParallelDo</code><ref>{{Citace elektronického periodika
| titul = Parallel Computing Tools User Guide—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/ParallelTools/tutorial/Overview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Tímto způsobem lze buď distribuovat výpočet mezi několik výpočetních jader na jednom počítači, anebo lze výpočet poslat do [[Počítačový cluster|výpočetních clusterů]]. Výpočetní jádra se nastartují a inicializují automaticky při prvním volání funkce jako <code>ParallelTable</code>. Totéž lze ale udělat i manuálně funkcemi <code>LaunchKernels</code> a <code>DistributeDefinitions</code>. Od verze 12.2 lze odeslat kód do vzdáleného WL výpočetního jádra pomocí funkce <code>RemoteEvaluate</code> či nechat výpočet provádět na vzdálených [[server]]ech spravovaných třetími stranami pomocí funkcí jako <code>RemoteBatchSubmit</code><ref>{{Citace elektronického periodika
| titul = Remote Batch Jobs—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/guide/RemoteBatchJobs.html.en
| datum přístupu = 2022-10-26
}}</ref>.
=== Grafika ===
{{Viz též|Mathematica#Tvorba grafiky}}
WL dovoluje vytvářet dvourozměrnou [[Rastrová grafika|rastrovou]] (výraz <code>Image</code>) i [[vektorová grafika|vektorovou]] (výraz <code>Graphics</code>) grafiku a jejich trojrozměrné obdoby (<code>Image3D</code> a <code>Graphics3D</code>)<ref>{{Citace elektronického periodika
| titul = Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/GraphicsAndSoundOverview.html.en
| datum přístupu = 2022-10-26
}}</ref>. Je podporována sada [[grafické primitivum|grafických primitiv]], s nimiž lze programově vytvářet vektorovou grafiku<ref>{{Citace elektronického periodika
| titul = The Structure of Graphics and Sound—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/TheStructureOfGraphicsAndSound.html.en
| datum přístupu = 2022-10-26
}}</ref>. Pro dvourozměrnou vektorovou grafiku lze tuto kreslit přímo v editoru i manuálně, přičemž od verze 12.2 je tato funkcionalita zabalena do prostředí <code>Canvas</code>{{Poznámka|V dřívějších verzích lze v editoru vyvolat dialogové okno s kreslicími nástroji.}}. Spolu s tím lze vykreslovat [[graf funkce|grafy]] funkcí jak ve dvou tak třech rozměrech. Základními funkcemi jsou <code>Plot</code> pro vykreslení grafu reálné [[funkce (matematika)|funkce]] jedné proměnné a <code>Plot3D</code> pro vykreslení reálné funkce dvou proměnných.
<syntaxhighlight lang="Mathematica">
Plot[Sin[x], {x, 0, 2 Pi}] (* vykreslí sinusoidu v intervalu [0, Pi] *)
Graphics[{Blue, Rectangle[{0, 0}, {2, 1}]}] (* vykreslí modrý obdélník mezi body {0, 0} a {2, 1} *)
</syntaxhighlight>
=== Dynamické výrazy ===
{{Viz též|Mathematica#Interakce}}
WL podporuje tvorbu dynamicky se měnících výrazů, čímž lze přímo v editoru vytvářet interaktivní [[grafické uživatelské prostředí|grafická uživatelská prostředí]]<ref>{{Citace elektronického periodika
| titul = Custom Interface Construction—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/CustomInterfaceConstructionOverview.html.en
| datum přístupu = 2022-10-20
}}</ref>. Vysokoúrovňovou funkcí pro tvorbu interaktivního prostředí je <code>Manipulate</code>, jejímž prvním parametrem je kód, jenž se má dynamicky obměňovat, a další parametry jsou vstupní dynamické [[Proměnná (programování)|proměnné]]. Pro ilustraci je níže uveden kód, který vytvoří uživatelské prostředí, v němž je vykreslována [[sinusoida]] v mezích, které jsou dynamicky nastavovány uživatelem:
<syntaxhighlight lang="Mathematica">
Manipulate[Plot[Sin[x], {x, min, max}], {min, Pi, 2 Pi}, {max, Pi, 2 Pi}] (* vytvoří interaktivní prostředí, kde může uživatel nastavit hodnoty parametrů min a max *)
(* při každé změně parametru se dynamicky zavolá příkaz Plot a automaticky se překreslí graf sinusoidy *)
</syntaxhighlight>
Nízkoúrovňovější variantou, disponující dodatečnou funkčností, je využití hlavičky <code>Dynamic</code>, kterou lze obalit výraz, jenž se má dynamicky vyhodnocovat<ref>{{Citace elektronického periodika
| titul = Introduction to Dynamic—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/IntroductionToDynamic.html.en
| datum přístupu = 2022-10-26
}}</ref>. Jako příklad uveďme následující kód:
<syntaxhighlight lang="Mathematica">
Slider[Dynamic[x]] (* vytvoří vodorovný posuvník *)
Dynamic[x] (* zobrazí aktuální polohu posuvníku *)
</syntaxhighlight>
který zobrazí v editoru vodorovný [[Posuvník (GUI)|posuvník]], který lze [[počítačová myš|myší]] posouvat, a aktuální poloha posuvníku je zobrazena jako [[reálné číslo]] pod posuvníkem. Dynamické struktury lze vnořovat a vytvářet komplexní uživatelská prostředí, často však výměnou za zvýšené výpočetní nároky a pomalejší odezvu. Hodnoty dynamických proměnných lze [[Lokální proměnná|lokalizovat]] pomocí <code>DynamicModule</code>, čímž lze vytvářet obecnější struktury, než které jsou dostupné skrze <code>Manipulate</code>.
Systém udržuje interně seznam všech výrazů, které se mají dynamicky měnit, a aktualizuje jen ty, které jsou v daném okamžiku explicitně viditelné uživateli na obrazovce. Jinak je vyhodnocování pozastaveno. Aktualizace některých výrazů je prováděna přímo front endem bez nutnosti zatěžovat výpočetní jádro. Obecně komunikuje front end s jádrem třemi kanály<ref>{{Citace elektronického periodika
| titul = Advanced Dynamic Functionality—Wolfram Language Documentation
| periodikum = reference.wolfram.com
| url = https://reference.wolfram.com/language/tutorial/AdvancedDynamicFunctionality.html.en
| datum přístupu = 2022-09-11
}}</ref> — první kanál slouží ke standardnímu vyhodnocování příkazů, druhým kanálem posílá jádro požadavky front endu a kanál třetí, preemptivní, pak slouží k synchronnímu vyhodnocování dynamických výrazů. Takto lze současně provádět výpočty a interagovat s prostředím, aniž by čekání na uživatele znemožňovalo standardní vyhodnocování příkazů z front endu. Při větší zátěži však vyhodnocování výrazů z preemptivního kanálu může zablokovat front end.
== Odkazy ==
=== Poznámky ===
{{Poznámky}}
=== Reference ===
<references />
[[Kategorie:Matematika]]
7f5c2cb2d3qqlfi943jasoxo32k92vc