Mini Scheme

Nemrégiben fejeztem be két aranyos Scheme könyvet a Little Schemert, és a folytatását a Seasoned Schemert. Bár nem sok újdonságot találtam bennünk, mégis nagyon szerethetők, főleg az illusztrációk miatt.

fotó 3 (1)Ami igazán megfogott benne, és végül rávettem magam egy kis munka utáni hobbi projektre, az a call with current continuation, vagy call/cc volt. Még sosem volt dolgom olyan nyelvvel, ami ezt a konstrukciót támogatná, pedig ezer dolgot lehet vele csinálni például returnt, kivételkezelést, lazy generátorokat, vagy akár threadeket is szimulálni.

Lényegében arról van szó, hogy készítesz egy blokkot, ami futáskor paraméterül megkap egy continuationnak nevezett függvényt. Ezt aztán elteheti magának későbbi felhasználásra, és amikor éppen arra támad kedve meghívhatja. Ekkor a vezérlés a blokk utáni lépéssel folytatódik. Valahogy úgy lehet elképzelni, mintha a continuationben eltárolnánk a call stacket meg a következő utasításra mutató instruction pointert, ezt odaadnánk a blokknak, és híváskor visszaállnánk az eltárolt állapotba.

Az érdekes az benne, hogy a continuationt eltehetjük egy változóba is, és tényleg bármikor, akár a blokkon kívülről meg szabad hívni.

Namost én már írtam néhány interpretert és compilert kisebb nyelvekhez, de ilyet még egyik se tudott csinálni, ráadásul idén nem volt semmi mini projektem se a csókaváron, szóval hogy úgy mondjam szüksészerűvé vált a dolog. És ha már ott vagyunk miért ne csináljam TypeScriptben, hogy egyből demozható is legyen, nem igaz? Na ez amilyen jól hangzik, akkora baromság volt, tekintve, hogy mekkora trágyalé ez az egész TypeScript fejlesztés, de ha már elkezdtem, végig is toltam. A projektek között megtalálható, meg githubon is akinek arra van gusztusa.

minischeme

Az implementáció nem volt különösebben bonyolult, feltéve hogy valaki tisztában van a continuation passing style-lal. Ahelyett, hogy magát a call/cc-t implementáltam volna meg ugyanis, egyszerűbb volt úgy megfogni a problémát, hogy minden utasítás paraméterként megkapja azt a continuationt, ami a program hátralevő részét értékeli ki. Így aztán, mondjuk egy értékadás előbb elvégzi a mellékhatásait, aztán csak meghívja a continuationt, hogy mehet tovább srácok.

Még egy trükköt vetettem be, hogy a klasszikus debugger funkcionalitást (break, step, continue) is hozzáadhassam a demóhoz, és futás közben kényelmesen írhassak log üzeneteket is egy div-be. Az egész kiértékelést vezérlő BaseEvaluator bizonyos számú lépés után ahelyett, hogy meghívná a continuationt, visszaadja azt az editornak mint részeredményt. Itt aztán frissítjük a UI-t, lekezeljük az eseményeket és hagyjuk egy kicsit fellélegezni a böngészőt, hogy aztán egy window.setTimeout-ban egy pillanattal később folytassuk az egészet.

A példák között vannak klasszikusak (faktoriális, 8 királynő) és a wikipediáról kimásolt call/cc demók is. Nem mondanám, hogy teljes core libraryt csomagoltam mellé, inkább csak olyan ahogy esik úgy puffan alapon vettem fel néhány függvényt aritmetikai és logikai műveletekre, meg listakezelésre.

  1. Hat ez tok jo! Tudnal esetleg egy kozbulso modot a step es a run koze, amikor folyamatosan fut, de lassan, es latszik ahogy valtozik az allapot? Magyaran mintha nyomogatna helyettem a step gombot.

    Mondjuk a zaro-zarojelek uj sorba irasa a peldaprogramokban kriminalis vetseg a Lisp/Scheme kozizles ellen :P

  2. Tenyleg, es ha mar JS-ra fordulo szutyok nyelvek, a PureScriptet nezted? Elso ranezesre sokkal szimpatikusabbnak tunik, mint ez a TypeScript. Ja, es gratu h vegigtoltad! :)

  3. Megtisztelő a gratuláció, még ha mellé raktál is egy bezzeg én ezt mind csináltam 2015-ben listát.

    A zárójeles környezetszennyezést beszüntettem. (És a csodás githubos webhookom már ki is deployolta az új verziót.)

    A purescriptes ember vagy valamelyik evangelistája volt nálunk tavasszal, de nem fogott meg különösebben, kb olyan volt mintha valakinek a mini projektje lenne. Az Elm érdekesebbnek tűnik, bár az is ugyanilyen mini projekt. Szóval jókora melléfogás volt, de az ipari standard TS-t választottam, mert azt hittem hogy jó lesz, és piacképes tudást szerzek vele (na persze melyik piac). Mi bent Haxe-ot is használunk ami megint csak egy mini projekt, de a másik hárommal ellentétben teljesen jó.

    Mostanában elindult a TS nyomatása odabent, de ezek után nem teljesen értem hogy miért. Bár ha az ember túllendül az external-internal modulokon, meg azon hogy a fordítónak kézzel függőségi sorendbe rendezve kell odaadni az input fájlokat, hogy ne legyen runtime exception (mégis mit szívtak???) talán bele lehet jönni. Anders bácsitól kicsit többre számítottam.

  4. Ez az itdadao egy létező oldal, vagy csak valami robot aggregálja az internetet és így lopkodnak tartalmat maguknak?

  5. Nem vagom ezt az itdadao-t, en is csak pislogtam amikor meglattam itt… Ja, es amikor elkezdtem irni a blogposztot, meg en se tudtam hogy lam milyen sokminden lesz benne.