Programowanie funkcyjne/Podstawy: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przemek (dyskusja | edycje)
Przemek (dyskusja | edycje)
Linia 43: Linia 43:
*kompiluje go, dołączając do już skompilowanych fragmentów,
*kompiluje go, dołączając do już skompilowanych fragmentów,
*wykonuje wprowadzony fragment.
*wykonuje wprowadzony fragment.
<br/>
Taki fragment programu będziemy nazywać ''jednostką kompilacji''.Wykonanie jednostki kompilacji może zarówno powodować
Taki fragment programu będziemy nazywać ''jednostką kompilacji''.Wykonanie jednostki kompilacji może zarówno powodować
obliczenia wartości, jak i definiowanie nowych pojęć.
obliczenia wartości, jak i definiowanie nowych pojęć.
Każda jednostka kompilacji musi być w Ocamlu
Każda jednostka kompilacji musi być w Ocamlu
zakończona przez \codeline{;;}.
zakończona przez <tt>;;</tt>.
Ponieważ kompilator nie musi generować całego kodu od razu,
Ponieważ kompilator nie musi generować całego kodu od razu,
dlatego też taki tryb pracy nazywamy przyrostowym.
dlatego też taki tryb pracy nazywamy przyrostowym.


<program> <math>::= \{ <jednostka kompilacji> ;; \}^*</math>
<tt><program> <math>::= \{ <jednostka kompilacji> ;; \}^*</math></tt>


</p>
</p>

Wersja z 10:35, 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.in.:

  • 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, =, , , <, >, <>, ^.


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 ;;. Ponieważ kompilator nie musi generować całego kodu od razu, dlatego też taki tryb pracy nazywamy przyrostowym. <program>

::={<jednostkakompilacji>;;}*

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.