Morn!
Morn!
Morn!
Morn!
Morn!
God morn!
mårn!
Mornings! 👋
God morgen!
Morn!
Morn!
God morgen.
Jeg involverte meg litt i https://clojurians.slack.com/archives/C8NUSGWG6/p1764002732150829, men tør liksom ikke pushe så veldig, så jeg spør her også. Jeg synes ikke makroer er den sølvkula som Nathan og Paul Graham påstår at det er. Er det da jeg som er en flattie eller har keiseren fått nye klær? Makroeksemplene som Nathan viser i tråden er sånn som jeg synes kanskje er søte og hjelpsomme, men det er jo liksom ikke det som gjør at et produkt blir en suksess eller ei?
Jeg har ikke lest denne diskusjonen, men "det er ikke det som gjør at et produkt blir en suksess eller ei" kan brukes mot omtrent alt av programmeringsspråk-features, organisasjoner er et blindspor IMO.
den er litt drepen den der ja. På alle akser egentlig, ikke bare tekniske ting. "Vi trenger ikke bra UX for å tjene penger"
> Makroeksemplene Makroøkonomi?
La meg omformulere. Makroer er ikke noe jeg savner på frontenden, funksjonell programmering og immutable data er. Også data orientert programmering. Så, hvis jeg fikk velge en ting jeg kunne ta med meg fra Clojure til Typescript, så ville ikke makroer vært den ene tingen.
Og mitt spørsmål er da, hvis Nathan og Paul Graham mener at makroer er så viktige, hva er det jeg ikke har fått med meg.
kan det være skillet på "språkfunksjonalitet for businesslogikk" og "språkfunksjonalitet for biblioteker og mekanismer"? Sistnevnte nyter godt av macroer og det gjør Clojure-koden du skriver og, selv om du ikke definerer makroer som en del av businesslogikken
Jo, men essensen i Paul Grahams essay er jo at vi løp sirkler rundt konkurrentene våre fordi vi hadde makroer.
"Beating the averages" kommer fra en tid og kontekst hvor sånne ting kanskje hadde mere å si? 🤔 Tilgjengeligheten av biblioteker på JVM-en er en større fordel enn verdens teoretisk sett beste programmeringsspråk uten et bibliotek-økosystem. Kanskje man skrev mye mere "biblioteker og mekanismer" den gangen f.eks
altså, differansen mellom funksjonaliteten i programmeringsspråk har mere å si når det er i praksis den eneste variabelen som skiller teknologivalg fra hverandre
Og det er på en måte greit, men at Nathan da reiterer dette, synes jeg er rart.
Jeg har fortsatt ikke lest hverken bloggposten eller diskusjonen, men inntrykket mitt fra foredraget hans i London var at han brukte makroer for å flytte ting compile time - altså for ytelse. Det kan jo være en fordel for noen ting, men jeg ser heller ikke at det skal være banebrytende for de fleste informasjonssystemer.
Hver eneste gang jeg har tenkt "kanskje jeg kan lage en macro for dette" har jeg endt opp med kaste vekk tid på å knøle med macroen, for så å innse at en vanlig funksjon er enklere og bedre. Nå tenker jeg mer "hvis du kan gjøre det uten å lage en macro, så gjør heller det".
Det man må bruke macroer til er når du vil endre på hvordan noe kode evalueres (eks. utsette evaluering til når/om det trengs (`and`, or) eller gjøre i en tråd (`future`, core.async/go) osv.) Så det er jo helt gull at clojure har muligheten til å lage slike ting programmatisk, uten at det må være en egen ✨ language feature ✨. Men jeg skriver nesten aldri slike funksjoner selv.
Vi har funnet et bra use-case for macro’er på jobb: LLM kode-generering. Vi har en chat-bot der i stedet for at LLM’en har tilgang på 20+ tools for å utføre oppgaver så har den 1 tool: execute_clojure , der den skriver Clojure-kode for å utføre det den ønsker. Vi evaluerer koden sandboxed med SCI (small clojure interpreter). Det funker veldig bra. Brygger på en bloggpost.
Og nå jobber vi med et use case der LLM’en skal skrive hele workflows definert i Clojure-kode (tenk Zapier/n8n/..). Da er det svært kraftig og token-besparende å ha et eget DSL LLM’en kan skrive i.
E.g.
(workflow [input]
(let [a (step :fetch {:type :http ...
:retry {...}})
b ,,inline calc
c (step :process {:type :code
:code '(transform data)
:bindings {'data :fetch}})
d (step :summarize {:type :llm
:prompt "Summarize the data"})
,,]))
Dette expandes til Temporal-workflows. Så vi har vår DSL macroexpander til clojure temporal sdk wrapper -> macroexpand til temporal java sdk.
I motsetning til meg er LLM’en helt tilfreds med å lære og anvende nye DSL’er. Det har vært mitt største problem med custom macro’er tidligere – at jeg må essensielt lære et nytt språk, i stedet for clojure.core etc og de kjente datastrukturene.Begynte å tenke på macroer i forbindelse med comptime i Zig, som er et språk jeg har tenkt å pusle litt med i årets Advent of Code, og det virker jo ofte som om ytelse kan være en stor gevinst? Det er jo et fint verktøy å ha i kassa for det formålet.
https://github.com/onionpancakes/chassis-biblioteket har kompileringsfunksjoner for å kompilere hiccup-syntaks, for eksempel, og nevnte https://github.com/redplanetlabs/specter gjør det samme samme for “path-ene”. https://github.com/taoensso/telemere/tree/master?tab=readme-ov-file#performance/https://github.com/taoensso/tufte/blob/master/src/taoensso/tufte.cljc#L243 bruker makroer for å fjerne loggekode hvis det er deaktivert i konfigurasjon.
Morn, morn
god morgen!
Uncle Bob prater fint om Clojure i første delen av https://youtu.be/FWQ5ICLEOu8.