Capítulo 12. Programas de ejemplo en GEL

Esto es una función que calcula factoriales:

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

Con sangría se convierte:

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

Esto es un puerto directo de la función factorial desde la página principal bc. La sintaxis es similar a bc, pero diferente en que en GEL, la última expresión es la única que se devuelve. Utilizar la función return en su lugar, esto será:

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

Con mucho, la manera más fácil de definir una función factorial será usar el lazo del producto como sigue. No es sólo la manera más corta y más rápida, sino probablemente la versión mas legible.

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

He aquí un ejemplo más extenso, esto básicamente redefine la función interna ref para calcular la fila escalar de una matriz. La función ref se construye de manera mucho más rápida, pero este ejemplo demuestra algunas de las características más complejas de 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
)