Mam designovej dotaz na pritomne clojuristy. Mirne zjednodusena situace: rekneme ze pisu clojure knihovnu pro komunikaci s nejakym serverem. Ta komunikace neni bezstavova, potrebuju udrzovat nejakej kontext (napriklad autorizacni cookie nebo tak neco), kterej vznika prihlasenim. A rekneme, ze v 99% procentech pripadu programy tu knihovnu budou pouzivat tak, ze se na zacatku prihlasej a celej zbytek behu budou pouzivat tenhle jeden kontext. Nicmene, v 1% bude program potrebovat se s tim serverem bavit pod vice identitama, bud soucasne ve vic threadech, nebo "soucasne" v jednom threadu ale na stridacku.
Kdybych chtel pokrejt jen tech 99%, tak je to jednoduchy. Kontext strcim do nejaky top-level var *connection* a vsechny funkce ty knihovny si ho vezmou odtamtud. Jenomze to nefunguje pro to zbyly jedno procento. Jak to nejlip idiomaticky vyresit?
(1) Proste budu mit funkci (connect username password) ktera mi vrati prislusnej kontext, kterej pak budu strkat do kazdy dalsi funkce te knihovny jako prvni parametr. Coz je strasnej voser, protoze nejen se s tim musim psat, ale musim ho postupne predavat i do vsech svejch funkci aby k nemu mely pristup, atd. A pro tech 99% programu to bude zcela zbytecna prace, protoze to bude porad to samy.
(2) Pouzit top-level var, rekneme *connection*, rict o nem ze je ^:dynamic a v pripade ze potrebuju jinej nez "globalni" kontext, obalit prislusnej kod do (binding [*connection* other-context] ...). Coz mi prislo strasne super, ale pak mi doslo, ze per-thread promene se nededi, takze kdyz bych v ramci toho "binding" zavolal rekneme "pmap" s funkci, ktera by volala moji knihovnu, cely by se to straslive rozbilo protoze thread ze kteryho volam pmap by videl jiny *connection* nez thready vytvorenej pmapem. Coz samozrejme jde resit, ale uplne vidim ty debilni chyby ktery by se blbe hledaly kdyz na to clovek zapomene.
(3) pro kazdou funkci v knihovne mit dve alternativy, jednu s connection parametrem a druhou bez (pouzivajici globalni). Co by slo jednoduse delat makrem, ale prijde mi to trochu osklivy.
Nexistuje nejaky jiny, hezci reseni ktery nevidim? Takovy ktery tech 99% resi trivialne a to zbyly jedno procento je treba i trochu psani navic, ale elegantni a funkcni?