clojure-czech

rarous 2016-04-20T04:35:12.000065Z

stdout a stderr jsou polymorfní abstrakce, žádnej globální resource :simple_smile:

jbrestan 2016-04-20T08:06:30.000067Z

Neni pouziti stdout/in/err nepriznana zavislost? Ja bych to resil HOF a partial aplikaci, ale nevim, jak moc je tohle v Clojure bezny pristup

jbrestan 2016-04-20T08:07:44.000068Z

Resp. jak by se pak stdout a spol. presmerovaly, pokud je to "polymorfni abstrakce", kterou ale nikde nepredavam, a ne globalni resource?

maio 2016-04-20T08:10:52.000069Z

logovani = side effect = to by melo byt taky jen na urcitych mistech

2016-04-20T10:48:28.000070Z

@maio: a to je zase o tom jaky typ kodu pises, pokud delam matematickou knihovnu, tak logovat moc nepotrebuju, napisu baterii testu a jsem hotov, pokud stavim produkcni aplikaci, ktera dlouhodobe bezi na serveru a reaguje na “nezname vstupy/eventy z okoli” a produkuje “nezname vystupy” tak zkratka potrebuju logovat jeji chovani (to jsou dva extremni priklady uplne rozdilnych typu kodu)

2016-04-20T10:58:23.000072Z

@rarous: nevim co myslis "polymorfni abstrakci", to bys mi mohl vysvetlit :simple_smile: ja slovo resource dal do uvozovek. ve skutecnosti je *out* a *err* jen dynamicky vary (sice implementovany v javove casti Clojure implementace clojure.core ale to je asi jedno). A jako kazdy var ho muzes dynamicky prebindovat pomoci bindings a podobnych (predpokladm, ze tohle je ta technika “o uroven vejs” co jsi popisoval). To samozrejme resi spoustu use-cases, kdyz je potreba vystupy presmerovat, ale neni to kompletni reseni. Clojure navrhari mysleli na thready, takze tam to jeste funguje, bindingy jsou thread-local. Ale porad to neni 100% doreseny. Jak jsem rikal, jakmile zabrousis do asynchronniho programovani a zacnes pouzivat callbacky nebo core.async (`go` bloky) tak toto dynamicke bindovani nefunguje spravne. Toto mozna neni takovy problem pri sani java kodu, ale je to dost oser v javascriptu, kde zadne thready nejsou a callbackum se nevyhnes.

2016-04-20T11:06:05.000075Z

A navic nevim jestli si to uvedomujete, ale ja se tady bavim hlavne o psani knihoven. Kdyz clovek pise aplikaci, tak ma vetsinou jasny obrazek v jakem kontextu ten kod bude pouzity a jestli bude potreba ho “kontextualizovat” (vetsinou nebude). Ale predstav si, ze nekdo pise knihovnu A a potrebuje logovat. Zvoli nejake reseni, treba log4j. Nekdo jiny pise knihovnu B a potrebuje logovat. Zvoli nejake jine reseni, treba jeho custom logovaci knihovnu. A pak je nekdo kdo chce pouzit knihovnu A i B ve sve aplikaci. Ten nekdo ma problem. Ten nekdo by idealne potreboval knihovnu A i B “kontextualizovat” a nahradit vsechna tvrda volani do log4j a custom knihovny necim co muze predat “zvenku” jako logovaci kontext. A pak se rozhodnout co tim kontextem bude, jestli log4j, custom knihovna, nebo neco jineho.