osservare quanto segue sessione di repl:^char suggerimento non è consentito per il parametro clojure defn
user=> (set! *warn-on-reflection* true)
true
user=> (defn blah [s] (for [c s] (if (Character/isDigit c) true false)))
Reflection warning, NO_SOURCE_PATH:1:31 - call to isDigit can't be resolved.
Reflection warning, NO_SOURCE_PATH:1:31 - call to isDigit can't be resolved.
#'user/blah
user=> (blah "abc123abc")
(false false false true true true false false false)
user=> (defn blah [s] (for [^char c s] (if (Character/isDigit c) true false)))
#'user/blah
user=> (blah "abc123abc")
(false false false true true true false false false)
così abbiamo usato un tipo di suggerimento ^char
per sbarazzarsi di riflessione - grandi. Ora provate la stessa cosa in un parametro di funzione:
user=> (defn blah-c [c] (if (Character/isDigit c) true false))
Reflection warning, NO_SOURCE_PATH:1:22 - call to isDigit can't be resolved.
#'user/blah-c
user=> (defn blah-c [^char c] (if (Character/isDigit c) true false))
CompilerException java.lang.IllegalArgumentException: Only long and double primitives are supported, compiling:(NO_SOURCE_PATH:1:1)
user=> (defn blah-c [^Character c] (if (Character/isDigit c) true false))
#'user/blah-c
user=> (blah-c \1)
true
user=> (blah-c \a)
false
Capisco che Clojure only supports long or double type hints for numeric primitives, e che un Java char
è un tipo di dati numerici - non c'è bisogno di spiegare che. Ma quanto sopra sembra incoerente - il tipo di suggerimento ^char
è consentito nella prima funzione all'interno dello for
, ma non nella firma della funzione di blah-c
, dove ho dovuto specificare Character
. Qual è la ragione di questo (vale a dire dal punto di vista dell'implementazione del compilatore)?
Esplosione combinatoria: per la compilazione dinamica, deve esistere un'interfaccia per ogni combinazione consentita di oggetti primitivi e oggetti. –
Sembra una risposta fantastica se si desidera ampliarla, fornire riferimenti/esempi. – noahlz
@noahlz cf. [clojure.lang.IFn] (https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/IFn.java) – kotarak