clojure-italy

🇮🇹
2020-09-24T08:54:23.000300Z

🚀

2020-09-24T10:28:05.001100Z

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

2020-09-24T10:28:35.001500Z

forse con tipi primitivi ritorna direttamente il valore altrimenti un simbolo?

reborg 2020-09-24T10:43:25.003200Z

Quando quoti una form, viene quotato il contenuto della form ricorsivamente, quindi (type '+) e’ diverso da (type +)

2020-09-24T11:07:56.003400Z

ahh la ragione e' questa quindi `imdb> (type '1) java.lang.Long`

2020-09-24T11:08:14.003900Z

che longs e simili non possono diventare simboli?

2020-09-24T11:08:36.004600Z

avevo capito che il + era quotato, non capivo perche' 1 o :keyword si comportavano in modo differnte

2020-09-24T11:09:40.005200Z

mm

imdb> (type '1)
java.lang.Long
imdb> (symbol :key)
key
imdb> (type ':key)
clojure.lang.Keyword

2020-09-24T11:09:52.005400Z

e

(symbol 1)
Execution error (IllegalArgumentException) at imdb/eval26888 (REPL:22).
no conversion to symbol

2020-09-24T11:10:11.005700Z

quindi anche longs e keywords si comporano leggermente diversamente

reborg 2020-09-24T11:39:01.006800Z

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

reborg 2020-09-24T11:50:33.007100Z

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