/EP1-logica-de-progamacao

Primary LanguageClojureEclipse Public License 2.0EPL-2.0

anotações

Clojure executa forms, código que converge para um valor, um código que funciona.

A forma de uma operação é dada por:

(operador operando1 operando2 etc)

Não segue a notação infixa de operadores que nem js por exemplo:

1 + 2 + 3

Clojure possui operadores para controle de fluxo: if, do e when.

if:

(if boolean-form then-form optional-else-form)

exemplo:

(if true 1 0) => 1 (if false 1 0) => 0 (if true 1) => 1 (if false 1) => nil = null

do:

operador para uma branch de condicional executar um form:

(if true (do form1 form2 form3))

when:

é um if com do sem else.

(when true form1 form2) false is nil

verificando veracidade:

o operador ? como sufixo representa uma pergunta para o operando:

"O operando é do tipo do operador?"

e.g.:

(nil? 1) => false (nil? nil) => false (int? 1) => true

Igualdade:

O operador de igualdade retorna verdadeiro ou falso:

(= 1 1) => true (= 1 2) => false

And e Or:

and retorna o último operando caso todos sejam verdadeiros e retorna nil caso contrário or retorna o primeiro verdadeiro que encontrar e retorna o último caso contrário

(or false 1 2 3) => 3 (or false false) => false

(and 1 2 3) => 3 (and 1 false 3) => nil

Atribuição

(def name value)

name agora terá o valor de value para sempre, um const.

Vector e List e Sets e Maps

[ 1, 2 ,3 ] vector, conj adiciona no fim

( 1, 2, 3 ) list, conj adiciona no começo

Sets são conjuntos.

#{1 2 3} / hash-set / set

contains?

forms são avaliados recursivamente sobre os operandos.

Definindo funçõa:

(defn nome "documentation" [param1 param2 param3] (corpo-da-func))

é possível ler a doc de uma func com

(doc fn-name)

multiple-arity functions:

(defn fn-name ([arg1 arg2 arg3] (fn-body1) ) ([arg1 arg2] (fn-body2) ) ([arg1] (fn-body3) ) )

é uma estratégia de executar a função com valores default.

variable-arity, é para ter um número indefinido de argumentos:

(defn fn-name [&args] fn-body)

é possível misturar:

(defn fn-name [arg1 & arg2] fn-body)

desestruturação:

(defn fn-name [[arg1 arg2 & argN]] fn-body)

a função retorna como valor o último forms evaluado.

função anônima

(fn [param-list] fn-body)

usa-se % para argumento. %1 é equivalente a %. Pode-se discriminar com %1, %2, %3, etc.

(#(str %1 " e " %2) "mari" "kenzo") => mari e kenzo

closure

função que é retornada por outra função. ela possui os argumentos que estão no escopo da função criada também.