stdout a stderr jsou polymorfní abstrakce, žádnej globální resource :simple_smile:
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
Resp. jak by se pak stdout a spol. presmerovaly, pokud je to "polymorfni abstrakce", kterou ale nikde nepredavam, a ne globalni resource?
logovani = side effect = to by melo byt taky jen na urcitych mistech
@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)
@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.
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.