Crystal é uma linguagem de programação compilada e orientada a objetos. Estes são alguns dos objetivos da linguagem:
Sintaxe inspirada em Ruby.
Verificação de tipos estática, mas sem ter de especificar o tipo das variáveis ou dos argumentos dos métodos.
Poder chamar código C escrevendo bindings para ele em Crystal.
Ter avaliação e geração de código em tempo de compilação, para evitar código repetitivo.
Compilar para código nativo eficiente.
O trabalho em Crystal começou em 2011, com o objetivo de criar uma linguagem com a elegância e a produtividade do Ruby, mas com o desempenho e a segurança de tipos de uma linguagem compilada. O compilador da linguagem foi inicialmente escrito em Ruby, mas foi reescrito em Crystal em 2013. Ary Borenszweig, Juan Wajnerman e Brian Cardiff desenvolveram e conceberam a linguagem.
Para declarar uma variável, usa o operador de atribuição =.
Em Crystal, as variáveis devem seguir o formato snake_case.
number = 1
puts number # => 1
number = 2
puts number # => 2
As constantes são declaradas com o mesmo operador de atribuição =, mas usam letras todas maiúsculas, conhecidas como SCREAMING_SNAKE_CASE.
NUMBER = 1
puts NUMBER # => 1
Atribuir um valor a uma constante já definida origina um erro em tempo de compilação.
NUMBER = 1
NUMBER = 2
# Error: already initialized constant NUMBER
Crystal é uma linguagem compilada, o que significa que a cada variável ou argumento de método é atribuído um tipo em tempo de compilação. O compilador é capaz de inferir o tipo de uma variável ou de um argumento de método. No entanto, em alguns casos, é necessário especificar o tipo. Os casos que exigem que se defina um tipo serão explicados em conceitos posteriores.
Os métodos são uma forma de agrupar um conjunto de instruções que podem ser reutilizadas.
Em Crystal, os métodos são frequentemente definidos numa classe, num módulo ou numa struct.
No entanto, os métodos também podem ser definidos fora de uma classe, de um módulo ou de uma estrutura.
Os métodos são declarados com a palavra-chave def, seguida do nome do método.
Em Crystal, os métodos devem ser escritos em snake_case.
Podes omitir os parênteses quando um método não tem argumentos.
Para marcar o fim de um método, tens de usar a palavra-chave end.
def hello
puts "Hello World!"
end
Usar um método que não existe para o tipo da variável ou do argumento de método origina um erro em tempo de compilação.
number = 1
number + "1"
# Error: no overload matches 'Int32#+' with type String
Os métodos podem ter argumentos. Os argumentos são dados que são passados a um método. Para poderes dar argumentos a um método, tens de especificar o nome do argumento. Em Crystal, os argumentos devem ser escritos em snake_case. Um método pode ter vários argumentos, mas os argumentos têm de ser separados por uma vírgula.
def hello(name)
puts "Hello #{name}!"
end
Os métodos também podem ter vários argumentos. Nesse caso, os argumentos têm de ser separados por uma vírgula.
def hello(name, language)
puts "Hello #{name}! You are learning #{language}."
end
Quando chamas um método que pertence a uma classe, a um módulo ou a uma struct, tens de usar o operador ponto (.).
O formato deve ser: <ClassName>.<method_name>.
Quando um método não pertence a uma classe, a um módulo ou a uma struct, basta chamá-lo escrevendo o seu nome.
Os métodos devolvem sempre implicitamente o valor da última expressão.
Quando um método tem argumentos, podes usar parênteses ao especificar os argumentos na chamada e na definição do método, assim: <method_name>(<argument_1>, <argument_2>, ...).
Quando um método não tem argumentos, os parênteses devem ser omitidos.
def hello(name)
"Hello #{name}!"
end
hello("Crystal")
# => Hello Crystal!
Quando chamas um método com vários argumentos, os argumentos devem ser separados por uma vírgula. Os argumentos têm de ser indicados pela mesma ordem dos argumentos do método.
def hello_language(name, language)
"Hello #{name}! You are learning #{language}."
end
hello_language("World", "Crystal")
# => Hello World! You are learning Crystal.
Chamar um método com o número errado de argumentos origina um erro em tempo de compilação.
hello_language("Crystal")
# wrong number of arguments for 'hello_language' (given 1, expected 2)
Em Crystal, podes usar o operador + para somar dois números.
Também podes usar o operador - para subtrair dois números.
E podes usar o operador * para multiplicar dois números.
1 + 1
# => 2
2 - 1
# => 1
2 * 2
# => 4
Em Crystal, os comentários escrevem-se com o caráter #, seguido de um espaço e do comentário.
Os comentários servem para documentar o código.
O compilador não executa os comentários.
# This is a comment