More giorn
cia'
appena ordinato un raspberry pi 4 con lāidea di giocarci a minecraft attraverso pythonAPI (https://projects.raspberrypi.org/en/projects/getting-started-with-minecraft-pi/5) ma ovviamente la domanda sorge spontaneaā¦. clojureAPI? š¬
juicy!
lei ci sta lavorando parecchio https://twitter.com/gigasquid?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor
Yay or nay?
(defn cartesian-prod [colls]
(let [vars (vec (take (count colls) (repeatedly gensym)))
binds (vec (interleave vars colls))]
(eval `(for ~binds ~vars))))
(let [all [[1 2] [3 4]]] (cartesian-prod all))
;; ([1 3] [1 4] [2 3] [2 4])
Motivo: non si sa quante coll ci sono in colls. for
funziona molto bene se si sa quante colls ci sono. Quindi sto cercando un modo di generare un for
attraverso qualche macro expansion. I miei tentativi di usare defmacro
non hanno funzionato fināora. Mi piacerebbe capire dove sbaglio.
perche` non usare semplicemente ricorsione?
(defn cartesian-prod [colls]
(if-let [[coll & colls] (seq colls)]
(for [x coll
xs (cartesian-prod colls)]
(cons x xs))
[[]]))
ah, bella, non ci avevo pensato
sicuramente meglio!
Se hai un minuto (e voglia) puoi postare una defmacro
che genera un for
con bindings variabili? Ho provato varie combinazioni di sintax-quote, gensym e famiglia ma mi blocco sempre. Ho la sensazione che dovrebbe essere relativemente sempliceā¦ oppure cāeā qualcosa che non capisco
in che senso?
(let [all [[1 2] [3 4]]] (cartesian-prod all))
con cartesian-prod
una defmacro
non e` fattibile
forse eā concettualmente un problema il fatto che il contenuto di colls eā noto solo a runtime, ma a macro-expansion time non cāeā niente da fare
precisamente
ecco, lāho realizzato ora scrivendoloā¦ che cefalo
e non eā la prima volta che non me ne rendo conto, spendo 2 ore a non capire percheā la macro non mi riesceā¦