clojure-norway

slipset 2020-06-20T10:26:12.114500Z

Jeg skrev en kommentar til @magnars vedr hans threading post. Han ha’kke kommentert på den, så jeg tar sjansen på å legge den her: Hey! Bra blogpost om threading. En ting som jeg synes threading hjelper veldig med er at man unngår dype call-stacks på godt og vondt. Jeg har ikke helt klart å formulere dette ordentlig, men i java er det jo ikke uvanlig å skrive kode som dette (som jeg skriver i Clojure :):

(defn d [...] )

(defn c [...]
  ...
  (d ...))

(defn b [...]
   ...
  (c ...))

(defn a [...]
  ...
  (b ...))

slipset 2020-06-20T10:26:41.114600Z

Dette er ofte et resultat av "extract method". Problemet her er at alt er like tett koblet som det en gang var, og det er vanskelig å leke med ting i isolasjon. Threading hjelper deg til å skrive dette på en mer funksjonell måte:

(->> a b c d)
Sånn ca.

Jakub Holý 2020-06-20T18:35:44.114700Z

Hei! Hvor kan jeg se posten hans? Takk!

2020-06-20T19:20:25.115500Z

:thinking_face: :thinking_face: :thinking_face: :thinking_face: blir ikke call stacken like dyp? :thinking_face: :thinking_face:

slipset 2020-06-20T19:21:25.115800Z

Nei, den gjør ikke det (tror jeg)

slipset 2020-06-20T19:22:49.117400Z

(f (g (h (i)))) har til enhver tid bare en funksjon på stacken (sånn jeg forstår det) fordi du lar i gjøre seg ferdig før du kaller h som må få gjøre seg ferdig før du kaller g osv.

slipset 2020-06-20T19:24:18.119Z

Der du kaller fra en "tail" posisjon over kunne man sikkert gjort sånn som man gjør med tco, nemlig bytte ut hele stack -framen med det som skal til for å invokere funksjonen i tail-posisjon, men det kan man jo ikke gjøre på jvm'en i allefall.

2020-06-20T19:50:02.119700Z

hmmm ja, det er jo et poeng, mens i den andre er det tail calls, og jvm-en har ikke tco, riktig

slipset 2020-06-20T19:51:54.120500Z

Nå er det egentlig ikke de dype call-stackene jeg ikke liker, men heller det at koden er "koblet" selvom vi har ekstrahert funksjonenen.

2020-06-20T19:52:04.120900Z

how do you even stack... For å kalle h, må du jo ha returverdien fra i på stacken

slipset 2020-06-20T19:53:03.122Z

Jo, du må ha returverdien på stacken, men i det første eksemplet har du 4 stackframes kjørende. Det har du ikke i det andre eksemplet.

slipset 2020-06-20T19:53:34.122600Z

(tror jeg). Dette er jo langt over mitt inkompetansenivå, selvom jeg tok IN140 en gang tidlig på nittitallet.

2020-06-20T19:54:41.123400Z

ja, for de smarte datamaskinene være tar vel bare returverdien til i og gjør om til inputverdien til h, får man tro

2020-06-20T19:54:44.123600Z

på smarte EDB-måter

2020-06-20T19:55:30.125Z

ordet "calling conventions" havnet i hodet mitt, er vel masse detaljer rundt akkurat hvordan de gjør det. Men de trenger jo ikke å ta vare på eventuelel input-verdier til i og andre funksjonskall som har skjedd inni i, osv

slipset 2020-06-20T19:55:33.125100Z

I det første eksemplet kan man ikke kalle a uten å også kalle b, c, og d (uten å bedrive mocking/redeffing

1☝️
slipset 2020-06-20T19:55:55.125600Z

I det andre eksempet er kan man lett kalle a i isolasjon, noe som er nice mhp tester.

2020-06-20T19:56:22.125900Z

ah, et annet killer argument

2020-06-20T19:56:25.126100Z

godt poeng

2020-06-20T19:56:46.126500Z

Rich Hickey følte nå en disturbance in the force, as if someone understood how decomplected Clojure is

1😄
slipset 2020-06-20T19:57:24.127100Z

🙂

Jakub Holý 2020-06-20T21:44:15.127200Z

Takk!