Fatorial:
(ns org.pindureta.lisp)
(defn factorial [n]
(if (<= n 1)
1
(* n (factorial (- n 1)))
)
)
(defn main [args]
(def n 10)
(println (factorial 10))
)
A única diferença gritante que encontrei até agora foi o defn para declarar uma função. Pelo que li até agora, o padrão é defun.
Existe um plugin para NetBeans chamado Enclojure. Recomendo para quem quer sair um pouco da mesmice das linguagens imperativas com cara de C e expandir os horizontes.
A primeira coisa que estranhei foram os parênteses. Eles estão em toda a parte, seja para iniciar uma nova linha (esse conceito de linha de código não fica muito claro no LISP, e a tabulação no código acima foi feita só para facilitar a leitura), seja para separar blocos de código.
A notação é prefixa, ou seja, o operador vem antes dos argumentos. É o oposto do usado nas calculadoras da HP, e diferente da notação infixa que estamos acostumados.
Prefixa:(+ 1 1)
Infixa: (1 + 1)
Posfixa:(1 1 +)
No começo isso confunde um pouco, mas depois fica bem intuitivo. Caso você precise desenvolver uma operação composta, basta adicionar parênteses. Por exemplo: (* ( + 1 2) 3). Primeiro é resolvida a expressão dos parênteses internos, que retorna 3, e depois dos parênteses externos, que retorna 9. Muito simples, no geral.
Outro ponto interessante, e muito importante, é que no LISP tudo acaba se transformando em contante. Não existe alteração de valores, o que acaba com qualquer possibilidade de haver efeito colateral. É praticamente impossível você alterar um valor em um ponto e estragar outro ponto (efeito conhecido como Ação à distância).
Conforme for pegando mais macetes e aprendendo mais coisas, vou compartilhando por aqui.
Escrito por Developer