Fork me on GitHub
#clojure-norway
<
2023-11-27
>
infosophy07:11:07

Er det noen praksis for bruk av thunks i Clojure evt. annen moderne Lisp-bruk? Var det en designmessig blindvei eller et workaround-pattern?

Linus Ericsson09:11:08

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?

💡 1
👌 1
hanDerPeder11:11:23

en thunk er bare en funksjon uten argumenter. brukes ofte.

infosophy08:12:48

@U013U475882: Må vel være en closure også? Innkapsle verdi(er) eller kontekst/state?

hanDerPeder10:12:01

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 brukeren

hanDerPeder10:12:11

men i praksis vil man nesten alltid ha en closure over noen verdier og/eller io.

hanDerPeder10:12:27

brukte mye scheme back in the day og der brukes begrepet thunk mye, eksempel: https://wiki.call-cc.org/eggref/5/http-client

hanDerPeder10:12:04

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.

infosophy07:11:13

Mener å ha sett det i ELisp?

infosophy07:11:31

Men det er jo ingen garanti for moderne praksis…

cjohansen07:11:34

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?

infosophy08:11:32

Lazyseq ser ut til å være en spesialisering. Thunk var vel mest brukt som en closure over argument eller kontekst for senere kall.

infosophy08:11:57

Spesialisering ifht. thunk, mener jeg.

leifericf08:11:11

[…] 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å.

leifericf09:11:15

Hoisann! Jeg oppdaget nettopp et tungt brukt Shell-script på hele 1782 linjer. Is it Babashka o'clock? Hold my beer 😎

clojure-spin 4
leifericf12:11:10

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?

Linus Ericsson12:11:50

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.)

👀 1
💯 1
augustl13:11:29

chatgpt, hva er forskjellen på en thunk og en reducer?

leifericf13:11:08

"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)

slipset14:11:51

Also, reducing fns are much cooler, because some of them form monoids. Thunks are just constants :)