Em Clojure, associar um valor a um nome designa-se por var. As vars de topo (globais) são semelhantes a constantes noutras linguagens.
As vars de topo definem-se com def:
(def fingers 10)
fingers
;;=> 10
Podes usar defn para definir uma função que recebe zero ou mais argumentos. Esta é uma função que somaria 2 números:
(defn add [x y]
(+ x y))
Esta função recebe 2 argumentos que são colocados no vetor [x y], seguidos do corpo da função, que pode conter qualquer número de expressões. O valor devolvido é sempre o resultado da avaliação da última expressão do corpo, (+ x y). Esta expressão é uma lista que representa uma chamada de função. O primeiro item da lista é a função +, que é avaliada usando os itens seguintes, x e y, como argumentos.
A função add definida acima é chamada da mesma forma:
(add 2 3)
;;=> 5
Em Clojure, só podes usar funções e valores depois de estarem definidos, ou seja, as formas são sempre avaliadas pela ordem em que aparecem.
Em Clojure, os espaços em branco não têm qualquer significado além da formatação.
As funções e as vars de Clojure organizam-se em namespaces. Um namespace agrupa funcionalidade relacionada e é definido com a macro ns:
(ns calculator)
(def pi 3.14)
(defn add [x y]
(+ x y))
Clojure suporta dois tipos de comentários. Os comentários de uma linha são precedidos por ; e a forma comment serve para impedir a avaliação de tudo o que está entre (comment e ).
Neste exercício vais escrever algum código para te ajudar a cozinhar uma lasanha fabulosa a partir do teu livro de cozinha preferido.
Tens quatro tarefas, todas relacionadas com o tempo gasto a cozinhar a lasanha.
Define a var expected-time para verificar quantos minutos a lasanha deve estar no forno. Segundo o livro de cozinha, o tempo esperado no forno, em minutos, é 40:
expected-time
;;=> 40
Define a função remaining-time que recebe como argumento os minutos reais que a lasanha já esteve no forno e devolve quantos minutos a lasanha ainda tem de permanecer no forno, com base no tempo esperado no forno, em minutos, da tarefa anterior.
(remaining-time 30)
;;=> 10
Define a função prep-time que recebe como argumento o número de camadas que adicionaste à lasanha e devolve quantos minutos gastaste a preparar a lasanha, assumindo que cada camada demora 2 minutos a preparar.
(prep-time 2)
;;=> 4
Define a função total-time que recebe dois argumentos: o primeiro é o número de camadas que adicionaste à lasanha e o segundo é o número de minutos que a lasanha já esteve no forno. A função deve devolver quantos minutos, no total, trabalhaste a cozinhar a lasanha, ou seja, a soma do tempo de preparação, em minutos, com o tempo, em minutos, que a lasanha passou no forno até ao momento.
(total-time 3 20)
;;=> 26
Inscreve-te no Exercism para aprenderes e dominares Clojure com 12 conceitos105 exercícios, e mentoria humana real, tudo grátis.