Fork me on GitHub
#clojure-italy
<
2020-01-29
>
reborg08:01:13

More giorn

reborg10:01:45

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? 😬

reborg12:01:14

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])

reborg13:01:11

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.

bronsa13:01:06

perche` non usare semplicemente ricorsione?

bronsa13:01:14

(defn cartesian-prod [colls]
  (if-let [[coll & colls] (seq colls)]
    (for [x coll
          xs (cartesian-prod colls)]
      (cons x xs))
    [[]]))

reborg13:01:52

ah, bella, non ci avevo pensato

reborg13:01:14

sicuramente meglio!

reborg13:01:49

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

bronsa13:01:16

in che senso?

bronsa13:01:44

(let [all [[1 2] [3 4]]] (cartesian-prod all)) con cartesian-prod una defmacro non e` fattibile

reborg13:01:55

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

bronsa13:01:02

precisamente

reborg13:01:16

ecco, l’ho realizzato ora scrivendolo… che cefalo

reborg13:01:12

e non e’ la prima volta che non me ne rendo conto, spendo 2 ore a non capire perche’ la macro non mi riesce…