user=> ((fn [x] x) 5)
5
user=> (#(%) 5)
Execution error (ClassCastException) at user/eval1576$fn (REPL:1).
class java.lang.Long cannot be cast to class clojure.lang.IFn (java.lang.Long is in module java.base of loader 'bootstrap'; clojure.lang.IFn is in unnamed module of loader 'bootstrap')
Eu esperava que as duas funções anônimas fossem equivalentes. Eu meio que recebo o erro no segundo caso: a avaliação da função anônima produz (5)
, o que produz exatamente o mesmo erro.
No entanto, por que não estou recebendo esse erro no primeiro caso? Qual é a diferença?
#(...)
, quando há somente%
dentro e não outras coisas que signifiquem mais de um argumento, é equivalente a(fn [%] (...))
. Não a(fn [%] ...)
, que você esperava.Então
#(%)
é o mesmo que(fn [%] (%))
- é uma função que chama seu argumento como uma função sem argumentos.