This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2017-09-27
Channels
- # beginners (34)
- # boot (15)
- # cider (7)
- # cljs-dev (7)
- # cljsjs (2)
- # cljsrn (46)
- # clojure (130)
- # clojure-argentina (1)
- # clojure-colombia (2)
- # clojure-greece (1)
- # clojure-italy (53)
- # clojure-losangeles (1)
- # clojure-russia (15)
- # clojure-spec (8)
- # clojure-uk (100)
- # clojurescript (117)
- # core-matrix (1)
- # cursive (24)
- # datomic (41)
- # duct (1)
- # emacs (11)
- # fulcro (22)
- # graphql (4)
- # hoplon (3)
- # jobs (1)
- # lein-figwheel (3)
- # luminus (18)
- # lumo (52)
- # off-topic (57)
- # pedestal (2)
- # planck (12)
- # re-frame (22)
- # remote-jobs (1)
- # ring-swagger (6)
- # rum (7)
- # shadow-cljs (13)
- # yada (19)
Oggi abbiamo preso la nuova macchina per l’espresso in ufficio 😄
(Che essendo in Finlandia è una grande notizia)
Yep. Non è troppo male, penso sia meglio della moka, e fa una bella cremina
Le nespresso sono molto buone, e pensavo di prenderla per casa
Ma oggi abbiamo preso Nescafè
Ora, per smentire chiunque possa provare a rivendicare che il caffè sia il topic principale su clojure-italy, torno su clojure
È una settimana circa che scrivo codice per generare codice, e non si tratta di macro: https://github.com/f-f/gogolica
Sono al commit #50 e ancora non funziona nulla, e generare clojure senza macro ha un po’ di aspetti divertenti
(Senza macro perchè l’obiettivo è generare Clojure a partire da una specifica JSON, e dumpare su file, per poi committarlo, mentre il codice generato dalle macro è “invisibile”)
E.g. se voglio generare una variabile dinamica devo tenere una lista tipo (def ^:dynamic *bla*)
Ma questo è impossibile, perchè ^
è una reader macro, e viene interpretata durante il reading appunto
Quindi l’hack facile è avere una lista (def \^ :dynamic *bla*)
, poi una volta che tutto è una stringa avere uno (str/replace "\\^ :" "\\^:" s)
Quindi è divertente, e sono abbastanza vicino all’avere l’API per Cloud Storage funzionante
(dove “vicino” significa che riesco a fare auth e fare list su un bucket)
non so se capisco bene... ma non potresti comporre tutto il codice che ti serve come quoted clojure? Tipo:
(defn gen [] `(do (def ^:dynamic *x* 1) (defn some [args] (identity args))))
È quello che faccio (vedi e.g. https://github.com/f-f/gogolica/blob/master/src/gogolica/core.clj#L29), ma apparentemente il ^:dynamic
viene interpretato dal reader nella fase di reading del codice quotato
A questo punto in realtà l’hack non mi piaceva proprio, e ho tirato fuori la parte di auth (con la dynamic var) in un altro namespace che importo dal codice generato
@nilrecurring non capisco cosa intendi
user=> (defmacro x [] `(def ^:dynamic *a*))
#'user/x
user=> (x)
#'user/*a*
user=> (:dynamic (meta #'*a*))
true
Tutto giusto
Ma la defmacro funziona finchè stiamo nello stesso environment
Qui il codice lo devo scrivere su file
`(^:dynamic ~'a)
=> (a)
non ti seguo
Oh, che bello
Questa mi mancava 🙂
Non sto usando prn per il printing (dovrei?), ma dovrebbe funzionare lo stesso
Grazie 😄
il compilatore setta la var come dinamica solo se il simbolo della var contiene la metadata :dynamic durante def
Ma vedo :dynamic true se estraggo i meta:
user=> (do (def user/*x* 1) (clojure.core/alter-meta! (var user/*x*) clojure.core/assoc :dynamic true))
Warning: user/*x* not declared dynamic and thus is not dynamically rebindable, but its name suggests otherwise. Please either indicate ^:dynamic user/*x* or change the name. (NO_SOURCE_PATH:38)
{:line 38, :column 5, :file "NO_SOURCE_PATH", :name *x*, :ns #object[clojure.lang.Namespace 0x5d43661b "user"], :dynamic true}
user=> (meta #'*x*)
{:line 38, :column 5, :file "NO_SOURCE_PATH", :name *x*, :ns #object[clojure.lang.Namespace 0x5d43661b "user"], :dynamic true}
se una var e` dynamic o no, dipende da una flag settata nell'oggetto var, non direttamente dal metadata
la proprieta` e` che, se la var e` dinamica, allora avra` per forza :dynamic come meta, ma non e` vero il contrario