clojure-italy 2020-09-24

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?

Un simbolo non puo’ iniziare con un numero https://clojure.org/reference/reader#_symbols piu’ altre regole

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

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.

👍 1