This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2023-11-27
Channels
- # announcements (4)
- # beginners (41)
- # biff (8)
- # cider (14)
- # clj-kondo (5)
- # clojure (45)
- # clojure-brasil (1)
- # clojure-europe (20)
- # clojure-nl (1)
- # clojure-norway (30)
- # clojure-uk (10)
- # clojurescript (8)
- # cursive (25)
- # datomic (20)
- # emacs (11)
- # events (1)
- # hoplon (9)
- # humbleui (7)
- # hyperfiddle (6)
- # lsp (63)
- # matrix (1)
- # observability (20)
- # off-topic (36)
- # polylith (11)
- # re-frame (2)
- # releases (1)
- # rewrite-clj (6)
- # scittle (42)
- # sql (6)
- # squint (86)
- # tools-deps (9)
Er det noen praksis for bruk av thunks i Clojure evt. annen moderne Lisp-bruk? Var det en designmessig blindvei eller et workaround-pattern?
Jag såg begreppet första gången i react-wrappern om.next
av David Nolen. Syftet med dem där var att kunna göra event-replays på statet genom att retrigga thunks på sparade states.
Kanske är deref
, lazy och eventuellt transducers thunk-liknande konstruktioner?
en thunk er bare en funksjon uten argumenter. brukes ofte.
@U013U475882: Må vel være en closure også? Innkapsle verdi(er) eller kontekst/state?
nei, jeg vil si dette er en thunk:
(fn [] (+ 1 1))
vi utsetter komputasjonen, brukeren bestemmer selv om / når den skal kalles og vi krever ingenting fra brukerenmen i praksis vil man nesten alltid ha en closure over noen verdier og/eller io.
brukte mye scheme back in the day og der brukes begrepet thunk mye, eksempel: https://wiki.call-cc.org/eggref/5/http-client
forresten har jeg aldri sett dette mønsteret (kalle en thunk som leser fra standard in port) i et clojure bibliotek. så sånn sett kan man si dette ikke blir brukt, men en thunk er fortsatt bare en funksjon uten formelle argumenter.
Nå er ikke jeg noen ekspert på temaet, men ut fra den beskrivelsen der høres det ut som om det er mer eller mindre hva lazyseq gjør i Clojure?
Lazyseq ser ut til å være en spesialisering. Thunk var vel mest brukt som en closure over argument eller kontekst for senere kall.
[…] a subroutine used to inject a calculation into another subroutine.Min naive tolkning 🙈:
Høres ut some en funksjon A ("koordiantor") som kaller en funksjon C ("applikator") med en ren funksjon B ("kalkulator") som parameter?
Funksjon C er kanskje noe à la map
i Clojure? Funksjon B er funksjonen man gir map
? Funksjon A er kanskje det som kaller map
?
Og lazy-aspektet er "gratis" i Clojure pga. måten datastrukturer og core-greier funker på.
Hoisann! Jeg oppdaget nettopp et tungt brukt Shell-script på hele 1782 linjer. Is it Babashka o'clock? Hold my beer 😎

http://www.cs.unc.edu/techreports/86-020.pdf og https://curtclifton.net/papers/MoseleyMarks06a.pdf har jeg hørt mange prate om oppgjennom årene, også i Clojure-miljøet. Jeg har lest disse. Men jeg lurer på om det kanskje finnes flere slike "legendariske papers" som "alle" utviklere bør lese. Vet dere om noen flere slike?
Java Concurrency in Practice (Goetz) https://jcip.net/ , this is obviously a book, but Rich Hickey sometimes claims that Clojure is just a wrapper around the java.util.concurrent library (förlåt engelskan. blev alldeles medryckt i en annan konversation.)
"In summary, in functional programming, a reducer is a function used with reduce
to process collections, while a thunk is a function representing a deferred computation. They serve different purposes, with reducers focusing on aggregation and thunks on deferred execution."
Reducer:
(defn sum-reducer [acc x]
(+ acc x))
(def numbers [1 2 3 4 5])
(def sum (reduce sum-reducer 0 numbers))
Thunk:
(defn my-thunk []
(fn []
(println "Executing thunk!")
(+ 1 2)))
(def delayed-computation (my-thunk))
(def result (delayed-computation))
(https://chat.openai.com/share/8549567d-9d15-47c7-a418-68bec2ec957d)