Programowanie funkcyjne/Podstawy: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
Linia 8: | Linia 8: | ||
Nasza dziedzina algorytmiczna zawiera m.inn.: | Nasza dziedzina algorytmiczna zawiera m.inn.: | ||
* typy: <tt>bool, int, float, char, string </tt>, | * typy: <tt> bool, int, float, char, string </tt>, | ||
* stałe: logiczne ( | * stałe: logiczne (<tt>true</tt> i <tt>false</tt>), całkowite (np.: 0, 1, -2), rzeczywiste (np.: 2.3, -3.4, 4.5e-7), znakowe (np.: <tt>'a'</tt>, napisy (np. <tt>"ala ma kota"</tt>). | ||
* procedury: | * procedury: <tt>+, -, *, /, mod, +., -., *., /., ||, &&, not,</tt> <math>=</math>, <math>\le</math>, <math>\ge</math>, <math><</math>, <math>></math>, <math><></math>, \codeline{^}. | ||
Powtórka: rozróżnienie symboli od ich interpretacji. | Powtórka: rozróżnienie symboli od ich interpretacji. |
Wersja z 10:28, 17 lip 2006
Wstęp
W każdym języku programowania mamy trzy rodzaje konstrukcji językowych:
- podstawowe symbole (typy, wartości, operacje, relacje, itp.) --- pochodzące z dziedziny algorytmicznej,
- sposoby konstrukcji --- czyli jak z prostszych całości budować bardziej skomplikowane,
- sposoby abstrakcji --- czyli jak złożone konstrukcje mogą być nazwane i dalej wykorzystywane tak, jak podstawowe elementy.
Nasza dziedzina algorytmiczna zawiera m.inn.:
- typy: bool, int, float, char, string ,
- stałe: logiczne (true i false), całkowite (np.: 0, 1, -2), rzeczywiste (np.: 2.3, -3.4, 4.5e-7), znakowe (np.: 'a', napisy (np. "ala ma kota").
- procedury: +, -, *, /, mod, +., -., *., /., ||, &&, not, , , , , , , \codeline{^}.
Powtórka: rozróżnienie symboli od ich interpretacji.
BNF
Gramatyka bezkontekstowa jako sposób opisu związku między zapisem, a drzewem rozbioru gramatycznego. Opisując składnię języka będziemy się posługiwać notacją BNF (rozszerzenie gramatyk bezkontekstowych), ale bez przesadnego formalizmu. Opis notacji:
- <konstrukcja>,
- ,
- słowo kluczowe,
- ,
- ,
- ,
- ,
- .
Tego formalizmu będziemy używać do opisu składni.
Przyrostowy tryb pracy
Kompilator Ocamla działa w sposób inkrementacyjny, tzn. działa w cyklu powtarzając następujące czynności:
- wczytuje fragment programu,
- kompiluje go, dołączając do już skompilowanych fragmentów,
- wykonuje wprowadzony fragment.
Taki fragment programu będziemy nazywać jednostką kompilacji.Wykonanie jednostki kompilacji może zarówno powodować obliczenia wartości, jak i definiowanie nowych pojęć. Każda jednostka kompilacji musi być w Ocamlu zakończona przez \codeline{;;}. Ponieważ kompilator nie musi generować całego kodu od razu, dlatego też taki tryb pracy nazywamy przyrostowym. <program>
Wyrażenia
Najprostsza jednostka kompilacji i podstawowa konstrukcja programistyczna, to wyrażenie. Wyrażenia budujemy w standardowy sposób za pomocą stałych, procedur i nawiasów. Jedynym odstępstwem jest to, że argumenty procedur nie muszą być objęte nawiasami i pooddzielane przecinkami. Operacje, które standardowo zapisujemy infiksowo (np. operacje arytmetyczne) mają również postać infiksową. Rozróżniamy operacje arytmetyczne na liczbach całkowitych i rzeczywistych --- te ostatnie mają dodaną kropkę.
\tt 486;; \textsl{- : int = 486} 137 + 349;; \textsl{- : int = 486} 18 * 27;; \textsl{- : int = 486} 1000 - 514;; \textsl{- : int = 486} 1*2*3*4*5*6 - (7*8*9 - 3*12) / (3*4 - 2*5);; \textsl{- : int = 486} 5832.0 /. 12.0;; \textsl{- : float = 486.} "ala" ^ " ma " ^ "kota";; \textsl{- : string = "ala ma kota"}
Wszystko, czego potrzeba do budowy wyrażeń, to:
- stałe (liczbowe, napisy, lub nazwy stałych),
- zastosowanie procedury do argumentów,
- nawiasów.
Zauważmy, że procedury i ich argumenty są tu traktowane na równi --- takie symbole jak \codeline{+} czy \codeline{*} to po prostu nazwy stałych, których wartościami są procedury wbudowane w język programowania, a \codeline{123}, \codeline{486.5}, czy \codeline{"ala"} to stałe.