As charlists são criadas com o sigil ~c.
~c"hello"
Observe que em versões mais antigas do Elixir, as charlists são representadas como 'hello', com aspas simples.
Apesar de parecerem muito com strings, os dois tipos de dados são bem diferentes entre si. Uma charlist é uma lista de números inteiros. Esses números representam os valores Unicode de um determinado caractere, também conhecidos como pontos de código.
[65, 66, 67]
# => ~c"ABC"
Você pode colocar um ? antes de um caractere para obter o ponto de código dele.
?A
# => 65
[?:, ?)]
# => ~c":)"
Como charlists são listas, você pode trabalhar com elas como com qualquer outra lista: usando recursão e correspondência de padrões.
[first_letter | _] = ~c"cat"
first_letter
# => 99
Você pode concatenar duas listas usando ++.
~c"hi" ++ ~c"!"
# => ~c"hi!"
Quanto maior for a primeira lista, mais lenta é a concatenação, então evite adicionar repetidamente ao final de listas de tamanho arbitrário.
case é uma estrutura de controle de fluxo que permite comparar um determinado valor com vários padrões. As cláusulas de uma expressão case são avaliadas de cima para baixo, até que uma correspondência seja encontrada.
age = 15
case age do
0 -> ~c"infant"
age when age < 4 -> ~c"baby"
age when age < 13 -> ~c"child"
age when age < 18 -> ~c"teenager"
_ -> ~c"adult"
end
# => ~c"teenager"
Você trabalha como administrador de sistemas em uma grande empresa em Munique, na Alemanha. Uma das suas responsabilidades é gerenciar contas de e-mail.
Você anda ouvindo reclamações de pessoas que dizem não conseguir escrever e-mails para o Sr. Müller. Você logo percebe que a maior parte da empresa usa um cliente de e-mail antigo que não reconhece müller@firma.de como um endereço de e-mail válido por causa do caractere não ASCII.
Convencer as pessoas a abandonar o cliente de e-mail antigo preferido delas é uma batalha perdida, então você decide criar aliases higienizados para todas as contas de e-mail.
Implemente a função sanitize/1. Ela deve receber um nome de usuário como uma charlist e retornar o nome de usuário com todos os caracteres removidos, exceto as letras minúsculas.
Username.sanitize(~c"schmidt1985")
# => ~c"schmidt"
Estenda a função sanitize/1. Ela não deve remover os underscores do nome de usuário.
Username.sanitize(~c"mark_fischer$$$")
# => ~c"mark_fischer"
Existem 4 caracteres não ASCII no alfabeto alemão, e todos eles têm substitutos ASCII amplamente reconhecidos.
| Caractere alemão | Substituto ASCII |
|---|---|
| ä | ae |
| ö | oe |
| ü | ue |
| ß | ss |
Estenda a função sanitize/1. Ela deve substituir os caracteres alemães de acordo com a tabela. Você pode assumir tranquilamente que todos os nomes de usuário já estão em minúsculas.
Username.sanitize(~c"cäcilie_weiß")
# => ~c"caecilie_weiss"
Crie sua conta no Exercism para aprender e dominar Elixir com 58 conceitos168 exercícios e mentoria humana de verdade, tudo de graça.