Crystal es un lenguaje de programación compilado y orientado a objetos. Estos son algunos de los objetivos del lenguaje:
Sintaxis inspirada en Ruby.
Tipado estático, pero sin tener que especificar el tipo de las variables ni de los argumentos de los métodos.
Poder llamar a código C escribiendo bindings hacia él en Crystal.
Contar con evaluación y generación de código en tiempo de compilación, para evitar el código repetitivo.
Compilar a código nativo eficiente.
El trabajo en Crystal comenzó en 2011 con el objetivo de crear un lenguaje con la elegancia y la productividad de Ruby, pero con el rendimiento y la seguridad de tipos de un lenguaje compilado. El compilador del lenguaje se escribió inicialmente en Ruby, pero se reescribió en Crystal en 2013. Ary Borenszweig, Juan Wajnerman y Brian Cardiff desarrollaron y diseñaron el lenguaje.
Para declarar una variable, usa el operador de asignación =.
En Crystal, los nombres de las variables deben usar el formato snake_case.
number = 1
puts number # => 1
number = 2
puts number # => 2
Las constantes se declaran con el mismo operador de asignación =, pero sus nombres usan todas las letras en mayúsculas, lo que se conoce como SCREAMING_SNAKE_CASE.
NUMBER = 1
puts NUMBER # => 1
Asignar un valor a una constante ya definida produce un error en tiempo de compilación.
NUMBER = 1
NUMBER = 2
# Error: already initialized constant NUMBER
Crystal es un lenguaje compilado, lo que significa que a cada variable o argumento de método se le asigna un tipo en tiempo de compilación. El compilador es capaz de inferir el tipo de una variable o de un argumento de método. Sin embargo, en algunos casos es necesario especificar el tipo. Los casos en los que hay que indicar un tipo se explican en conceptos posteriores.
Los métodos son una forma de agrupar un conjunto de instrucciones que se pueden reutilizar.
En Crystal, los métodos suelen definirse dentro de una clase, un módulo o un struct.
Sin embargo, los métodos también se pueden definir fuera de una clase, un módulo o un struct.
Los métodos se declaran con la palabra clave def, seguida del nombre del método.
En Crystal, los nombres de los métodos deben escribirse en snake_case.
Puedes omitir los paréntesis cuando un método no tiene argumentos.
Para marcar el final de un método, debes usar la palabra clave end.
def hello
puts "Hello World!"
end
Usar un método que no existe para el tipo de una variable o de un argumento de método produce un error en tiempo de compilación.
number = 1
number + "1"
# Error: no overload matches 'Int32#+' with type String
Los métodos pueden tener argumentos. Los argumentos son datos que se pasan a un método. Para poder darle argumentos a un método, debes especificar el nombre del argumento. En Crystal, los nombres de los argumentos deben escribirse en snake_case. Un método puede tener varios argumentos, pero hay que separarlos con una coma.
def hello(name)
puts "Hello #{name}!"
end
Los métodos también pueden tener varios argumentos. En ese caso, los argumentos deben separarse con una coma.
def hello(name, language)
puts "Hello #{name}! You are learning #{language}."
end
Cuando llamas a un método que pertenece a una clase, un módulo o un struct, debes usar el operador punto (.).
El formato debe ser: <ClassName>.<method_name>.
Cuando un método no pertenece a una clase, un módulo o un struct, basta con llamarlo escribiendo su nombre.
Los métodos siempre devuelven de forma implícita el valor de la última expresión.
Cuando un método tiene argumentos, puedes usar paréntesis al especificarlos tanto en la llamada como en la definición del método, así: <method_name>(<argument_1>, <argument_2>, ...).
Cuando un método no tiene argumentos, hay que omitir los paréntesis.
def hello(name)
"Hello #{name}!"
end
hello("Crystal")
# => Hello Crystal!
Cuando llamas a un método con varios argumentos, estos deben separarse con una coma. Los argumentos deben indicarse en el mismo orden que los argumentos del método.
def hello_language(name, language)
"Hello #{name}! You are learning #{language}."
end
hello_language("World", "Crystal")
# => Hello World! You are learning Crystal.
Llamar a un método con un número incorrecto de argumentos produce un error en tiempo de compilación.
hello_language("Crystal")
# wrong number of arguments for 'hello_language' (given 1, expected 2)
En Crystal, puedes usar el operador + para sumar dos números.
También puedes usar el operador - para restar dos números.
Y puedes usar el operador * para multiplicar dos números.
1 + 1
# => 2
2 - 1
# => 1
2 * 2
# => 4
En Crystal, los comentarios se escriben con el carácter #, seguido de un espacio y luego el comentario.
Los comentarios sirven para documentar el código.
El compilador no ejecuta los comentarios.
# This is a comment