Hoje, tentei avaliar uma expressão Clojure com funções abreviadas aninhadas, e isso não me deixou.
A expressão foi:
(#(+ % (#(+ % (* % %)) %)) 5) ; sorry for the eye bleed
A saída foi:
IllegalStateException Nested #()s are not allowed clojure.lang.LispReader$FnReader.invoke (LispReader.java:630)
...and a bunch of other garbage
functional-programming
syntax
clojure
functions
Lincoln Bergeson
fonte
fonte
Respostas:
Você saberia que% pertence à função interna. A desvantagem é que você perderia acesso ao% na função externa.
Use a
fn [x]
sintaxe.fonte
%
arquivo externo e, nas vezes em que você fez isso, você poderia voltar(fn)
, certo?É completamente arbitrário; há algumas linhas no analisador que o desabilitam explicitamente. Se você editar essa linha, poderá ter funções anônimas aninhadas e elas agem exatamente como você esperaria.
especificamente, linhas 634-635 em https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java
fonte
fn [x]
reescrever o código do OP teria funcionalidade idêntica a uma versão modificada do clojure. Além disso, haveria algum problema com a portabilidade do código de clojure?Você pode ter funções anônimas aninhadas do tipo (fn [params] (body)). Apenas a sintaxe # não suporta aninhamento.
fonte