Fork me on GitHub
#clojure-norway
<
2022-02-08
>
teodorlu12:02:02

Er det noe annet vi må gjøre i forkant, egentlig? Eller er det bare å trykke "ja" i meetup og dukke opp?

slipset14:02:01

Press play!

🎉 1
infosophy13:02:44

Takk for lunsj-slabberas i dag! Var første gang på Clojure-lunsj for meg, og jeg ser allerede fram til neste gang. Takk for hyggelig velkomst, god prat, finfin mat og godt selskap.

teodorlu14:02:13

Ja, kjempetrivelig! Tusen takk til de som tok insj 🙌

augustl19:02:53

hva tenker folk om å lage sine egne sånne små "stdlib ++" varianter til sin egen kode? Ofte vanskelig å navngi dem. Men de kan jo være veldig kjekke å ha

augustl19:02:20

(ser nå at den der skal renames til drop-while-with-preceding)

teodorlu20:02:22

Lager sånne hele tiden! Synes det er vanskelig å si om de bør være i en liten utils.clj eller bare private funksjoner i samme namespace. Har blitt mer glad i "slettbar" kode i det siste.

augustl20:02:53

sjelden, har kanskje en eller to sånne fra før, føles litt farlig/rart/feil

slipset20:02:21

Det er rart med sånne “generelle” funksjoner. Mye av det vi gjør er å transformere data i format A over til format B. Og det er mange veier til Rom. Ofte, men sier ikke at det er tilfelle her, kommer slike “generelle” funksjoner som den over til ved at man tar en omvei. Laget slik den over er laget, så ser de veldig generelle ut, men de er egentlig ikke det. Jeg tror jeg bruker slike funksjoner som en slags indikator på at det finnes en bedre vei fra A til B.

1
slipset20:02:40

I blandt er de domenespesifike. Vi har i ardoq f.eks by-id id-set og fn-set

teodorlu20:02:53

Lyst til å komme med en sterkere påstand en "ofte"? (I prinsippet er jeg enig, jeg har oppdaget mange ganger at jeg kunne løst sånt bedre med 2-3 funksjoner fra standardbiblioteket) Edit: redigerte du bort "ofte"? 😄

slipset20:02:54

by-id er som en (medley/map-vals first (group-by id xs))

slipset20:02:25

id-set er (set (map id xs))

slipset20:02:25

Dette er funksjoner som vi bruker relativt ofte i Ardoq, men som ikke så fryktelig generelle, men som vi bruker fordi vi ikke har en skikkelig database, så vi må gjøre endel joins i Clojurespace.

magnars20:02:57

Jeg skrev en hel del slike funksjoner for noen år tilbake, men kan ikke huske sist gang jeg gjorde det nylig. Mistenker at jeg nå oftere bare bruker clojure.core direkte.

magnars20:02:56

Som et enkelt eksempel så pleide jeg å syns det var skrekkelig irriterende at det ikke fantes en (first pred coll) , men er ikke lenger irritert over det. Bruker (first (filter pred coll)) og går videre med dagen min.

magnars20:02:15

Det handler også litt om fordelen av å ikke lage nye navn.

2
teodorlu20:02:51

Fint skrevet! Kjenner meg igjen i min egen kode. Var veldig glad i mange små funksjoner før, hadde det for meg at det gjorde koden min selvdokumenterende. Men effekten var at jeg måtte hoppe unødvendig mye rundt.

😊 1
Jakub Holý (HolyJak)08:02:12

Christine hade en veldig fint rant om akkurat det 🙂

slipset20:02:46

Men, @teodorlu jeg heller nok litt til din hang til å legge dem i det ns’et jeg først begynner å bruke dem og så heller flytte de ut til et felles sted hvis jeg begynner å se dem over alt. (set (map id xs)) var en sånn greie jeg etterhvert så over alt.

slipset20:02:13

Kanskje forskjellen er om man ser et mønster over alt i kodebasen, så kan det være gunstig å mekke en funksjon for det, mens hvis du ser et bruk av en funksjon som ser generell ut, så kanskje man skal vente med å putte den i fellesområdet inntil man ser om det dukker opp flere brukstilfeller?

1
magnars20:02:02

Men disse har jeg kopiert stort sett inn i alle prosjektene jeg har vært i opp gjennom årene: min-by og max-by . Får alltid mark av å se (first (sort-by ...)) 😄 https://gist.github.com/8b71aaae0feb445643fabdbb9d776825

slipset20:02:26

Problemet nå man er flere som jobber på en større kodebase, så kan det være vanskelig å oppdage disse felles greiene

magnars20:02:37

Jeg vil jo si at (set (map id xs)) er 100% akseptabelt å ha mange steder i koden. Det er lett å lese og krever ingen nye navn man må ta inn over seg.

slipset20:02:52

Ikke uenig i det, men nå er det egentlig (set (map core/id xs) og det begynte å bli litt kjedelig å skrive, pluss at id-set er et ganske godt navn på det hele.

1
magnars20:02:31

Gode navn hjelper selvfølgelig.

magnars20:02:13

Det som fikk meg til å endelig lage "dash.el" var jo når jeg fant ut at Emacs Lisp faktisk hadde en filter-funksjon, den het cl-remove-if-not .

😄 1
slipset20:02:34

Den er jo også i bruk i kodebasen

slipset20:02:26

men den 3 aritets versjonen har jeg aldri brukt tror jeg 🙂

magnars20:02:55

Ser ikke ut til at den (set .. -wrapperen der gjør noe nyttig arbeid.

magnars20:02:43

med mindre add-keys gjør om typen på collection, og da har jeg et annet forbedringsforslag 😅

slipset20:02:55

Som sagt, omtrent første gang jeg ser den 3 aritets greia

magnars20:02:20

Er det Cursive som har den referansetelleren?

slipset20:02:52

Kaller’u meg Cursive bruker?!

magnars20:02:12

Ikke meninga å fornærme 😄

slipset20:02:38

Som også har en find-references som virker

magnars20:02:18

Skjønner! Hvorfor har Emacsen din så rar cursor da? Er det rart jeg blir forvirra? 😅

slipset20:02:51

Hva da rar cursor, jeg har hatt (setq-default cursor-type 'bar) siden sikkert emacs 19.20 eller no sånt

👀 1
magnars20:02:01

Skjønner clojure-lsp også egendefinerte makroer?

slipset20:02:24

Den lener seg på clj-kondo, som har et eller annet system for slikt

magnars20:02:47

akkurat, ja

augustl20:02:00

drop-while-off-by-one-inator

😂 1
slipset20:02:03

:lint-as {liberator.core/defresource clojure.core/defn
           ardoq.test.api/deftest clojure.test/deftest
           clj-configurator.core/defconfig clojure.core/def
           ardoq.test.helper/with-system clojure.core/let}

slipset20:02:55

fra vår clj-kondo config

👍 1
augustl20:02:40

hvordan kunne man gjort en slik ting, da? Altså min drop-by-men-ta-også-med-elementet-før-der-den-droppa?

augustl20:02:53

bruker den jo bare to steder, så kan "inline" den som et alternativ

augustl20:02:31

men akkurat her føltes det hyggelig å kunne lese et lite logisk navn og. Så tipper jeg at både andre utviklere og jeg selv om to uker ikke forstår hva meningen er med det navnet, da, men, kanskje

magnars20:02:33

jeg tror nok at min normale løsning her ville være å gjøre akkurat det samme som deg, minus å gi det et eget navn

magnars20:02:59

drop-while-but-keep-the-last er ikke egentlig lettere å lese enn koden 😄

augustl20:02:47

in related news, nå sjekker jeg inn den her

augustl20:02:41

hvordan ville du forresten laget en funksjon uten å gi den et navn?

augustl20:02:48

(defn homeless-5?

😹 1
magnars20:02:59

Nei, altså, inlinet den, da.

augustl21:02:24

alle http-routing-libs til Kotlin baserer seg på metodekall og builder-DSLs og sånn forresten, ikke å returnere data fra en funksjon

augustl21:02:41

(meg til Kotlin-miljøet)

😹 1