tapl-scala
tapl-scala copied to clipboard
Code from the book "Types and Programming Languages" in Scala
TAPL in Scala
Roadmap
-
tapl.arith
- (chapters 3, 4). -
tapl.untyped
(chapters 5-7). -
tapl.fulluntyped
(chapters 5-7). -
tapl.tyarith
(chapter 8). -
tapl.simplebool
(chapter 10). -
tapl.fullsimple
(chapter 9 and 11). -
tapl.fullref
(chapter 13, 18) -
tapl.fullerror
(chapter 14) -
tapl.rcdsubbot
(chapter 15) -
tapl.fullsub
(chapters 15-17) -
tapl.bot
(chapter 16) -
tapl.fullequirec
(chapter 20). -
tapl.fullisorec
(chapter 20). -
tapl.equirec
(chapter 21). -
tapl.recon
(chapter 22). -
tapl.fullrecon
(chapter 22). -
tapl.fullpoly
(chapters 23, 24). -
tapl.fullomega
(chapters 23, 29, 30). -
tapl.fullfsub
(chapters 26, 28). -
tapl.fullfomsub
(chapters 26, 31). -
tapl.fullfomsubref
(chapter 27) combination of all systems from the book.
Code structure
The code structure for each implementation follows the original code structure and consists of 4 files:
-
syntax.scala
- AST, contexts, commands, pretty-printing. -
parser.scala
- parsing. -
core.scala
- evaluator and typer. -
demo.scala
- the main application for processing input files.
Running
sbt
> run
Multiple main classes detected, select one to run:
[1] tapl.fullisorec.FullIsorecDemo
[2] tapl.rcdsubbot.RcdSubBotDemo
[3] tapl.arith.ArithDemo
[4] tapl.simplebool.SimpleBoolDemo
[5] tapl.equirec.EquirecDemo
[6] tapl.tyarith.TyArithDemo
[7] tapl.untyped.UntypedDemo
[8] tapl.fullfsub.FullFSubDemo
[9] tapl.fullpoly.FullPolyDemo
[10] tapl.recon.ReconDemo
[11] tapl.fullfomsub.FullFomSubDemo
[12] tapl.fullerror.FullErrorDemo
[13] tapl.fulluntyped.UntypedDemo
[14] tapl.fullsub.FullSubDemo
[15] tapl.fullequirec.FullEquirecDemo
[16] tapl.fullrecon.FullReconDemo
[17] tapl.fullref.FullRefDemo
[18] tapl.fullomega.FullOmegaDemo
[19] tapl.fullsimple.FullSimpleDemo
[20] tapl.fullfomsubref.FullFomSubRefDemo
[21] tapl.bot.BotDemo
Enter number: 21
[info] Running tapl.bot.BotDemo
====================
(lambda x: Top. x): Top -> Top;
||
\/
(lambda x: Top. x): Top -> Top;
====================
((lambda x: Top. x) (lambda x: Top. x)): Top;
||
\/
(lambda x: Top. x): Top -> Top;
====================
((lambda x: Top -> Top. x) (lambda x: Top. x)): Top -> Top;
||
\/
(lambda x: Top. x): Top -> Top;
====================
(lambda x: Bot. x): Bot -> Bot;
||
\/
(lambda x: Bot. x): Bot -> Bot;
====================
(lambda x: Bot. x x): Bot -> Bot;
||
\/
(lambda x: Bot. x x): Bot -> Bot;
> run-main tapl.fulluntyped.UntypedDemo progs/fulluntyped.tapl
[info] Running tapl.fulluntyped.UntypedDemo progs/fulluntyped.tapl
====================
tru;
||
\/
(lambda t. lambda f. t);
====================
fls;
||
\/
(lambda t. lambda f. f);
====================
(tru tru);
||
\/
(lambda f. lambda t. lambda f'. t);
====================
(tru fls);
||
\/
(lambda f. lambda t. lambda f'. f');
====================
(test tru v w);
||
\/
((lambda m. lambda n. (lambda t. lambda f. t) m n) v w);
...