A C++ template metaprogramoz´ as ´ es a funkcion´ alis programoz´ as kapcsolata
Doktori ´ertekez´es t´ezisei 2013
´ Sinkovics Abel
[email protected]
T´emavezet˝o: Porkol´ ab Zolt´ an, egyetemi docens E¨otv¨os Lor´and Tudom´anyegyetem, Informatika kar, 1117 Budapest, P´azm´any P´eter s´et´any 1/C ELTE IK Doktori Iskola Doktori program: Az informatika alapjai ´es m´odszertana Az iskola vezet˝oje: Dr. Bencz´ ur Andr´as akad´emikus A doktori program vezet˝oje: Dr. Demetrovics J´anos akad´emikus
A projekt az Eur´opai Uni´o t´amogat´ as´ aval, az Eur´opai Szoci´ alis Alap t´arsfinansz´ıroz´ as´ aval val´osul meg (a t´amogat´ as sz´ama TAMOP 4.2.1./B-09/1/KMR-2010-0003).
2
1.
Bevezet´ es
A dolgozat C++ template metaprogramoz´ast seg´ıt˝o m´odszereket mutat be, melyek a C++ k¨onyvt´arak ´es alkalmaz´asok fejleszt˝oit t´amogatj´ak. A dolgozat azon fejleszt˝ok sz´am´ara k´esz¨ ult, akik m´ar ismerik a C++ programoz´asi nyelvet. 1994-ben Erwin Unruh bemutatta [32], hogy lehets´eges egy C++ ford´ıt´o seg´ıts´eg´evel, template p´eld´anyos´ıt´asok mell´ekhat´asak´ent algoritmusokat v´egrehajtani. Az ezen a m´odszeren alapul´o programokat C++ template metaprogramok nak h´ıvj´ak. Ezek egy Turing-teljes r´esznyelv´et alkotj´ak a C++-nak [35]. A metaprogramokat a fejleszt˝ok t¨obbs´ege nem k¨ozvetlen¨ ul haszn´alja, hanem metaprogramokon alapul´o k¨onyvt´arakon kereszt¨ ul. Mivel a template metaprogramok ford´ıt´asi id˝oben ker¨ ulnek v´egrehajt´asra, seg´ıts´eg¨ ukkel a C++ nyelvnek sz´amos kiterjeszt´es´et meg lehet val´os´ıtani a ford´ıt´o m´odos´ıt´asa n´elk¨ ul. • Speci´alis alkalmaz´asi ter¨ uletet (adatb´azis el´er´es, regul´aris kifejez´esek, stb.) t´amogat´o C++ k¨onyvt´arak sz´am´ara hasznos ha az alkalmaz´asi ter¨ ulettel kapcsolatos hib´akat (adatb´azis mez˝oinek t´ıpusaival kapcsolatos hib´ak, hib´as regul´aris kifejez´esek, stb.) m´ar ford´ıt´asi id˝oben jelezni lehet. Template metaprogramok seg´ıts´eg´evel megval´os´ıthat´ok ilyen ellen˝orz´esek [7]. • A dom´en specifikus nyelvek (DSL) [6] egyre n´epszer˝ ubbek. Ezek egyszer˝ u nyelvek, melyeket egy adott ter¨ ulet sz´am´ara fejlesztettek ki. Azon a ter¨ uleten hat´ekonyabbak, mint m´as nyelvek, viszont m´as ter¨ uleteken haszn´alhatatlanok. Vannak sz´eles k¨orben ismert ´es haszn´alt dom´en specifikus nyelvek, mint p´eld´aul az SQL vagy a regul´aris kifejez´esek. Ezeket a nyelveket egy (vagy t¨obb) ´altal´anos c´el´ u programoz´asi nyelvvel egy¨ utt szokt´ak haszn´alni. A DSL ´altal lefedett ter¨ uletre specifikus r´eszeit a programnak a DSL-ben, a t¨obbi r´eszt pedig az ´altal´anos c´el´ u nyelven szokt´ak meg´ırni. Amikor a DSL-ben ´ırt k´odr´eszleteket be´agyazz´ak az ´altal´anos c´el´ u nyelven ´ırt k´odba, be´agyazott DSL-ekr˝ol (EDSL) besz´el¨ unk. Template metaprogramok seg´ıts´eg´evel DSL-ek hat´ekonyan be´agyazhat´ok a C++ nyelvbe [27]. • A fejleszt˝ok gyakran k´enytelenek ism´etl˝od˝o, csup´an kev´es r´eszletben k¨ ul¨onb¨oz˝o k´odot ´ırni. Az esetek t¨obbs´eg´eben ezeket a k´odr´eszleteket megl´ev˝o k´od m´asol´as´aval ´es m´odos´ıt´as´aval k´esz´ıtik el. Template metaprogramok haszn´alat´aval el´erhet˝o, hogy a C++ ford´ıt´o gener´alja ezeket a k´odr´eszleteket [1]. 2
• A C++ ford´ıt´ok optimaliz´alj´ak a k´odot, hogy gyorsabban fusson vagy kevesebb mem´ori´at haszn´aljon. Azonban a ford´ıt´o csak olyan optimaliz´aci´okat hajthat v´egre, melyek a k´od m˝ uk¨od´es´et nem v´altoztatj´ak meg. Sok esetben enn´el hat´ekonyabb optimaliz´aci´okat is el lehet v´egezni azon alkalmaz´asi ter¨ uletnek ´es annak szab´alyszer˝ us´egeinek ismeret´eben, mely sz´am´ara a program k´esz¨ ult. Ezeket a ford´ıt´o nem ismeri, azonban ezek a optimaliz´aci´ok template metaprogramok seg´ıts´eg´evel megval´os´ıthat´ok [34, 36, 33]. • Amikor u ´j elemek ker¨ ulnek a C++ nyelvbe vagy amikor valaki ki szeretne pr´ob´alni egy u ´jonnal kital´alt nyelvi elemet, a ford´ıt´ot m´odos´ıtani kell, hogy t´amogassa azt. Ez azonban sokszor neh´ezkes vagy nem is lehets´eges. Ellenben template metaprogramok seg´ıts´eg´evel sz´amos nyelvi elemet lehet szimul´alni [37]. A C++ template metaprogramok megval´os´ıthat´ok szabv´anyos C++ k´oddal, ´ıgy minden ford´ıt´o, mely a szabv´anyt k¨oveti k´epes ´ertelmezni ´es v´egrehajtani ˝oket.
2.
C´ elkit˝ uz´ esek
A C++ nyelv fejleszt´ese sor´an nem volt c´el a template metaprogramoz´as t´amogat´asa. Ennek eredm´enyek´eppen a metaprogramok szintaxisa bonyolult lett. Metaprogramokat neh´ez olvasni, ´ırni ´es karbantartani. A C++ template metaprogramoz´as ´es a funkcion´alis paradigma kapcsolata j´ol ismert [13, 3, 14, 5, 16, 30, 8, 9]. Sz´amos hasonl´os´ag van a C++ template metaprogramoz´as ´es a funkcion´alis nyelvek, mint p´eld´aul a Haskell logik´aja k¨oz¨ott. Fut´asi id˝oben v´egrehajtott C++ k´od k´esz´ıt´es´ehez vannak k¨onyvt´arak, melyek a funkcion´alis programoz´ast t´amogatj´ak [12, 4], viszont template metaprogramoz´asban a jelenleg haszn´alt m´odszerek [1, 10, 2] az imperat´ıv nyelveket ´es k¨onyvt´arakat szimul´alj´ak. A dolgozat megvizsg´alja, hogy a template metaprogramok olvashat´os´ag´at milyen m´odon lehet a funkcion´alis paradigma ment´en jav´ıtani. A dolgozat k´et m´odszert t´argyal. Az egyik m´odszer a jelenleg haszn´alt eszk¨oz¨oket ´es m´odszereket b˝ov´ıti funkcion´alis nyelvekben gyakori elemekkel. T¨obbek k¨oz¨ott bevezeti az algebrai adatt´ıpusokat, let kifejez´eseket, mintailleszt´est, a curry-z´es ´es a typeclass fogalm´at. Bemutatja tov´abb´a, hogy hogyan lehet implement´alni a mon´adokat, melyek seg´ıts´eg´evel megval´os´ıthat´o a list comprehension, illetve szimul´alhat´o a kiv´etelkezel´es. 3
A m´asik m´odszer egy Haskell-szer˝ u DSL-t val´os´ıt meg a template metaprogramoz´as sz´am´ara. Az ezen a nyelven ´ırt metaprogramokat karakterl´anc liter´alokban lehet C++ k´odba ´agyazni. A C++ k´od ford´ıt´asakor ezek metaprogramokk´a lesznek alak´ıtva ´es r¨ogt¨on v´egrehajt´asra ker¨ ulnek. Ennek megval´os´ıt´as´ahoz a dolgozat bemutatja, mik´ent lehet karakterl´anc liter´alokat template metaprogramokkal feldolgozni. Ez lehet˝ov´e teszi a DSL-ek hat´ekony be´agyaz´as´at C++-ba, melyre a dolgozat alkalmaz´asi p´eld´akat mutat be.
3.
Eredm´ enyek
Annak ellen´ere, hogy a template metaprogramoz´as ´es a funkcion´alis paradigma hasonl´os´agai ismertek, a gyakorlatban haszn´alt metaprogramokat nem a funkcion´alis paradigma ment´en k´esz´ıtik. Ez a dolgozat k´et m´odszert mutat be, melyek template metaprogramoknak a funkcion´alis paradigma alapj´an t¨ort´en˝o fejleszt´es´et t´amogatj´ak. A bemutatott m´odszerek a C++11 szabv´anyt haszn´alj´ak, b´armely szabv´anyos ford´ıt´oval haszn´alhat´ok. Egyik¨ uk sem ig´enyel tov´abbi eszk¨oz¨oket. Az 1. ´abra bemutatja a dolgozat logikai szerkezet´et. A felh˝o jel¨oli a dolgozat alapgondolat´at, a lekerek´ıtett sark´ u t´eglalapok a t´ezisek. A fejezetek sz´amai, melyekben egy adott t´ema ki van fejtve kis t´eglalapokban vannak az ´abr´an fel¨ untetve. A vastag sz¨ urke keretes t´eglalapok jel¨olik az adott m´odszerek haszn´alat´ab´ol sz´armaz´o el˝ony¨oket. Az els˝o m´odszer funkcion´alis nyelvek alapvet˝o elemeit val´os´ıtja meg template metaprogramoz´asban, majd ezekre alapozva magasabb szint˝ u elemeket ´ep´ıt. A bevezetett elemek mind a sz´eles k¨orben haszn´alt Boost.MPL k¨onyvt´arra ´ep¨ ulnek, ez´ert b´armely programban k¨onnyen bevezethet˝ok, mely ezt a k¨onyvt´arat m´ar haszn´alja. 1. T´ ezis: Megvizsg´altam a C++ template metaprogramoz´as ´es a funkcion´alis programoz´asi nyelvek kapcsolat´at. Az eredm´enyek alapj´an kidolgoztam m´odszereket, melyek a funkcion´alis paradigm´at k¨ovet˝o fejlszet˝oket seg´ıtik template metaprogramok ´ır´as´aban. (III. fejezet) 1.1. T´ ezis: Megmutattam a lusta ki´ert´ekel´es jelent˝os´eg´et a template metaprogramoz´asban ´es kidolgoztam egy m´odszert, melynek seg´ıts´eg´evel lusta ki´ert´ekel´est nem t´amogat´o metaf¨ uggv´enyeket is lehet olyan m´odon haszn´alni, mintha t´amogatn´ak azt. (III.1. fejezet) 1.2. T´ ezis: Kidolgoztam egy m´odszert a curry-z´es hat´ekony megval´os´ıt´as´ara C++ template metaprogramoz´asban. (III.2. fejezet) 1.3. T´ ezis: Kidolgoztam egy m´odszert a Haskell nyelvben haszn´althoz hasonl´o algebrai adatt´ıpusok megval´os´ıt´as´ara C++ template metaprogramoz´asban. (III.3. fejezet) 4
1. ´abra. A dolgozat szerkezete
5
1.4. T´ ezis: Kidolgoztam egy m´odszert Haskell typeclass-ok megval´os´ıt´as´ara C++ template metaprogramoz´asban. (III.4. fejezet) 1.5. T´ ezis: Kidolgoztam egy m´odszert, melynek seg´ıts´eg´evel template metaprogramoz´asbeli kifejez´eseket lehet t´arolni, param´eterk´ent ´atadni vagy f¨ uggv´enyh´ıv´as eredm´enyek´ent visszaadni. Ez a m´odszer lehet˝ov´e teszi let kifejez´esek megval´os´ıt´as´at ´es ad egy a Boost.MPL ´altal biztos´ıtott ´es sz´eles k¨orben haszn´altn´al hat´ekonyabb m´odszert lambda kifejez´esek megval´os´ıt´as´ara. (III.5. fejezet) 1.6. T´ ezis: Kidolgoztam egy u ´j m´odszert a mintailleszt´es megval´os´ıt´as´ara C++ template metaprogramoz´asban, mely lehet˝ov´e teszi case kifejez´esek haszn´alat´at. (III.6. fejezet) A dolgozat bemutatja, hogy az 1. T´ezisben bemutatott m´odszer alapj´an hogyan val´os´ıthat´o meg egy funkcion´alis nyelvekben gyakori absztrakci´o, a mon´adok ´es egy Haskell ´altal biztos´ıtott szintaktikai egyszer˝ us´ıt´es, a do notation. Ennek felhaszn´al´as´aval sz´amos hasznos eszk¨oz k´esz´ıthet˝o. Template metaprogramoz´asban biztos´ıtani lehet a list comprehension nev˝ u m´odszert, mely egyszer˝ ubb´e ´es olvashat´obb´a teszi a list´akon v´egzett m˝ uveleteket. A mon´adok egyszer˝ us´ıtik a template metaprogramok v´egrehajt´asa sor´an fell´ep˝o hib´ak kezel´es´et. A dolgozat bemutatja, hogyan lehet template metaprogramoz´asban szimul´alni a kiv´etelkezel´est. 2. T´ ezis: Kidolgoztam egy m´odszert mon´adok ´es egy a Haskell ´altal biztos´ıtotthoz hasonl´o do notation megval´os´ıt´as´ara template metaprogramoz´asban. Megvizsg´altam sz´amos, Haskellben el´erhet˝o mon´ad vari´aci´or´ol, hogy ezzel a m´odszerrel hogyan val´os´ıthat´o meg C++ template metaprogramoz´asban. Kidolgoztam egy m´odszert a kiv´etelkezel´es szimul´al´as´ara C++ template metaprogramoz´asban. (IV. fejezet) 2.1. T´ ezis: Kidolgoztam egy m´odszert a mon´adok megval´os´ıt´as´ara C++ template metaprogramoz´asban. (IV.1. fejezet) 2.2. T´ ezis: Megvizsg´altam sz´amos Haskellben el´erhet˝o mon´adr´ol, hogy a 2.1. T´ezisben bemutatott m´odszerrel mik´ent lehet ˝oket implement´alni. (IV.2. fejezet) 2.3. T´ ezis: Kidolgoztam egy m´odszert a do notation megval´os´ıt´as´ara template metaprogramoz´asban, mely a Haskell ´altal biztos´ıtotthoz hasonl´o. (IV.3. fejezet) 2.4. T´ ezis: Kidolgoztam egy mon´adokon alapul´o m´odszert a kiv´etelkezel´es szimul´al´as´ara C++ template metaprogramoz´asban. (IV.4. fejezet)
6
A dolgozat bemutat k´et k¨ ul¨onb¨oz˝o m´odszert a template metaprogramok olvashat´os´ag´anak jav´ıt´as´ara a funkcion´alis paradigm´aval val´o kapcsolat felhaszn´al´as´aval. Az els˝o k´et t´ezis a megl´ev˝o eszk¨oz¨oket ´es m´odszereket terjeszti ki funkcion´alis nyelvekben gyakran haszn´alt elemekkel. A harmadik t´ezis mutatja be a m´asik m´odszert, mely karakterl´anc liter´alokban szerepl˝o k´odr´eszletek ´ertelmez´es´en alapszik ´es ennek seg´ıts´eg´evel egy interpretert val´os´ıt meg, mely template metaprogramokat hajt v´egre. Egy be´agyazott k´odr´eszlet ´ertelmez´ese ´es v´egrehajt´asa ugyanabban a ford´ıt´asi l´ep´esben t¨ort´enik meg, mely lehet˝ov´e teszi egy Haskell-szer˝ u szintaxis biztos´ıt´as´at template metaprogramok sz´am´ara. 3. T´ ezis: Kidolgoztam egy m´odszert parser-eket gener´al´o k¨onyvt´arak megval´os´ıt´as´ara C++ template metaprogramoz´asban. Megvizsg´altam, hogy ez mik´ent haszn´alhat´o dom´en specifikus nyelvek C++ nyelvbe ´agyaz´as´ara, illetve template metaprogramok sz´am´ara egy jobban olvashat´o szintaxis biztos´ıt´as´ara. Ezen m´odszerek egyike sem ig´enyel k¨ uls˝o el˝oford´ıt´ot. (V. fejezet) 3.1. T´ ezis: Kidogloztam egy m´odszert karakterl´anc liter´alok C++ template metaprogramokkal feldolgozhat´o karakter kont´enerekk´e t¨ort´en˝o ´atalak´ıt´as´ara. Erre alapozva kidolgoztam egy m´odszert parser-eket gener´al´o k¨onyvt´arak megval´os´ıt´as´ara C++ template metaprogramoz´asban. (V.1. fejezet) 3.2. T´ ezis: Megvizsg´altam, hogy a 3.1. T´ezisben bemutatott m´odszerrel hogyan lehet dom´en specifikus nyelveket k¨ uls˝o eszk¨oz¨ok n´elk¨ ul be´agyazni a C++ nyelvbe. (V.2. fejezet) 3.3. T´ ezis: Megvizsg´altam, hogy a 3.1. T´ezisben bemutatott m´odszerrel hogyan lehet egy a Haskell nyelvre hasonl´ıt´o szintaxist biztos´ıtani template metaprogramokhoz k¨ uls˝o el˝oford´ıt´o haszn´alata n´elk¨ ul. (V.3. fejezet)
4.
¨ Osszegz´ es
A dolgozat k´et, a funkcion´alis paradigm´an alapul´o m´odszert mutat be a C++ template metaprogramok olvashat´os´ag´anak ´es karbantarthat´os´ag´anak jav´ıt´as´ara. Az egyik m´odszer term´eszetes kiterjeszt´ese a gyakorlatban haszn´alt m´odszereknek ´es eszk¨oz¨oknek, m´ıg a m´asik egyszer˝ u szintaxist biztos´ıt a metaprogramok sz´am´ara. A bemutatott m´odszerek egy ny´ılt forr´as´ u k¨onyvt´ar gy˝ ujtem´enyben [21] implement´al´asra ker¨ ultek, mely let¨olthet˝o ´es a m´odszerek ny´ ujtotta el˝ony¨ok kihaszn´alhat´ok. A 2. t´abl´azat a Cloc [15] eszk¨oz seg´ıts´eg´evel k´esz¨ ult ´es a k¨onyvt´arak, azok teszjei tov´abb´a a kapcsol´od´o p´eld´ak k´odjaiban, illetve a dokument´aci´oban szerepl˝o sorok sz´am´at mutatja. Az eredm´enyek illetve a k¨onyvt´arak be lettek mutatva a C++/Boost k¨oz¨oss´egnek. Az el˝oad´as Best Presentation d´ıjat nyert a C++Now konferenci´an 2012-ben Aspenben. 7
[17] 1.1 1.2 1.3 1.4 1.5 1.6 2.1 2.2 2.3 2.4 3.1 3.2 3.3
[18]
×
1. t´abl´azat. Kapcsol´od´o [19] [20] [22] [23] [24] × × × × × × ×
[28]
[29]
[31]
× ×
× × × × × ×
× × × × ×
publik´aci´ok [25] [26] [27] × × × ×
× ×
× × × × × ×
× × ×
×
2. t´abl´azat. Sorok sz´ama az Mpllibs k´odj´aban Language files blank comment code HTML 186 408 0 12383 C/C++ Header 232 2316 1159 10323 C++ 182 2734 1446 8448 CMake 32 110 132 160 CSS 1 19 7 64 YAML 1 0 0 19
Hivatkoz´ asok [1] Abrahams, D., and Gurtovoy, A. C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond (C++ in Depth Series). Addison-Wesley Professional, 2004. ISBN: 0321227255. [2] Alexandrescu, A. Modern C++ design: generic programming and design patterns applied. Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA, 2001. ISBN: 0-201-70431-5. [3] Caro, M. Haskell to c++ template metaprogramming translator, 2010. http://code.google.com/p/phaskell/w/list. [4] de Guzman, J., Marsden, D., and Heller, T. Boost.phoenix, 2010. http://www.boost.org/libs/phoenix. 8
´ [5] Erdi, G. Haskell to c++ template metaprogramming translator, 2010. http://gergo.erdi.hu/projects/metafun/. [6] Fowler, M. Domain-specific Languages. Addison-Wesley, 2010. ISBN: 0321712943. [7] Gil, J. Y., and Lenz, K. Simple and safe sql queries with c++ templates. Sci. Comput. Program. 75 (July 2010), 573–595. [8] Golodetz, S. Functional programming using c++ templates (part 1). Overload, 81 (October 2007). http://www.accu.org/var/uploads/journals/overload81.pdf. [9] Golodetz, S. Functional programming using c++ templates (part 2). Overload, 82 (December 2007). http://www.accu.org/var/uploads/journals/Overload82.pdf. [10] Gurtovoy, A., and Abrahams, D. Boost.mpl, 2004. http://www.boost.org/libs/mpl. ´ th, Z., Plasmeijer, R., and Zso ´ k, V., Eds. Central Euro[11] Horva pean Functional Programming School - Third Summer School, CEFP 2009, Budapest, Hungary, May 21-23, 2009 and Kom´ arno, Slovakia, May 25-30, 2009, Revised Selected Lectures (2010), vol. 6299 of Lecture Notes in Computer Science, Springer. [12] McNamara, B., and Smaragdakis, Y. Functional programming in c++ using the fc++ library. SIGPLAN Notices 36, 4 (2001), 25–30. [13] Milewski, B. What does haskell have to do with c++?, 2009. http://bartoszmilewski.wordpress.com/2009/10/21/what-does-haskellhave-to-do-with-c/. ˜ oz, J. M. L. Monads in c++ template metaprogramming, 2008. [14] Mun http://bannalia.blogspot.com/2008/06/monads-in-c-templatemetaprogramming.html. [15] Northrop Grumman Corporation. Cloc - count lines of code, 2013. http://cloc.sourceforge.net/. ´ b, Z. Functional programming with c++ template metaprog[16] Porkola rams. In Horv´ath et al. [11], pp. 306–353. 9
´ Domain-specific language integra´ b, Z., and Sinkovics, A. [17] Porkola tion with compile-time parser generator library. In Generative Programming And Component Engineering, Proceedings of the Ninth International Conference on Generative Programming and Component Engineering, GPCE 2010, Eindhoven, The Netherlands, October 10-13, 2010 (2010), E. Visser and J. J¨arvi, Eds., ACM, pp. 137–146. ´ and Siroki, I. Dsl in c++ template ´ b, Z., Sinkovics, A., [18] Porkola metaprogram, tutorial, 2013. http://dsl2013.math.ubbcluj.ro/files/Lecture/PorkolabEtAl TemplateMetaprogramming.pdf. ´ Functional extensions to the boost metaprogram library. [19] Sinkovics, A. In WGT’10 (2010), Z. Porkol´ab and N. Pataki, Eds., vol. II of WGT Proceedings, Zolix, pp. 56–66. ´ Functional extensions to the boost metaprogram library. [20] Sinkovics, A. Electr. Notes Theor. Comput. Sci. 264, 5 (2010), 85–101. ´ The source code of mpllibs, 2010. [21] Sinkovics, A. http://github.com/sabel83/mpllibs. ´ Nested lamda expressions with let expressions in c++ [22] Sinkovics, A. template metaprorgams. In WGT’11 (2011), Z. Porkol´ab and N. Pataki, Eds., vol. III of WGT Proceedings, Zolix, pp. 63–76. ´ Boosting mpl with haskell elements, 2013. [23] Sinkovics, A. http://www.youtube.com/watch?v=aIj034VCUD8. ´ and Abrahams, D. Using strings in c++ template [24] Sinkovics, A., metaprograms, 2012. http://cpp-next.com/archive/2012/10/using-strings-in-c-templatemetaprograms/. ´ and Porkola ´ b, Z. Expressing c++ template meta[25] Sinkovics, A., programs as lamda expressions. In Horv´ath et al. [11], pp. 97–111. ´ and Porkola ´ b, Z. Implementing monads for c++ [26] Sinkovics, A., template metaprograms. Technical Report TR-01/2011, E¨otv¨os Lor´and University, Faculty of Informatics, Dept. of Programming Languages and Compilers, Sept. 2011. ´ and Porkola ´ b, Z. Domain-specific language inte[27] Sinkovics, A., gration with c++ template metaprogramming. Formal and Practical 10
Aspects of Domain-Specific Languages: Recent Developments (2012), 32. ISBN: 1466620927. ´ and Porkola ´ b, Z. Metaparse - compile-time parsing [28] Sinkovics, A., with c++ template metaprogramming, 2012. http://cppnow.org/files/2012/04/Sinkovics.Porkol%C3%A1b.pdf. ´ and Porkola ´ b, Z. Implementing monads for c++ [29] Sinkovics, A., template metaprograms. Science of Computer Programming 78, 0 (2013), 1600 – 1621. ´ Porkola ´ b, Z., and Zso ´ k, V. Meta¡fun¿ - towards a [30] Sipos, A., functional-style interface for c++ template metaprograms. Studia Universitatis Babes-Bolyai Informatica LIII, 2008/2 (2008), 55–66. ´ Pataki, N., and Porkola ˝ gyi, Z., Sinkovics, A., ´ b, Z. C++ [31] Szu metastring library and its applications. In GTTSE (2009), J. M. Fernandes, R. L¨ammel, J. Visser, and J. Saraiva, Eds., vol. 6491 of Lecture Notes in Computer Science, Springer, pp. 461–480. [32] Unruh, E. Prime number computation, 1994. ANSI X3J16-94-0075/ISO WG21-462. [33] Veldhuizen, T. Expression templates. C++ Report 7 (1995), 26–31. [34] Veldhuizen, T. Using C++ template metaprograms. SIGS Publications, Inc., New York, NY, USA, 1996, pp. 459–473. [35] Veldhuizen, T. L. C++ templates are turing complete. Tech. rep., 2003. [36] Veldhuizen, T. L., and Gannon, D. Active libraries: Rethinking the roles of compilers and libraries. In In Proceedings of the SIAM Workshop on Object Oriented Methods for Inter-operable Scientific and Engineering Computing OO’98 (1998), SIAM Press. ´ lyomi, I., Porkola ´ b, Z., and Kozsik, T. An extension to the [37] Zo subtype relationship in c++ implemented with template metaprogramming. In Generative Programming and Component Engineering, F. Pfenning and Y. Smaragdakis, Eds., vol. 2830 of Lecture Notes in Computer Science. Springer Berlin Heidelberg, 2003, pp. 209–227.
11