🚀
mi pare di ricordare vagamente che questo fosse un clojure gotcha che forse avevi citato tu @reborg?
scratchbook> (type (first '(+ 1 2)))
clojure.lang.Symbol
scratchbook> (type (first '(:k 1 2)))
clojure.lang.Keyword
forse con tipi primitivi ritorna direttamente il valore altrimenti un simbolo?
Quando quoti una form, viene quotato il contenuto della form ricorsivamente, quindi (type '+)
e’ diverso da (type +)
ahh la ragione e' questa quindi `imdb> (type '1) java.lang.Long`
che longs e simili non possono diventare simboli?
avevo capito che il + era quotato, non capivo perche' 1 o :keyword si comportavano in modo differnte
mm
imdb> (type '1)
java.lang.Long
imdb> (symbol :key)
key
imdb> (type ':key)
clojure.lang.Keyword
e
(symbol 1)
Execution error (IllegalArgumentException) at imdb/eval26888 (REPL:22).
no conversion to symbol
quindi anche longs e keywords si comporano leggermente diversamente
Un simbolo non puo’ iniziare con un numero https://clojure.org/reference/reader#_symbols piu’ altre regole
Il significato di (quote)
non e’ di transformare in symbol. quote
previene evaluation. In (+ 1 2)
il +
e’ sempre un symbol, ma quando e’ in parentesi ed in prima posizione, il simbolo +
viene usato da Clojure per cercare nel ns corrente (((ns-map *ns*) '+)
) ed invocare la funzione corrispondente. Quote previene evaluation, quindi vedi '+
come realmente e’. Altri tipi (numeri, keyword etc.) ritornano loro stessi quando evaluated o quoted.