Fork me on GitHub
#clojure-italy
<
2020-09-24
>
andrea.crotti10:09:05

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

andrea.crotti10:09:35

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

reborg10:09:25

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

andrea.crotti11:09:56

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

andrea.crotti11:09:14

che longs e simili non possono diventare simboli?

reborg11:09:01

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

andrea.crotti11:09:36

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

andrea.crotti11:09:40

mm

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

andrea.crotti11:09:52

e

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

andrea.crotti11:09:11

quindi anche longs e keywords si comporano leggermente diversamente

reborg11:09:33

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.

👍 3