/tapl-scala

Code from the book "Types and Programming Languages" in Scala

Primary LanguageScala

TAPL in Scala

Roadmap

  1. tapl.arith - (chapters 3, 4).
  2. tapl.untyped (chapters 5-7).
  3. tapl.fulluntyped (chapters 5-7).
  4. tapl.tyarith (chapter 8).
  5. tapl.simplebool (chapter 10).
  6. tapl.fullsimple (chapter 9 and 11).
  7. tapl.fullref (chapter 13, 18)
  8. tapl.fullerror (chapter 14)
  9. tapl.rcdsubbot (chapter 15)
  10. tapl.fullsub (chapters 15-17)
  11. tapl.bot (chapter 16)
  12. tapl.fullequirec (chapter 20).
  13. tapl.fullisorec (chapter 20).
  14. tapl.equirec (chapter 21).
  15. tapl.recon (chapter 22).
  16. tapl.fullrecon (chapter 22).
  17. tapl.fullpoly (chapters 23, 24).
  18. tapl.fullomega (chapters 23, 29, 30).
  19. tapl.fullfsub (chapters 26, 28).
  20. tapl.fullfomsub (chapters 26, 31).
  21. 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);
...