Fork me on GitHub
#clojure-italy
<
2019-08-16
>
alan08:08:28

доброе утро

skuro08:08:51

goeiemorgen

helios08:08:29

Καλημέρα

reborg08:08:58

All square sizes edition!

(defn game-over? [player board]
  (let [size (count board)
        idxs (range size)]
    (->> [[x idx] [idx y] [idx idx] [idx (- (dec size) idx)]]
         (map (fn [[x y]] ((board x) y)))
         (for [x idxs y idxs idx idxs])
         (apply mapcat list)
         (partition size)
         (some #(apply = player %)))))

(game-over? :x [[:x :o :x :x :o :o :o] 
                [:x :x :o :o :x :o :o] 
                [:o :x :x :x :o :x :o]
                [:x :x :o :x :o :o :o]
                [:x :o :x :x :x :o :x]
                [:o :x :x :x :o :x :o]
                [:o :x :x :x :o :x :x]])
;; true

Andrea Imparato09:08:32

mi puoi spiegare grosso modo cosa fa questa funzione? 🙂 Devo ancora abituarmi al nome delle variabili così corto, mi perdo ancora troppo facilmente

Andrea Imparato09:08:56

qui soprattutto non capisco:

(->> [[x idx] [idx y] [idx idx] [idx (- (dec size) idx)]]
         (map (fn [[x y]] ((board x) y)))
         (for [x idxs y idxs idx idxs])

reborg09:08:45

Si e’ un certo trick. I local bindings x,y,idx sono definiti nella for comprehension ma siccome ->> inverte l’ordine, appaiono prima di essere dichiarati

reborg09:08:58

(defn game-over? [player board]
  (let [size (count board)
        idxs (range size)]
        ;; How x,y coordinates relates to items in:
        ;; row,   column, diagonal,  inverse diagonal respectively.
    (->> [[x idx] [idx y] [idx idx] [idx (- (dec size) idx)]]
         ;; let's map over each of the pairs above.
         (map (fn [[x y]] ((board x) y)))
         ;; big trick here, as x,y,idx used above are actually locally bound by
         ;; this for. But because ->> is a macro, they are not evaluated above
         ;; and they don't throw errors.
         (for [x idxs y idxs idx idxs])
         ;; the for comprehension creates reading of the input board for
         ;; lines, columns and 2 diagonals
         (apply mapcat list)
         ;; they need to be grouped by the size of the square
         (partition size)
         ;; and then check if they are all the same.
         (some #(apply = player %)))))

Andrea Imparato09:08:45

oh clojure black magic qui 🙂

Andrea Imparato09:08:03

ottimo ottimo, ogni giorno si imparano cose nuove 👍

reborg09:08:36

siamo al limite del ragionevole, forse un pelo di la’, quindi se in code review mi ringhiano contro li capisco

reborg09:08:52

arggggh (every? #{false} [false false]) => false 😡

helios09:08:33

why is that?

reborg09:08:15

perche’ set fa lookup di false e dice, certo che si’ eccolo: false

reborg09:08:40

il sistema limbico mi dice wat? ma e’ tutto ok

reborg09:08:57

Volevo usare set perche’ avevo piu’ di un predicato da valutare. Il modo corretto e’ (every? (some-fn false? #{:a}) [false false :a]) => true

skuro12:08:54

forse più idiomatico così:

(every? (partial contains? #{false :a}) [false false :a]) ;; -> true

bronsa09:08:24

occhio anche a nil

skuro09:08:39

va bene anche una map immagino

skuro09:08:55

tipo (every? {false 1 :a 1} [false false :a])

bronsa09:08:16

user=> (every? (some-fn not #{:a}) [false  nil :a])
true

skuro09:08:48

o (every? (zipmap #{false :a} (repeat true)) [false false :a]) che almeno evidenzia i valori

skuro09:08:08

un po' esoterico, admittedly

reborg09:08:16

@bronsa ok. L’unico problema che potrei avere e’ nil nell’input, ma sembra andare: (every? (some-fn false? #{:a}) [false false :a nil]) => false

reborg09:08:40

@skuro la mappa sembra un’idea carina (a parte per il magic value “1” nel tuo caso)

skuro09:08:03

peccato che i set non hanno una arity-2 come le maps

skuro09:08:28

user=> (#{false :a} :b :nope)
Execution error (ArityException) at user/eval150 (REPL:1).
Wrong number of args (2) passed to: clojure.lang.PersistentHashSet
user=> ({false 1 :a 1} :b :nope)
:nope

reborg09:08:58

si peccato… c’e’ il get che funziona (get #{:b :c} :a :nope) => :nope

skuro13:08:38

effettivamente a giudicare dalla documentazione ufficiale a me pare un bug

skuro13:08:52

> Sets are functions of their members, using get

skuro13:08:23

quindi se (get #{:a} :b :not-found) => :not-found

skuro13:08:38

allora dovrebbe anche essere che (#{:a} :b :not-found) => :not-found

skuro13:08:45

attenzione!

skuro13:08:50

user=> ((transient #{:a}) :b :not-found)
:not-found

skuro13:08:06

prima di aprire una issue su jira stavo giocherellando sul codice e ho visto che ATransientSet implementa la arity-2

reborg09:08:32

o se fai lookup di keywords (o symbols) (:a #{:b :c} :nope)

skuro11:08:33

eh, come sospettavo

richiardiandrea13:08:26

Toh qualcuno lo usa ancora il mio piccolo sito 😃

skuro13:08:54

first google hit for cljs repl online

skuro13:08:00

ottimo lavoro di marketing 😉

Luis16:08:28

Salve a tutti! E' da tempo che mi sto documentando su clojure... ora vorrei finalmente cominciare a creare un progetto. Voglio sviluppare un semplice ecommerce. Backend in clojure e frontend in Vue.js... Ora il mio dilemma è questo: che set di librerie devo usare? Mi sembra chiaro che debba usare compojure e ring. Credo di aver capito che dovrò sviluppare una funzione "middleware" che si occuperà di filtrare i routes per parsare i JWT. Ma già qui mi perdo... Quale libreria usare? Poi... userò mongodb e quindi (molto probabilmente) monger... Già mi sono rincoglionito a studiare emacs e ora sta accadendo lo stesso con l'init del mio progetto. C'è qualche risorsa web che mi possa dare un incipit, indicazione o qualsiasi cosa che mi tolga da questa sensazione di "ubriacatura perenne".

Luis16:08:32

A sentimento sò che tutte queste difficoltà saranno ripagate ma lo giuro, poche volte mi sono sentito così smarrito!!!

mdallastella16:08:00

Come primo progetto, ti direi anch'io luminus

helios16:08:07

e' gia' una sorta di "framework" nel senso che ci sono gia' un po' di librerie scelte per te

Luis16:08:12

Avevo visto Luminus... ma volevo entrare nella forma mentis di clojure a gamba tesa.. 🙂

dmaiocchi16:08:50

Luminus x me puo andare bene, altrimenti puoi fare qualocosa di piu minimal dove scegli te ogni componente

dmaiocchi16:08:34

ma dipende dal tuo grado di esperienza e tempo che vuoi dedicarci. credo che per avere un feeling e incominciare luminus vadi bene. poi io passerei a Ring + altro

dmaiocchi16:08:04

x emacs se ti serve una guida su clojure puoi guardare qua: https://www.braveclojure.com/basic-emacs/

👍 4
Luis16:08:53

Già comprato! Versione cartacea.

👍 4
Luis16:08:05

Ho un bel pò di esperienza in Java... ma non me ne faccio nulla 🙂

dmaiocchi16:08:38

beh x esempio io non ho nessuna esperenzia in Java

dmaiocchi16:08:50

cmq in clojure Java ti sara utile x qualche primitiva

Luis16:08:27

ma un bel template leningen con un bel pò di roba scelta?

Andrea Imparato16:08:01

io per app fullstack ho usato lein new figwheel-main app -- --reagent +deps

Andrea Imparato16:08:15

però sono mega noob quindi non so quanto valido sia come consiglio 🙂

dmaiocchi16:08:30

e.g le queue e altre cose clojure usa java, certo puoi usare altri lib ma ci sono tante progetti che usano Java, quindi ti sara utile 😁

dmaiocchi16:08:47

puoi darci un occhi

Luis16:08:23

ma è cljs

dmaiocchi16:08:25

era una domanda per fare un minimalista project, e l'esatto opposto di Luminous

Luis16:08:11

però il concetto è lo stesso: Minimalista e hard-way 🙂

dmaiocchi16:08:24

usare cljs sembra logico se usi clojure come backend

dmaiocchi16:08:02

a meno che non hai delle constraint particolari, ma clojurescript e abbastanza pratico x quello 😁

Luis16:08:45

Concordo. E' nella lista delle cose da fare. Per ora ho preso un pò di dimestichezza con Emacs e cider (spacemacs), poi mi sono fatto un pò di 4clojure. Per cljs aspetto di avere un pò più di confidenza lato backend.

Luis16:08:07

se aggiungo pure cljs è mostruosa la quantià di roba da "imparare ad usare"

dmaiocchi16:08:58

vai tranquillo, comq con cljs l'unica cosa che cambia e il setup

Luis16:08:27

Penso che comincerò con il template leiningen più semplice.. e man mano ci aggiungo pezzi. Per ora nella lista c'è: compojure, ring e monger

dmaiocchi16:08:59

sembra ok clojure-berlin cmq se un pet project x imparare puoi fare anque quello. Ma cioe x me, se vuoi imparare il backend e basta, allora personalmente io farei un progetto solo backend

mdallastella16:08:11

Tecnicamente luminus è un template, @luigi.candita

👍 4
dmaiocchi16:08:12

penso che luminus x imparare e un bel progetto. ovviamente x un cliente/legacy code e qualcosa che va preso piu seriamente e considerato molto meglio 😁 cioe ci sono troppe lib etc

Luis16:08:19

"Luminus is a Clojure micro-framework based on a set of lightweight libraries. It" -_-

dmaiocchi16:08:44

$ lein new luminus my-app

Luis16:08:40

Mi hai convinto @mdallastella 🙂

clj 4
😉 4
dmaiocchi16:08:13

sto cercando di leggere emails con emacs. #febbreDelVenerdiSera 😁

dmaiocchi16:08:59

sono riusciuto a installare mu4e e mu per ora tt bene. imparero a usare mu4e ora.

Luis16:08:26

Nei primi gg di emacs, ho dato spago all'operazione "nostalgia". IRC con erc

Luis16:08:51

ero in un periodo in cui detestavo tutto il superfluo

dmaiocchi16:08:10

afaik ci sara sicuramente uno slack client

Luis16:08:11

da allora che sto studiando clojure 🙂

clj 4
Luis16:08:51

Grazie per le info!

Andrea Imparato16:08:25

consiglio spacemacs per chi come me non è un emacs power user e non riesce a dimenticarsi dei vim key bindings 🙂

Luis16:08:43

Diciamo che per me non ci voleva molto a dimenticare :w :wq! e dd 🙂

Luis16:08:50

quindi vado liscio di emacs-style

Luis16:08:10

anche se mi è servita una gg per capire che SPC è M-x

Luis16:08:19

no.. aspè... M-m

dmaiocchi16:08:24

ho usato anche io vim in passato, ma personalmente emacs e molto piu bello di vim

dmaiocchi16:08:39

vim lo uso x qualche file, ma non e comparabile a la bellezza di emacs.

Luis16:08:08

Sopratutto quando ci metti nyan-cat nella speedbar

nyantocat 4
dmaiocchi17:08:31

non sapevo nemmeno cosa fosse nyan-cat 😁

dmaiocchi17:08:59

sembra bello 😁 cia buon weekend

Andrea Imparato22:08:14

domanda serale, se uno volesse farsi un grafo delle chiamate delle funzioni in un progetto clojure? Ho provato vari plugin che per lein ma pare che nessuno di questi sia aggiornato