Casting SPELs

Capítulo 6:
Creando acciones especiales en nuestro juego.

Vamos a añadir al juego algunas acciones especiales que el jugador, que eres tú, debe realizar para alcanzar el éxito. Con la primera instrucción se soldará la cadena al balde. Esta acción tiene lugar en el ático de la casa, y sólo tiene sentido cuando la acción no ha sido previamente ejecutada. Para controlar esto se define una nueva variable global, que indicará si la soldadura se ha llevado ya a cabo o no. También debe el jugador llevar consigo la cadena y el balde. La respuesta de la instrucción weld depende de muchas condiciones; si todas ellas se verifican, se soldará la cadena, esto es, la variable global chain_welded tomará el valor true.

chain_welded: false$

infix("weld")$
"weld"(subject,object):=
  if location='attic 
     and subject='chain
     and object='bucket
     and have('chain) and have('bucket)      
     and not chain_welded then (
        chain_welded: true,
        "the chain is now securely welded to the bucket. ")
  else  "you cannot weld like that. "$

Puesto que en este caso se van a aportar dos argumentos, se define la instrucción como un operador-infijo. En este punto no debe preocuparnos si los conceptos sujeto y objeto tienen aquí sentido gramatical. Se supone que el lector no se preocupa por dotar a las instrucciones de formas lingüísticas elegantes.

chain weld bucket;

==> you cannot weld like that.

Obviamente no todas las condiciones se cumplen.

Una vez la cadena esté firmemente soldada al balde podremos extraer agua del pozo.

bucket_filled: false$

infix("dunk")$
"dunk"(subject,object):=
  if location='garden 
     and subject='bucket
     and object='well
     and have('bucket) then (
        if chain_welded then (
           bucket_filled: true,
           "the bucket is now full of water. ")
        else "the water level is too low to reach.")
  else  "you cannot dunk like that. "$

Vemos que las instrucciones weld y dunk son parecidas; ambas comprueban que el lugar, el sujeto y el objeto concuerdan. Se ve también que hay suficientes diferencias como para que no sea posible encajar todo en una única función. Pero como ya queda dicho, Maxima se construye sobre Lisp, lo cual significa que también para este problema hay solución: SPELs.

Introducción | Capítulo 1 | Capítulo 2 | Capítulo 3 | Capítulo 4 | Capítulo 5 | Capítulo 6 | Capítulo 7 | Agradecimientos | Licencia

© Mario Rodríguez Riotorto, 2006