Chapter 12. Exempelprogram i GEL

Här är en funktion som beräknar fakultet:

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

Med indentering blir det:

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

Detta är en direkt portering av fakultetsfunktionen från manualsidan för bc. Syntaxen verkar liknande som i bc, men skiljer sig åt i att i GEL är det sista uttrycket det som returneras. Om funktionen return används i stället blir det:

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

Det absolut enklaste sättet att definiera en fakultetsfunktion är att använda produktloopen enligt följande. Detta är inte bara kortast och snabbast, utan också troligen den mest läsbara versionen.

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

Här är ett större exempel som i stort sett omdefinierar den inbyggda funktionen ref för att beräkna trappstegsformen för en matris. Funktionen ref är inbyggd och mycket snabbare, men detta exempel demonstrerar några av de mer komplexa funktionerna i GEL.

# Beräkna trappstegsformen för en matris
function MyOwnREF(m) = (
  if not IsMatrix(m) or not IsValueOnly(m) then
    (error("MyOwnREF: argumentet är inte en matris med bara värden");bailout);
  s := min(rows(m), columns(m));
  i := 1;
  d := 1;
  while d <= s and i <= columns(m) do (

    # Detta gör helt enkelt ankarelementet nollskilt om
    # överhuvudtaget möjligt
    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);
    
    # Här det faktiska nollandet av allt utom
    # ankarelementraderna
    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
)