This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2017-07-07
Channels
- # bangalore-clj (3)
- # beginners (103)
- # boot (13)
- # cider (16)
- # cljs-dev (192)
- # cljsrn (44)
- # clojure (147)
- # clojure-dev (1)
- # clojure-italy (79)
- # clojure-norway (1)
- # clojure-russia (9)
- # clojure-spec (4)
- # clojure-uk (34)
- # clojurescript (65)
- # core-async (1)
- # core-logic (2)
- # core-typed (5)
- # cursive (1)
- # datascript (9)
- # datomic (26)
- # emacs (8)
- # garden (1)
- # hoplon (11)
- # humor (1)
- # jobs (1)
- # jobs-discuss (8)
- # jobs-rus (3)
- # leiningen (1)
- # luminus (1)
- # lumo (1)
- # mount (6)
- # off-topic (16)
- # om (10)
- # om-next (1)
- # onyx (10)
- # parinfer (10)
- # pedestal (25)
- # re-frame (27)
- # reagent (3)
- # rum (47)
- # uncomplicate (1)
- # unrepl (34)
- # untangled (120)
- # vim (58)
'Giorno
@reborg re-frame-http-fx si basa su https://github.com/JulianBirch/cljs-ajax, che supporta transit:
`
Cito:
There are four formats currently supported for communicating with the server: :transit, :json, :text and :raw.
e inoltre:
:format - specifies the format for the body of the request (Transit, JSON, etc.). Also sets the appropriate Content-Type header. Defaults to :transit if not provided.
@mdallastella vero. Sembra pero' una limitazione di re-frame-http-fx. Mi obbliga a mettere :response-format (ajax/json-response-format {:keywords? true})
se no non funziona. Ho provato con (ajax/transit-response-format)
e smette di andare.
Giorno!
Sono dell’opinione che c’è molto margine di miglioramento per re-frame-http-fx
In particolare, IMO ha senso scriversi un wrapper per cljs-ajax (con reg-fx
se ricordo bene) con il formato preciso della propria applicazione
@reborg limitazione nel senso che con il default non funziona il transit?
o perché devi esplicitare?
@nilrecurring: infatti, ho guardato i sorgenti e sono 20 righe, si puo' forse fissare in fretta
Domanda: secondo voi può aver senso usare
meta
per stabilire l'ordine in cui dev'essere processata una map?Mi spiego: se non erro sorted-map
ordina per alfabetico, sorted-map-by
ordina per una funzione
Passo indietro, io ho una mappa {:a 1 😛 2 :c 3} ma quando vado a processarla, devo per forza processare prima :c, poi :a e infine 😛
(maledette emoticons)
pensavo a:
`(with-meta
solutamente si usa una normale map per la parte associativa + un vector di chiavi per l'ordine
pensavo a
(with-meta {:a 1 :b 2 :c 3} {:order [:c :a :b]})
e poi quando la processo estraggo :order
e tiro fuori le chiavi in quell'ordine
oki, perché ora uso una finta mappa
[[:c 3][:a 1][:b 2]]
perche` non ha le performance guarantees di una mappa e non e` accessibile tramite le funzioni associative
sono dati che devo scrivere in un socket in un certo ordine, volevo fossero un po' verbosi a codice (oltre ai commenti)
Cmq vedo di fare un gist per farvi capire meglio il contesto
lo uso estensivamente nell'app principale qui... ovviamente sappiamo quel che facciamo
pistola carica e puntata, non spararti sui piedi. facile a dirsi, prima o dopo succede
quindi dopo un certo numero di elementi, non vedo veramente perche` vorrei usare array-map invece di una a-list manuale o una tupla di map+order vector
scrivere dati "documentati" in un socket, a naso, sembra un buon caso. Mi immagino una volta costruita l'array-map (forse adirittura esplicitando le chiavi una ad una se non sono piu' di qualche decina) la mandi giu' al socket.
Do un'occhiata ad array-map, grazie
In ogni caso vi faccio un gist
Ok, allora: https://gist.github.com/mdallastella/73dee0d73c441808d1dd121afdac502b
Il primo è con il metodo che uso attualmente per scrivere su un socket, il secondo è quello che avevo in mente per pulire un po' il codice usando i metadati
Sono eseguibili da repl
Quello che vedete ora è una summa di funzioni sparse per 4 namespace diversi, eh
se per i dati usi (array-map :id 1 :first-name "Marco" :last-name "Dalla Stella" :age 35)
dovrebbe funzionare senza altre modifiche
Provo una versione con array-map e vedo com'è
Tecniche a parte, fa schifo il codice?
(defn encode
[spec message]
(let [out (ByteArrayOutputStream.)
stream (DataOutputStream. out)]
(doseq [[field-name value] message
:let [function (get spec field-name)]]
(try
(apply function [stream value])
(catch Exception e
(throw (Exception. (str (.getMessage e) " writing " field-name))))))
(seq (.toByteArray out))))
e preferisco molte volte la versione con explicit ordering che qualsiasi altra soluzione basata su metadata o implicit ordering via array-map
Se elimini il dispatch esplicito via "spec" map ed usi protocols, diventa conciso:
(defprotocol Encode
(serialize [v out]))
(extend-protocol Encode
java.lang.Long
(serialize [v out]
(.writeInt out v))
java.lang.String
(serialize [v out]
(let [b (.getBytes v)
l (long (count v))]
(serialize l out)
(.write out b 0 l))))
(defn encode
[message]
(let [out (ByteArrayOutputStream.)
stream (DataOutputStream. out)]
(doseq [[field-name value] message]
(serialize value stream))
(seq (.toByteArray out))))
Interessanti soluzioni, grazie mille!
Ciao! scusate la domanda stupida, ma sapete consigliarmi una libreria per fare in modo che il codice clojure si ricompili automaticamente? ho provato con lein-auto (lein auto run) ma non ricompila. grazie!
si uso emacs
intendo un jar
non avevo provato, provo adesso. se volessi qualcosa tipo “lein auto run”, cioè fare anche rieseguire il codice, si può?
non saprei con lein auto, ma con emacs dovrebbe essere relativamente semplice scrivendo 3 righe di elisp
ok grazie comunque
qualcosa del genere (add-hook 'after-save-hook (lambda () (cider-load-buffer)))
(non testato)
in pratica io ho un server http-kit. vorrei che quando cambio il codice, quello si ricompilasse e si riavviasse il server. non so se si può fare
ok grazie
@elenacanovi non voglio mettere naso nel codice, ma potrebbe tornarti utile o components (https://github.com/stuartsierra/component) o mount (https://github.com/tolitius/mount)
Noi ad esempio usiamo mount, che "capisce" quando il namespace di un "servizio" viene cambiato e lo "riavvia"
grazie li guardo!