Traductores e Intérpretes UCAB : Razor
This page last changed on Dec 12, 2006 by juanca.
IntroducciónRazor es un Lenguaje de Programacion diseñado para aplicaciones en control e inteligencia artificial como las de robótica. Razor está inspirado en ideas y conceptos de los lenguajes de progrmación OCCAM, LISP, y ML y los espacios de tuplas, como los impementados en el Lenguaje de Programacion Linda. Un programa en Razor consiste en una serie de procesos concurrentes que intercambian información a través de un espacio de tuplas.
SintaxisUn programa en Razor consiste en combinaciones de un grupo pequeño expresiones e instrucciones básicas. ComentariosLos comentarios en Razor comiencan con la secuencia "//" y continúan hasta el final de la línea. ExpresionesLas expresiones en Razor son las siguientes:
La variable especial "_"La variable especial "_" (underscore) puede usarse en cualquier expresión cuando la expresión requiere una variable en cuyo valor no estamos interesados. La variable especial "_" descarta inmediatamente cualquier valor asignado a la misma. InstruccionesLas instrucciones básicas en Razor son lecturas y escrituras sobre canales, donde un canal está identificado por un identificador de canal: Instrucciones básicas
Expresiones de EscrituraEn todas las instrucciones de escritura las expresiones que conforman la tupla escrita deben evaluar a un átomo. Expresiones de lecturaLas instrucciones de lectura pueden introducir una única variable en cada expresión de la tupla escrita, por ejemplo: sensor?[Valor >= 10 && Valor <= 20, Hora] Lecturas parcialesTambién es posible colocar la cola de una tupla leida en una variable: lista?[Primero]::Resto lista<-Resto Si la variable para la cola se substituye por el símbolo de lectura, el efecto es el mismo que el del ejemplo anterior: lista?[Primero]::<- lee el primer elemento de la tupla obtenida del canal, y coloca el resto en el canal, sin bloquear el proceso. Tuplas vacíasEs posible escribir y leer tuplas vacías: c![] c->[] Instrucciones VacíasSe permiten las instrucciones vacías. Es buen estilo usar la expresión "()" para dejar la intención clara. ++(c?_.()|c#[_==0].<>) // vaciar un canal
Composición de InstruccionesLas instrucciones básicas pueden ser compuestas usando los siguientes operadores:
FuncionesEs posible definir funciones en razor usando la siguiente sintaxis: nombre[v1,..,vn] :- instrucción Donde v1,..,vn son variables (incluyendo la variable especial '_'). El resultado de la función es el contenido del canal especial '@'. La función especial startLa función especial start es usada por el ambiente de ejecución de Razor para darle inicio al programa. Una vez que un programa es cargado, la máquina virtual ejecuta el equivalente a la siguiente instrucción: start[arg 1, arg 2, ..., arg n] donde arg 1, arg 2, ..., arg n son los argumentos pasados al programa en la línea de comandos. CanalesEn Razor los canales son el medio que sirve para:
Un canal está identificado por cualquier átomo. El canal especial @En cada proceso existe un canal especial reservado el cual es denotado por la expresión @. Solo el proceso en contexto tiene acceso a dicho canal. Usando el canal reservado es posible introducir nuevos canales locales sin afectar a otros procesos: @<-[expresión].@?[expresión] Sub-canalesUn canal en razor puede contener sub-canales. Se accede a un sub-canal nombrándolo después del super-canal antecedido de ":": canal:subcanal:sub_sub_canal<-[info] Las lecturas sobre un canal c también examinan el contenido de todos sus subcanales c:s recursivamente. Otros canales especialesCada implementación de Razor predefine una serie de canales correspondientes bien sea a elementos sujetos a control, o a espacios correspondientes a bases de datos preexistentes. En todos los casos, se garantiza que por lo menos los siguientes canales están predefinidos:
Estructura de un programa RazorUn programa en Razor consiste en una serie funciones. La función especial start es llamada por el ambiente de ejecución para iniciar el programa. EjemplosCopiar la entrada a la salida.start[_] :- // el canal start es escrito por el ambiente de ejecución in?T. // lee la tupla de entrada completa en una variable out!T Copiar la entrada a la salida, un caracter por línea.start[_] :- in?T. copia[T] copia[L] :- @:cp<-L. // coloca el valor en un canal local ( @:cp?[] // si se lee la tupla vacía, terminamos | ( @:cp?[C]::Resto. out![C,'\n']. copia[Resto] // llamada recursiva ) ) otra versión del mismo programa podría usar: copia[L] :- @:cp<-L. ++( // repetir @.cp?[].<> // rompe el lazo si se lee una tupla vacía | @:cp?[C]::<-. // sintaxis especial para lectura y reescritura de la cola out![C,'\n'] ) Emitir un sonido cada vez que la entrada contiene el caracter "!".bang[L] :-
@:check<-L.
++( // solo una de las siguientes instrucciones se ejecuta
@:check?[].<>
|
@:check?['!']::<-.sound![100,10]
|
@:check?[_ /= '!']::<-
)
Copiar la entrada a la salida, un caracter por línea, emitiendo un sonido cada vez que se consigue el caracter "!".start[_] :- in?T. { copia[T], bang[T] } // ejecutar ambas escrituras en paralelo // cada canal recibe su propia copia de la tupla otra versión (no completamente equivalente) del mismo programa sería: start[_] :- . in?T. copia[T].bang[T] Semántica de un programa Razor
|
Document generated by Confluence on Oct 04, 2010 11:25 |