Kapitola 12. Příklad programů v jazyce GEL

Zde je funkce, která vypočítává faktoriály:

function f(x) = if x <= 1 then 1 else (f(x-1)*x)

Naformátovaná odsazováním vypadá takto:

function f(x) = (
  if x <= 1 then
    1
  else
    (f(x-1)*x)
)

Tady je přímá portace funkce pro výpočet faktoriálu z manuálové stránky bc. Syntaxe vypadá podobně jako u bc, s tím rozdílem v jazyce GEL, že poslední výraz je to, co je vráceno. Pokud by se místo toho použila funkce return, vypadalo by to takto:

function f(x) = (
  if (x <= 1) then return (1);
  return (f(x-1) * x)
)

Nejjednodušším způsobem, jak definovat funkci pro výpočet faktoriálu by bylo použití násobení ve smyčce, jak je ukázáno níže. Nejde pravděpodobně o nejkratší a nejrychlejší řešení, ale je to nejlépe čitelná verze.

function f(x) = prod k=1 to x do k

Následuje větší příklad, který v podstatě předefinovává interní funkci ref, aby vypočítávala odstupňovaný kanonický tvar matice. Funkce ref je vestavěná a mnohem rychlejší, ale tento příklad má ilustrovat některé komplexnější vlastnosti jazyka GEL.

# Calculate the row-echelon form of a matrix
function MyOwnREF(m) = (
  if not IsMatrix(m) or not IsValueOnly(m) then
    (error("MyOwnREF: argument not a value only matrix");bailout);
  s := min(rows(m), columns(m));
  i := 1;
  d := 1;
  while d <= s and i <= columns(m) do (

    # This just makes the anchor element non-zero if at
    # all possible
    if m@(d,i) == 0 then (
      j := d+1;
      while j <= rows(m) do (
        if m@(j,i) == 0 then
          (j=j+1;continue);
        a := m@(j,);
        m@(j,) := m@(d,);
        m@(d,) := a;
        j := j+1;
        break
      )
    );
    if m@(d,i) == 0 then
      (i:=i+1;continue);
    
    # Here comes the actual zeroing of all but the anchor
    # element rows
    j := d+1;
    while j <= rows(m)) do (
      if m@(j,i) != 0 then (
        m@(j,) := m@(j,)-(m@(j,i)/m@(d,i))*m@(d,)
      );
      j := j+1
    );
    m@(d,) := m@(d,) * (1/m@(d,i));
    d := d+1;
    i := i+1
  );
  m
)