Fork me on GitHub
#clojure-norway
<
2023-09-13
>
magnars05:09:51

God morgen!

msolli06:09:36

Morn morn!

anders06:09:08

Mornings! 😊

augustl06:09:00

god morgen!

leifericf06:09:07

Jeg oppdaget https://clojure-doc.org/ i dag tidlig, som ser ut til Ă„ ha noen nyttige guides.

teodorlu08:09:33

ja, den er kul! Tror det er @seancorfield som lager den. Mener han har fÄtt noe #clj-together-penger for Ä lage bedre dokumentasjon for Clojure-ting!

👍 1
slipset09:09:42

Stemmer

👍 1
teodorlu08:09:33

ja, den er kul! Tror det er @seancorfield som lager den. Mener han har fÄtt noe #clj-together-penger for Ä lage bedre dokumentasjon for Clojure-ting!

👍 1
leifericf13:09:46

Jeg sitter og leser https://brehaut.net/blog/2011/ring_introduction nÄ, sÄ kom jeg til dette eksempelet (ref. screenshot): Noe sÄ enkelt er fortsatt ganske mind-blowing for meg. Jeg mÄ innrÞmme at jeg synes det er vanskelig Ä forstÄ hva som skjer i den wrap-uri-check funksjonen, som tar en funksjon (`handler` parameteret), og pakker den inn i enda en anonym funksjon med map destructuring i parameteret (`[{:keys [uri] :as req}]`). Selv denne enklere funksjonen synes jeg er litt vanskelig Ä forstÄ:

(defn hello-handler-2 [{:keys [uri]}] 
  (when (= uri "/hello") 
    {:body "Hello, World!" :headers {} :status 200})) 
Jeg tror det som forvirrer meg er at :keys i destructuring tilsynelatende ikke blir brukt i bodyen til funksjonen. NĂ„r ting blir "higher-order" med anonyme funksjoner som blir sendt inn i andre funksjoner, som returnerer funksjoner, og de bruker destructuring, sĂ„ sliter min hjerne med Ă„ henge med i svingene 😂 Det som er ekstra rart er at jeg forstĂ„r hva som skjer rent teoretisk, men sliter allikevel med Ă„ "lese koden pĂ„ en naturlig mĂ„te," hvis det gir mening.

teodorlu13:09:13

Jeg synes ogsÄ at ring-middleware kan bli vanskelig Ä lese. Synes ogsÄ feilmeldingene blir vanskelig Ä lese, sÊrlig nÄr du sender anonyme funksjoner inni anonyme funksoner! Personlig er jeg veldig glad i HTTP-request og HTTP-response som maps (fra Ring), men jeg blir litt mer skeptisk til superdype middleware-stacks.

leifericf13:09:05

Det er en viss trþst at jeg ikke er alene 😅

❀ 1
leifericf13:09:18

Det fĂžles veldig rart Ă„ lese Clojure kode noen ganger. Det er sĂ„ sykt kompakt, men sĂ„ tar det meg allikevel mye tid Ă„ forstĂ„. Jeg sitter der og stirrer pĂ„ skjermen, fĂžlger mĂžysommelig steg for steg
 "Aha, der er det en funksjon som tar en funksjon, ja
 SĂ„ definerer den en ny funksjon med den funksjonen inni
 og returnerer en ny funksjon
 som blir brukt her borte, ja
 Hvor var jeg igjen? Åja
 AHA! Det er jo dritkult. Men hva er det egentlig som skjer her?"

leifericf13:09:32

Fþler meg dritsmart og som en idiot samtidig 😂

teodorlu13:09:43

Jepp! 😁

teodorlu13:09:19

Synes det er vanskelig Ă„ si “er dette et god kode jeg bare ikke skjĂžnner?” eller “dette er faktisk en rotete, uintuitiv, overkomplisert mĂ„te Ă„ gjĂžre det pĂ„â€ noen ganger.

leifericf13:09:34

Jeg leser litt pÄ koden til borkdude noen ganger og det er heeelt insane. Noen av funksjonene hans er veldig abstrakte og rett og slett enorme.

teodorlu13:09:34

Det hender at koden hans gjĂžr veldig mye ogsĂ„! Jeg mĂ„tte sette meg inn i hvordan han jobber pĂ„ babashka (“itself”) da jeg skulle jobbe pĂ„ output fra bb print-deps.

teodorlu13:09:42

Har du et eksempel du har vĂŠrt borti nylig?

teodorlu13:09:21

Jeg prĂžvde Ă„ argumentere for borkdude-kodestil https://play.teod.eu/clojure-let/. Argumentet var “det er OK Ă„ ha en lang let som gjĂžr mange ting”. @U04V5VAUN leste over artikkelen for meg, jeg tenkte Ă„ trykke publish, og dele pĂ„ #C8NUSGWG6. Men han fikk meg til Ă„ revurdere litt om dette var en god idĂ©, gitt. I mitt tilfelle var funksjonen jeg dro fram som jeg hadde skrevet selv (`olorm-create`) vanskelig/umulig Ă„ teste. Ved Ă„ koble ting litt fra hverandre ble det mulig Ă„ teste! SĂ„ nĂ„ er jeg 
 usikker! 😄

augustl13:09:11

generelt liker jeg ikke sÄ godt :keys i destructuring

augustl13:09:39

pleier Ă„ enten ikke destructure, eller eksplisitt mappe med typ {name :name age :age} osv. Liker Ă„ kunne greppe etter symbolet :age i koden

1
augustl13:09:37

med {:keys [name age]} sĂ„ blir den litt vanskeligere Ă„ “finne igjen” synes jeg

slipset13:09:18

Vi pleier «alltid» Ä legge pÄ :as selvom vi ikke bruker det. Nesten som en type annotasjon

1
teodorlu13:09:06

Ser argumentet! Det er jo ikke store forskjellen pÄ

(let [{name :name age :age} person]
  (str name " is " age " years old"))
og
(let [{:keys [name age]} person]
  (str name " is " age " years old"))
i mengde kode heller. og du fÄr mulighet til Ä endre variabelnavn i kroppen til let uten Ä rÞre personen som kommer inn.

augustl13:09:49

poeng ja, :as har en fin dokumenterende effekt

augustl13:09:09

nÄr man ikke har en compiler som enforcer typer sÄ er det jo greit Ä fÄ med navnet ihvertfall, hvis det som sendes inn er et eller annet meningsfylt aggregat i systemet

💯 1
cjohansen13:09:34

Jeg er veldig glad i keys destructuring - sĂŠrlig nĂ„r det er vanskelig Ă„ navngi "as" 😅

magnars13:09:27

Etter min mening sÄ er funksjonskomposisjon en av de mindre interessante elementene av Clojure-style funksjonell programmering - nettopp fordi det ofte blir opakt og ugjennomtrengelig. Bruk data istedenfor!

👍 4
magnars13:09:04

Interceptors er vel et eksempel pÄ en mer datadreven versjon av Ring middlewares, tror jeg, men har ikke hatt store nok behov til Ä sette meg ned og teste det.

cjohansen13:09:23

AngÄende kodestil: Jeg kjenner ikke den konkrete kodestilen det refereres til over, men er generelt skeptisk til bÄde lange funksjoner og let-bindings. let-bindings er et nÞdvendig onde jeg til enhver tid prÞver Ä unngÄ/holde i sjakk.

teodorlu13:09:40

interessant! For meg fĂžltes det litt som et utpust Ă„ “bare putte alt i en lang let” nĂ„r jeg ikke kjenner et bedre mĂžnster for Ă„ gjĂžre det jeg skal.

slipset13:09:39

Jeg putter gjerne ting i en lang let mens jeg finner ut av hva jeg skal gjĂžre, men sĂ„ ender jeg som regel med noe som lett threades. Det er vel min variant av “make it work, make it pretty”. Altfor mange stopper etter “make it work”

💡 1
👍 1
cjohansen13:09:17

Jeg hater Ä lese kode med mange let-bindings. Det blir utrolig hakkete - du mÄ frem og tilbake, det skaper usikkerhet om hvorvidt ting brukes flere ganger eller ikke, og det krever langt flere navn enn det som er strengt nÞdvendig

cjohansen13:09:44

Med tanke pÄ at navngivning er noe av det vanskeligste vi gjÞr syns jeg det er et unÞdvendig hinder Ä plassere foran seg selv

slipset13:09:50

jeg tror at jeg har en tendens til Ă„ gi sĂ„nne “make it work” bindinger ganske dĂ„rlige navn, eg foo , bar eller f*ck (sĂ„nn litt avhengig av humĂžr) som en pĂ„minnelse pĂ„ at de er temporĂŠre og mĂ„ vekk.

😄 1
cjohansen13:09:51

Jeg bruker let-bindings til ting som skal brukes flere ganger, og ellers forsÞker jeg Ä unngÄ dem ved Ä threade eller trekke ut funksjoner (tommelfingerregel, ingen absolutter osv)

cjohansen14:09:11

@U04V5VAUN det er en god strategi!

slipset14:09:22

I en nylig frontend PR hadde jeg en type som het TheThing Äpenbart et sÄ dÄrlig navn at det mÄtte bort.

cjohansen14:09:46

Jeg jobber nesten alltid ut fra noe thread-bart, og ender av og til med Ă„ flytte noe til en let dersom det trengs flere ganger

👍 1
teodorlu14:09:58

> men sĂ„ ender jeg som regel med noe som lett threades Jeg tror kanskje “god clojure-kode er lett Ă„ bruke med -> eller ->>” en av de fĂ„ generelle tingene om clojure-koding jeg kan stĂ„ for. I alle fall hvis den transformerer data. (feks som https://www.kodemaker.no/blogg/2020-06-thread-first-and-last/)

👍 2
leifericf14:09:05

Enig, jeg synes threads er mye enklere Ä lese fordi det er sÄ lineÊrt. OgsÄ synes jeg det er enklere Ä definere en gjeng funksjoner som gjÞr spesifikke og avgrensede oppgaver, for deretter sÄ lage "oppskrifter" (threads) hvor jeg kombinerer "ingrediensene" (funksjonene) for Ä prosessere "rÄvarene" (data).

chef_kiss 2
➕ 2
leifericf14:09:24

Det er nok den "hakkingen" som @U9MKYDN4Q beskrev tidligere som setter meg ut mest. NÄr jeg stadig mÄ sprette opp og ned i fila, og kanskje til andre filer, og holde pÄ alt dette i hodet samtidig for Ä forstÄ hva som skjer. Jeg mÄ hele tiden "spole tilbake" og lese de samme funksjonene pÄ nytt gjentatte ganger fordi jeg ikke er skarp nok til Ä huske alt jeg mÄ huske for Ä henge med. Det blir jeg utrolig sliten av.

leifericf14:09:48

Ideelt sett vil jeg helst lese ting ovenfra og ned Ă©n gang.

💯 2
cjohansen14:09:18

Damn straight!

cjohansen14:09:21

Point free FTW

leifericf14:09:07

NÄr det gjelder namespaces har jeg begynt Ä tenke at noen av dem kun skal inneholde funksjoner som definerer diskrete "steg" i en "oppskrift." OgsÄ er det andre namespaces som er selve "oppskriftene" hvor disse kombineres. Jeg vet ikke om det er "riktig" mÄte Ä organisere ting pÄ, men det gjÞr det enklere for meg.

teodorlu14:09:48

nĂ„ fikk jeg veldig lyst til Ă„ grave opp en snutt haskell-kode med vill bruk av ., $ og <$> helt uten navngitte parametere (point free!). Men jeg skal la vĂŠre Ă„ vĂŠre dust i dag, fordi point free med -> og ->> i Clojure betyr noe helt annet enn point free med infix-operatorer i Haskell 😅 SĂ„ utelukkende som en spĂžk kan folk gjerne titte innom her og se hvor lett koden er Ă„ lese for deg: https://wiki.haskell.org/Pointfree#Combinator_discoveries

😂 1
cjohansen14:09:50

La oss bare si at pointfree er et godt utgangspunkt, men ikke nok i seg selv

cjohansen14:09:09

"Necessary, but not sufficient" eller noe sĂ„nt 🙂

✅ 1
teodorlu14:09:27

vanskelig Ă„ formulere gode faglige vurderinger utelukkende som regler som skal fĂžlges uten at man tenker selv.

cjohansen14:09:41

Ja, det er bortimot umulig

augustl14:09:13

“bruk versjonskontroll”. Det finnes noen! Ikke sĂ„ mange, da. (Og det er vel sikkert unntak til den og
)

cjohansen14:09:34

Jeg er relativt komfortabel med Ä si at nesten alle Clojure-funksjoner som har en let med flere enn 5 bindings kan skrives pÄ en bedre mÄte

teodorlu14:09:12

liker at du fĂžler at du trenger bĂ„de “relativt komfortabel” og “nesten alle” i den setningen 😄

cjohansen14:09:26

Det er bare fordi jeg har blitt gammal 😂

😁 1
cjohansen14:09:59

Hadde vi tatt dette over en Ăžl hadde det blitt "all clojure-kode med flere enn 5 letbindings er sĂžppel"

đŸ» 1
slipset14:09:06

ForĂžvrig, der denne trĂ„den startet. Jeg synes middleware er en god ting for bibliotekforfatter fordi man da gir konsumentene hooks pĂ„ ulike mĂ„ter. Jeg synes middleware i konsumentkode, spesielt middleware-stacks er et helvete. Hos ardoq har vi en middlewarestack pĂ„ hĂžyde med en skyskraper. IMO burde dette vĂŠrt en funksjon som ble lagt inn i som middleware og deretter delegerte til “vanlige” funksjoner.

🏱 1
👀 1
cjohansen14:09:15

Om ikke én, sÄ ihvertfall ikke sÄ mange. Det kan jo vÊre at man Þnsker et litt forskjellig utvalg i prod og dev feks

cjohansen14:09:37

Men helt enig i at de bĂžr delegere til navngitte funksjoner.

cjohansen14:09:00

Inline funksjoner lar seg ikke reloade uten Ä restarte prosessen, sÄ de blir man fort lei av

teodorlu14:09:23

@U04V5VAUN prĂžver Ă„ skjĂžnne hva du mener her: > IMO burde dette vĂŠrt en funksjon som ble lagt inn i som middleware og deretter delegerte til “vanlige” funksjoner. Er det noe sĂ„nt du ser for deg? Eller er jeg pĂ„ bĂŠrtur?

slipset14:09:29

Jeg synes forÞvrig at «custom» funksjoner som returnerer funksjoner som regel blir et helvete. For clever lissom.

👍 4
slipset14:09:07

Det fÄr holde med dem som er i core

👍 2
cjohansen14:09:50

Det tror jeg ikke jeg driver med

msolli18:09:57

@U01PE7630AC: > Jeg tror det som forvirrer meg er at :keys i destructuring tilsynelatende ikke blir brukt i bodyen til funksjonen. Jeg vet ikke, men det hĂžres pĂ„ ordbruken din her som at du har misforstĂ„tt hva :keys er/gjĂžr? I destrukturering sier :keys at “kjĂŠre datamaskin, fra dette map-et henter du ut verdiene fra disse nĂžklene, som er keywords, og bind de til de samme navnene”. I den aktuelle funksjonen er det request-map (formodentlig), som har en nĂžkkel :uri, hvis verdi blir bundet til navnet uri i funksjonskroppen.

👍 1
slipset19:09:13

@U3X7174KS spot on!

👍 1
leifericf07:09:15

Takk, @U06BEJGKD! Ja, jeg har vel egentlig ikke forstĂ„tt meg helt pĂ„ hvordan https://clojure.org/guides/destructuring#_keyword_arguments fungerer. Det har virket litt "magisk." Men nĂ„r du forklarer det sĂ„ godt med et menneskelig sprĂ„k, blir det straks mye enklere Ă„ forstĂ„! SĂ„ takk for det. > "Any sufficiently advanced technology is indistinguishable from magic." —Arthur C. Clarke

👍 1
leifericf07:09:42

> Etter min mening sĂ„ er funksjonskomposisjon en av de mindre interessante elementene av Clojure-style funksjonell programmering [
] @U07FCNURX, jeg er litt usikker pĂ„ hva du mente med "funksjonskomposisjon" her. Mente du Ă„ skrive egne funksjoner som tar funksjoner og returnerer funksjoner, eller mente du bruken av clojure.core funksjoner som f.eks. comp, partial og complement. Eller kanskje begge deler? > Jeg synes forĂžvrig at «custom» funksjoner som returnerer funksjoner som regel blir et helvete. For clever lissom. Det fĂ„r holde med dem som er i core. Samme spĂžrsmĂ„l til deg, @U04V5VAUN. NĂ„r du sa "dem som er i core," refererte du da til comp, partial, complement, etc.?

slipset07:09:08

Jeg hadde engang en ide om en talk om “The combinators of Clojure”, basically en talk om comp, partial, complement , juxt some-fn every-pred og sikkert en gjeng til som jeg ikke husker pĂ„ sittende rompe. Greia er vel at jeg klarer Ă„ holde et par tre av dem i hodet (tok meg evigheter Ă„ forstĂ„ juxt, men nĂ„ husker jeg liksom noen use-caser for det), sĂ„ jeg trenger liksom ikke 15 sĂ„nne til som brukes en gang pr stykk i kodebasen. Det er litt som transpose-sexp i paredit, jeg har fĂ„tt til Ă„ bruke den en gang eller to, men som oftest sĂ„ skjĂžnner jeg ikke at jeg kunne ha brukt den, og nĂ„r jeg bruker den, sĂ„ bruker jeg den som regel feil. Mange av disse kombinatorene er kule hvis du har lyst til Ă„ jobbe point free, men man kan spĂžrre seg om

(def bla (comp (partial foo bar) (partial baz qix)))
gir sÄ veldig mye over:
(defn bla [x]
  (->> x
       (baz qix)
       (foo bar)))

💡 1
➕ 1
slipset07:09:33

Likeledes kan man spĂžrre seg om

(into {} (map (juxt :foo :bar) xs))
Gir sÄ veldig mye mer mening enn
(set/project xs [:foo :bar])

slipset07:09:14

PĂ„ et litt mer jordnĂŠrt plan, det er litt irriterende at kaffeforbruket mitt pĂ„ 10 dager er 10.2 pakker kaffe 😕

đŸ”„ 3
☕ 3
teodorlu07:09:07

clojure.set har vĂŠrt pĂ„ “jeg skjĂžnner ikke helt”-lista mi lenge. Jeg leser at det er funksjoner for relasjonell algebra, men klarer liksom ikke ta andre enn set/union, set/intersection og set/difference i bruk. juxt liker jeg godt sammen med sort-by:

slipset07:09:40

Klassiker til glede for nye lesere https://ericnormand.me/mini-guide/clojure-set

👀 1
slipset07:09:47

Det som er litt rart med clojure.set er at rename-keys er der, og at Javascript sin implementasjon av Set ikke inneholder union, intersection etc.

yes 1
leifericf07:09:56

clojure.set synes jeg faktisk er litt enklere Ä forstÄ enn en del annet i core, men det er muligens fordi jeg har jobbet mye med "data engineering" og "data science" i SQL, Python, R, samt mange forskjellige GUI-baserte DAG- og ETL/ELT verktÞy (Alteryx, Dataiku, Matillion, SnapLogic, dbt, Airflow, Tableau, Power BI, etc.) hvor det Ä joine sammen mange datakilder via set operations er noe man gjÞre hele tiden hver dag.

leifericf07:09:02

juxt har jeg forsĂžkt Ă„ forstĂ„ flere ganger og forstĂ„r den fortsatt ikke i bruk 😂 Det samme med de andre "higher-order greiene" i core. Jeg forstĂ„r kanskje hva disse funksjonene gjĂžr isolert sett, men ikke nĂ„r og hvordan jeg bĂžr bruke dem, sĂŠrlig nĂ„r de brukes i kombinasjon. Jeg har sett noen sykt kompakte eksempler som kombinerer disse, og det ser elegant ut, men jeg forstĂ„r ikke hva som skjer 😅

slipset07:09:09

Og det er vel noe av det som er problemet. At det blir sÄ veldig kompakt. Noen av oss har jo behov av og til for Ä debugge litt, enten det er med debugger eller med println . Det er sykt mye enklere Ä debugge noe som er skrevet med ->> enn med tilsvarende greie med comp og partial

👍 1
➕ 1
leifericf07:09:34

Fem linjer som setter hele verden i sving 😅

leifericf07:09:43

Podkasten #CKKPVDX53 hadde forresten et par gode episoder hvor de fokuserte pÄ juxt. Da forstod jeg nesten hva den gjorde.

leifericf08:09:25

Aha. NÄr @U9MKYDN4Q sa "point free" tidligere forstod jeg ikke av det var https://en.m.wikipedia.org/wiki/Tacit_programming. Kult. Jeg leste om det nÄ og det setter ord pÄ det jeg har tenkt lenge.

teodorlu08:09:58

Point-free er populĂŠrt i en del andre funksjonelle programmeringssprĂ„k ogsĂ„, feks Elm, Elixir, Haskell og F#. I Elm, Elixir og F# brukes ofte en “pipe-operator” der vi i Clojure ville brukt threading-makroer. Sequence-funksjonene i Elm og Haskell tar som i Clojure inn predikat fĂžrst, og sekvens etterpĂ„! Tror Rich var inspirert av Haskell da han satte opp hvordan ->> funker. Elm-dokumentasjonen har en fin liten intro: https://elm-lang.org/docs/syntax#operators

👍 1
leifericf08:09:39

Jeg elsker pipe operatoren i R og Elixir. Jeg ser parallellen til threads i Clojure. Det har irritert meg grenselÞst at det ikke finnes noe tilsvarende i C# og Python, som jeg bruker mest pÄ jobb. Man har ogsÄ pipe operator i terminalen (`|`), som jeg bruker flittig.

👍 1
teodorlu08:09:14

du har jo dings.ditt(a).datt(b) da 🙂 Uten at det er helt det samme.

👍 1
leifericf08:09:36

Jepp! Men
 Her er et eksempel pÄ hvordan det ser ut med lambdas og "dot-chaining" in the wild:

var labelsDataSimple = (await articleNumberResult
        .Map(articleNumber => new Service.Query.GetLabelsForProduct(query.StoreId, articleNumber))
        .BindAsync(async result =>
            Result<Service.Dto.LabelsDataSimple>.Return(await queryClient.Execute(result))))
    .Map(labelsDataSimpleMapper.Map);
Det er ekte C# produksjonskode (som ikke jeg har skrevet, men mĂ„tte fikse en bug inni der). 😅 NĂ„ er det riktignok mye annet forbedringspotensiale der (for Ă„ si det mildt), men jeg synes ikke "dot-chaining" er spesielt lesbart.

👍 1
leifericf08:09:49

Det gjÞr det ikke mer lesbart at navnet Map her bÄde refererer til Map i .NET Core (tilsvarende map i clojure.core) og custom DTO mappers.

👍 1
magnars10:09:38

@U01PE7630AC Jeg tenker mindre pÄ "egne funksjoner vs clojure.core" og mer pÄ hvordan man bÞr unngÄ Ä pakke inn data i funksjoner som lukker over dem. Jeg vil ha dataene Äpne og fri, tilgjengelige for inspeksjon og manipulasjon, enn gjemt i en tettpakka lÞk av middleware-funksjoner, for eksempel.

👍 2
💡 1
magnars10:09:35

Det er klart at clojure.core har mange gode funksjoner som tar andre funksjoner og returnerer funksjoner - disse bruker jeg uten Ä tenke sÄ mye over, i kraft av Ä vÊre byggeklossene i sprÄket, men jeg prÞver Ä unngÄ "funksjonskomposisjon som arbeidsverktÞy" i design av koden min. SÊrlig i de tilfellene hvor funksjoner skjuler data.

👍 3
teodorlu10:09:39

ala “data > functions > macros”?

👍 1
leifericf10:09:40

Aha, skjÞnner! Takk for forklaringen, @U07FCNURX. Det som fortsatt ikke er helt klart for meg er hvordan data kan brukes istedenfor funksjoner. I mitt enkle hode kan ikke data gjÞre noe av seg selv. Data mÄ vel sendes inn i en funksjon som gjÞr noe med dem. Hvordan unngÄr man da Ä "pakke data inn i funksjoner [som lukker over dem]?" Mener du Ä pakke inn data i in-line/anonyme funksjoner? :thinking_face:

leifericf10:09:30

NĂ„ spĂžr jeg kanskje fryktelig dumt her altsĂ„ 😅

augustl10:09:42

dette er vel kanskje kjernen av FC/IS? SÄnn jeg tolker det handler det om Ä fÄ systemet til Ä generere mest mulig data, sÄnn at fÊrrest mulige ting mÄ utledes ved Ä grave rundt i funksjonshierarkiet

1
leifericf10:09:39

"Jeg vil ha dataene Ă„pne og fri" er forresten T-skjorteverdig 😁

😂 1
cjohansen12:09:48

@U01PE7630AC med fare for Ä blÄse i mitt eget horn sÄ viser jeg noen praktiske eksempler i jz-foredraget mitt, feks hvordan vi designet i18n-lÞsningen vÄr rundt data

👀 1
teodorlu12:09:42

> Det som fortsatt ikke er helt klart for meg er hvordan data kan brukes istedenfor funksjoner. I mitt enkle hode kan ikke data gjĂžre noe av seg selv. Data mĂ„ vel sendes inn i en funksjon som gjĂžr noe med dem. Jeg vil si at funksjoner som transformerer data er mer “inspiserbart” / “sebart” enn funksjoner som transformerer funksjoner. SĂ„ det er ikke “100 % data og ingen funksjoner”, men litt lettere Ă„ se hva som skjer.

magnars14:09:27

Ja, @U3X7174KS beskriver det godt. Istedenfor Ä sende funksjoner rundt som lukker over data, sÄ send dataene rundt. Dette krever et litt annet tankesett enn Ä sende rundt callbacks og ferdig partial-ede funksjoner, men gir deg langt mer innblikk i hvilke data som flyter. Det kan for eksempel bety Ä ha en event-basert arkitektur istedenfor callbacks.

👍 2
teodorlu15:09:06

> Dette krever et litt annet tankesett enn Ă„ sende rundt callbacks og ferdig partial-ede funksjoner, men gir deg langt mer innblikk i hvilke data som flyter. Dette har jeg synes har vĂŠrt skikkelig vanskelig Ă„ lĂŠre med Clojure. Og jeg fĂžler ikke at jeg er i mĂ„l. Jeg ser andre som fĂ„r til enkle lĂžsninger pĂ„ fĂžrste forsĂžk, uten at jeg klarer det selv. “Bruk funksjoner og data, ikke gjĂžr det vanskelig!” sier mye — men for Ă„ komme helt til mĂ„lstreken tror jeg man mĂ„ gjĂžre seg opp en del erfaringer selv. Men dette er noe jeg er motivert til Ă„ lĂŠre.

👍 1
slipset19:09:13

Hvordan vet du at det er pÄ fÞrste forsÞk?

🧠 1
😄 1
teodorlu19:09:06

Godt poeng!

leifericf19:09:01

Det er en utvikler som streamer pÄ YouTube som jeg ser pÄ noen ganger. Han koder i alle mulige sprÄk og lÞser problemer i sanntid. Helt rÄ fyr. Skal se om jeg finner kanalen, husker ikke hva den het. Han gjÞr mye kult pÄ fÞrste forsÞk. Men kanskje han har Þvd seg offline, da.

leifericf19:09:31

Han har en med Clojure ogsÄ, faktisk! Den har jeg ikke sett fÞr. https://www.youtube.com/watch?v=7fylNa2wZaU

teodorlu19:09:30

For meg er hvordan han bruker Emacs underholdning i seg selv 😂

slipset19:09:13

OgsĂ„ morsomt at det gĂ„r ham hus forbi at dette er cast’et i The big bang Theory

slipset19:09:08

OgsÄ bruker han ikke paredit. n00b

đŸ”„ 2