Citrine es un lenguaje de programación de propósito general para diversos sistemas operativos . Se centra en la legibilidad y la mantenibilidad. La legibilidad se logra mediante el minimalismo sintáctico y conceptual. El lenguaje está fuertemente inspirado en Smalltalk y Self , pero posee algunas características distintivas. Al igual que Smalltalk, Citrine trata todo como un objeto y se enfoca en enviar mensajes a estos objetos. Sin embargo, a diferencia de Smalltalk, Citrine carece del concepto de clase. En este sentido, Citrine se asemeja más a Self y JavaScript, ya que utiliza prototipos . La combinación de mensajes al estilo Smalltalk y prototipos es lo que hace que Citrine sea único.
Desde la versión 0.7, Citrine se ha centrado en utilizar formularios basados en diversos lenguajes naturales en lugar de solo inglés, mejorando la usabilidad para usuarios de otros idiomas y, por lo tanto, reduciendo el esfuerzo de programación y la incidencia de errores. Por ello, Citrine 0.7 y versiones posteriores incluyen una función para transformar código entre lenguajes naturales.
Sintaxis
Citrine tiene una sintaxis muy limitada, muy similar a Smalltalk. En Citrine, todo es un objeto . Hay 5 literales:
NilTrue, False0,1,2,3'String'{ ...params.. ...block of code... }
El bloque de código literal utiliza el símbolo de tubería ⟨|⟩ para separar los parámetros de la lógica; si no hay parámetros, se debe utilizar la barra invertida en su lugar.
Citrine solo admite comentarios de línea completa, que comienzan con ⟨#⟩.
Un programa Citrine es básicamente una secuencia de mensajes enviados a objetos. Por ejemplo, para determinar si 5 es un número par, se envía el mensaje '¿par?' al número 5.
¿5 incluso?Esto se denomina mensaje unario , ya que no requiere argumentos. Un mensaje binario siempre consta de un único carácter UTF-8; esto difiere de Smalltalk, donde existe un conjunto fijo de mensajes binarios. He aquí un ejemplo:
6 + 7 .Aquí se envía un mensaje binario '+' al número 6, cuyo argumento es '7'. Esto da como resultado el nuevo objeto numérico '13'. Para asignar el resultado de esta operación a una variable, se utiliza el operador de asignación: :=.
total := dinero + deuda .Además, cada línea de un programa Citrine termina con un punto, al igual que en Smalltalk. Junto con los mensajes unarios y binarios, Citrine ofrece mensajes con palabras clave , que aceptan argumentos intercalados con el propio mensaje, al igual que Smalltalk y Objective-C .
☞ x := Número entre: 1 y: 5 .El fragmento de código anterior devolverá un objeto booleano True .
Flujo de control
Al igual que en Smalltalk, el flujo de control en Citrine se implementa mediante el uso estratégico de mensajes. Por ejemplo, escribir una instrucción condicional requiere enviar un bloque de código a una variable booleana.
( dinero > precio ) verdadero: { ✎ escribir: 'Sí, puedes pagarlo' . }. De igual modo, un bucle for se escribe como:
{ : paso ✎ escribir: 'este es el paso:' + paso . } × 10 .Para salir de un bucle en Citrine, hay que enviar el mensaje 'break' a una variable booleana. Esto permite salir de un bucle de forma condicional sin tener que factorizar las condiciones de salida:
{ : i ( i = 3 ) break . ✎ escribir: i . } * 5 .oleoductos
A diferencia de Smalltalk, Citrine no utiliza punto y coma para enviar un mensaje al destinatario original. En su lugar, Citrine emplea la coma (,) para encadenar mensajes con palabras clave, lo que permite escribir secuencias de comandos al estilo Unix . El siguiente código utiliza una sintaxis similar a la de las secuencias de comandos para reemplazar todos los caracteres 'o' por ceros; la cadena resultante sería algo como: '1010101...'.
unosYceros := '1o1o1o1o1o1' dividir: 'o' , mapear: mapUp , unir: '0' .Prototipos
La mayor diferencia con Smalltalk es el uso de prototipos. Citrine no tiene el concepto de clase, sino que solo conoce objetos. Un objeto se crea utilizando el nuevo mensaje:
gato := Objeto nuevo .Se puede hacer que este objeto responda a los mensajes ordenándole que escuche los eventos, de forma similar a como se añaden métodos en lenguajes como Java :
gato en: 'miau' hacer: { Pluma escribir: '¡miau!' . }. Como se indicó anteriormente, la herencia se basa en prototipos. Para derivar un objeto de otro, se debe enviar el nuevo mensaje al objeto que se va a extender:
☞ Animal := Objeto nuevo . Animal en: 'makeSound' hacer: { ✎ escribir: '?' . }. ☞ Gato := Animal nuevo . Gato en: 'makeSound' hacer: { ✎ escribir: '¡miau!' . }. ☞ Tom := Gato nuevo . Tom haceSonido .Unicode
Citrine utiliza ampliamente el código Unicode UTF-8; tanto los objetos como los mensajes pueden constar de símbolos Unicode. La longitud de todas las cadenas se calcula utilizando UTF-8. Citrine distingue la longitud y el tamaño de las cadenas en bytes.
longitud del 'texto' .Devuelve la longitud de la cadena en puntos de código UTF-8, mientras que:
bytes de 'texto' .Devuelve el número de bytes.
Alcance
Citrine utiliza ámbito dinámico en lugar de ámbito léxico . Por lo tanto, no es necesario usar inyección de dependencias ni variables globales, aunque su comprensión puede ser más compleja que la del ámbito léxico. Esto es similar en lenguajes de programación como Emacs Lisp y BASIC . En los bloques de código , se debe usar la palabra clave `var` para declarar una variable local.
La siguiente demostración hace que el objeto Mailer esté disponible en el módulo:
Aplicación := { ☞ mailer := Mailer nuevo . módulo ejecutar . }. Véase también
- Lenguaje de programación Smalltalk
Referencias
- Demostración en la comunidad de nuevos lenguajes de programación
- Reseña de Citrine Jaxenter
- Anuncio en Reddit
- Entrevista con InfoWorld
- Índice de Tiobe
Enlaces externos
- Sitio web oficial
- Código fuente , Código fuente en GitHub
- Familia de lenguajes de programación Smalltalk
- Lenguajes de programación procedimental