Home

Awesome

Kompilacja

$ make

REPL

Uruchanianie

$ ./repl

Ładowanie plików :l nazwapliku, np.:

> :l Prelude.yl
> :l examples.yl

REPL nie ładuje automatycznie pliku Prelude.yl z podstawowymi definicjami. REPL nie wyświetla całej zawartości leniwie obliczanych list. Do wyliczenia całej listy służy funkcja show (lub jej alias - operator prefiksowy !)

> naturals
  [ 1 <not evaled expr>]
> ! qsort [1 0 3 4]
  [ 0 1 3 4]
> show $ qsort [1 0 3 4]
  [ 0 1 3 4]
> qsort [1 0 3 4]
  [ 0 <not evaled expr>]

Run

Program można uruchomić poleceniem ./run plik1 [plik2, plik3...]. Moduł Prelude.yl zostanie dołączony automatycznie. Zostanie uruchomiana funkcja main z argumentem którego wartością jest zawartość standardowego wejścia. Na standardowe wyjście zostanie wypisana wartość zwrócona przez funkcję.

$ echo "123456" | ./run examples.yl
654321

Typy:

Składnia:

Pattern matching. Np:

sum a b = a + b;

fact 0 = 1;
fact n = n * (fact (n - 1));

sum [] = 0;
sum [x & xs] = x + (sum xs);
f [a b c] = ...;
g [first second & rest] = ...;

insert [Empty] x = [Node x [Empty] [Empty]];
insert [Node k l r] x = if (< x k) then [Node (insert l x) r] else [Node l (insert r x)];

bind [Just x] f = f x;
bind [Nothing] _ = [Nothing];

Lambda:

\x -> x * x
\a -> \b -> a + b

Let:

f x = let
      a = 1 ;
      b = \z -> z + x ;
      g 1 = 0 ;
      g x = x ;
   in
      (b a) + (g x);

Case:

case x of
  1 -> 2;
  x -> x + 1;

Identyfikatory operatorów infiksowych to nazwa operatora poprzedzona znakiem '`'. Np.:

`++ a b = a + a + b + b;
(1 ++ 2) == 6