This project is an attempt to port very nice companion code (written by Pierce in OCaml) for the book "Types and Programming Languages" by Benjamin C. Pierce into Scala.
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, based ontapl.fullsimple
)tapl.fullerror
(chapter 14, based ontapl.simplebool
)tapl.rcdsubbot
(chapter 15, rcd=record)tapl.fullsub
(chapters 15 - 17, based ontapl.fullsimple
) (The only addition is Top type)tapl.joinsub
(chapter 16) - Not yet done. This is a subset oftapl.bot
.tapl.bot
(chapter 16) - simplification oftapl.rcdsubbot
.tapl.fullequirec
(chapter 20).tapl.fullisorec
(chapter 20).tapl.equirec
(chapter 21). The subtyping was not implemented in original code. But there is a code in the Book.tapl.recon
(chapter 22).tapl.fullrecon
(chapter 22).tapl.fullpoly
(chapters 23, 24).tapl.fullomega
(chapters 23, 29, 30).tapl.fullfsub
(chapters 26, 28) - based ontapl.fullsimple
(additions: Top type and subtyping).tapl.fullfomsub
(chapters 26, 31).tapl.fullfsubref
(chapter 27) - original (a bit wrong) implementation. Not yet ported.tapl.fullfomsubref
(chapter 27) combination of all systems from the book.tapl.purefsub
(chapter 28) - a subset oftapl.fullfsub
. Not yet ported.tapl.fomsub
(chapter 31) - simplification oftapl.fullfomsub
. Not yet ported.tapl.fullupdate
(chapter 32) - simplification oftapl.fullfomsub
. Not yet ported.tapl.fomega
(solution to 30.3.20) - not yet ported.tapl.letexercise
- not yet ported.tapl.joinexercise
- not yet ported.
The code structure for each implementation follows 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.
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);
...
There was some incompleteness in the original OCaml code that was ported into Scala code:
tapl.equirec
- subtyping was not implemented- For subtyping for References, Sources and Sinks (scattered across many implementations) there is a comment in the original code that implementation is incomplete.
See code for calculation of
meet
andjoin
of two references. - It will be interesting to add implementation of dependent types from the sequel book "Advanced Topics in Types and Programming Languages".
The book mentions OCaml implementation
deptypes
but I did not find this implementation on the web. - I have noticed that some cases (in typers and evaluators) were omitted in the original code.