Fork me on GitHub
#clojure-italy
<
2018-02-26
>
manuel08:02:41

buon inizio di settimana a tutti

andrea.crotti11:02:04

c'e' un modo piu' intelligente di settare temporaneamente variabili d'ambiente di una roba cosi?

(defmacro with-env
  [[var value] & body]
  `(do (alter-var-root #'env assoc ~var ~value)
       (let [result# ~@body]
         (alter-var-root #'env dissoc ~var)
         result#)))

(with-env [:v 10]
  (:v env))

andrea.crotti11:02:04

volevo fargli almeno prendere come input una map invece ma questo mi ha scassato l'env 😄

(defmacro with-env
  [bindings & body]
  `(do (alter-var-root #'env merge ~bindings)
       (let [result# ~@body
             unbind-keys# (keys ~bindings)]
         (alter-var-root #'env dissoc unbind-keys#)
         result#)))

andrea.crotti11:02:37

tra l'altro adesso env e' diventato :v 😄 non e' chiaro come riaggiustarlo senza riavviarmi tutto il REPL

reborg11:02:56

non mi e' chiaro cosa vuoi ottenere, ENV sarebbe quello che e' visible da bash?

reborg11:02:13

e pare che lo vuoi usare solo nel REPL?

andrea.crotti11:02:09

semplicemente in alcuni test

andrea.crotti11:02:32

serve un modo di settare env variables prima di qualche chiamata e resettare dopo

andrea.crotti11:02:30

lo stava facendo un collega in reata', con un semplice

alter-var-root '#env ...
function-to-call
alter-var-root '#env
che non e' il massimo della vita

reborg11:02:47

c'e' with-redefs

andrea.crotti11:02:41

quello ridefinisce tutto pero'

andrea.crotti11:02:48

alter-var-root ti permette di passare assoc :x 1 per esempio

andrea.crotti11:02:05

ma vabbeh si puo' probabilmente fare los tesso comunque in effetti

reborg11:02:29

si, ti puoi creare un piccolo wrapper probabilmente