From 73b43dcf89210e75b508694df675961b4e22e0ff Mon Sep 17 00:00:00 2001 From: Stephen Diehl Date: Sun, 18 Jan 2015 21:04:01 -0500 Subject: [PATCH] Squashed commit of the following: commit 41ba8c36a90cc11723b14ce6c45599eabdcfaa53 Author: Stephen Diehl Date: Sun Jan 18 21:02:57 2015 -0500 type provenance commit be5eda941bb4c44b4c4af0ddbbd793643938f4ff Author: Stephen Diehl Date: Sun Jan 18 20:13:06 2015 -0500 provenance prototype commit 7aa958b9c279e7571f7c4887f6aa19443e16f6fb Author: Stephen Diehl Date: Sun Jan 18 19:35:08 2015 -0500 fix misc typos commit 52d60b3b2630e50ef0cd6ea5f0fa1f308d92e26d Author: Stephen Diehl Date: Sun Jan 18 15:15:58 2015 -0500 license badge commit 7d34274afe6f05a0002c8f87e5077b6a130b42b4 Author: Stephen Diehl Date: Sun Jan 18 15:07:28 2015 -0500 fix resolution for llvm cfg graphs commit 14d9bc836ecc64f8e9acc60bcbd2da02335255b9 Author: Stephen Diehl Date: Sun Jan 18 13:12:39 2015 -0500 added codegen dsl stub commit 0f74cdd6f95d0a1fe1cafd73e45cb1407709efd8 Author: Stephen Diehl Date: Sun Jan 18 13:01:14 2015 -0500 llvm cfg graphs commit a199d721503985954060e7670c1d2f5e1a65dd11 Author: Stephen Diehl Date: Sun Jan 18 10:56:54 2015 -0500 source code font commit c7db0c5d67b73d8633f08be093971877e2d6ede0 Author: Stephen Diehl Date: Sun Jan 18 09:59:37 2015 -0500 change phrasing around recursion commit 6903700db482524233262e722df54b1066218250 Author: Stephen Diehl Date: Sat Jan 17 18:20:06 2015 -0500 contributors.md commit 14d90a3f2ebf7ddf1229c084fe4a1e9fa13f2e41 Author: Stephen Diehl Date: Sat Jan 17 17:35:41 2015 -0500 added llvm logo commit d270df6d94cbf1ef9eddfdd64af5aabc36ebca72 Author: Stephen Diehl Date: Sat Jan 17 15:50:28 2015 -0500 initial llvm chapter commit e71b189c057ea9e399e90e47d9d49bb4cf12cda8 Author: Stephen Diehl Date: Sat Jan 17 12:21:00 2015 -0500 system-f typing rules commit 2a7d5c7f137cf352eeae64836df634c98118f594 Author: Stephen Diehl Date: Thu Jan 15 15:21:14 2015 -0500 flesh out system-f commit 7b3b2f0a2aea5e1102abe093cf5e0559090720aa Author: Stephen Diehl Date: Wed Jan 14 22:22:14 2015 -0500 started on extended parser commit cdeaf1a2658f15346fe1dc665ca09e954cce6c2e Author: Stephen Diehl Date: Wed Jan 14 17:25:02 2015 -0500 creative commons license commit f09d210be253a05fc8ad0827cd72ffa32404e2ba Author: Stephen Diehl Date: Wed Jan 14 16:54:10 2015 -0500 higher res images commit 8555eadfea8843f5683621e6652857e4259fa896 Author: Stephen Diehl Date: Wed Jan 14 14:48:44 2015 -0500 cover page commit e5e542e92610f4bb4c5ac726ffa86cd1e07753e3 Author: Stephen Diehl Date: Tue Jan 13 17:31:01 2015 -0500 initial happy/alex parser --- 000_introduction.md | 155 +++++--- 001_basics.md | 63 +-- 002_parsers.md | 14 +- 003_lambda_calculus.md | 31 +- 004_type_systems.md | 24 +- 005_evaluation.md | 27 +- 006_hindley_milner.md | 75 +++- 007_path.md | 45 ++- 008_extended_parser.md | 591 ++++++++++++++++++++++++++++ 009_datatypes.md | 45 +++ 010_renamer.md | 13 + 011_pattern_matching.md | 10 + 012_systemf.md | 274 +++++++++++++ 026_llvm.md | 693 +++++++++++++++++++++++++++++++++ CONTRIBUTORS.md | 14 + Makefile | 1 + README.md | 1 + chapter10/.gitkeep | 0 chapter10/generics.hs | 36 ++ chapter11/.gitkeep | 0 chapter12/.gitkeep | 0 chapter12/systemf/Syntax.hs | 24 ++ chapter27/cfg/branch.dot | 9 + chapter27/cfg/branch.ll | 9 + chapter27/cfg/branch.png | Bin 0 -> 6228 bytes chapter27/cfg/cbranch.dot | 10 + chapter27/cfg/cbranch.ll | 8 + chapter27/cfg/cbranch.png | Bin 0 -> 6823 bytes chapter27/cfg/for.dot | 11 + chapter27/cfg/for.ll | 17 + chapter27/cfg/for.png | Bin 0 -> 15790 bytes chapter27/cfg/phi.dot | 14 + chapter27/cfg/phi.ll | 12 + chapter27/cfg/phi.png | Bin 0 -> 15250 bytes chapter27/cfg/ret.dot | 6 + chapter27/cfg/ret.ll | 4 + chapter27/cfg/ret.png | Bin 0 -> 2167 bytes chapter27/cfg/switch.dot | 14 + chapter27/cfg/switch.ll | 14 + chapter27/cfg/switch.png | Bin 0 -> 11837 bytes chapter27/dsl/Codegen.hs | 281 +++++++++++++ chapter27/dsl/JIT.hs | 58 +++ chapter27/dsl/Main.hs | 32 ++ chapter27/dsl/dsl.cabal | 22 ++ chapter27/example.cpp | 93 +++++ chapter27/example.ll | 6 + chapter5/stlc/Main.hs | 2 +- chapter9/assign/.gitignore | 3 + chapter9/assign/Eval.hs | 34 ++ chapter9/assign/Lexer.x | 38 ++ chapter9/assign/Main.hs | 21 + chapter9/assign/Makefile | 6 + chapter9/assign/Parser.y | 46 +++ chapter9/assign/Syntax.hs | 8 + chapter9/assign/happy.cabal | 19 + chapter9/assign/input.test | 6 + chapter9/happy/.gitignore | 3 + chapter9/happy/Eval.hs | 52 +++ chapter9/happy/Lexer.x | 63 +++ chapter9/happy/Main.hs | 25 ++ chapter9/happy/Makefile | 6 + chapter9/happy/Parser.y | 83 ++++ chapter9/happy/Syntax.hs | 19 + chapter9/happy/happy.cabal | 27 ++ chapter9/layout/Layout.hs | 65 ++++ chapter9/provenance/Eval.hs | 42 ++ chapter9/provenance/Infer.hs | 205 ++++++++++ chapter9/provenance/Lexer.hs | 73 ++++ chapter9/provenance/Main.hs | 149 +++++++ chapter9/provenance/Parser.hs | 77 ++++ chapter9/provenance/Pretty.hs | 82 ++++ chapter9/provenance/Syntax.hs | 15 + chapter9/provenance/Type.hs | 15 + contributing.md | 31 +- css/style.css | 12 + img/Haskell-Logo.ps | 96 +++++ img/lambda.png | Bin 4640 -> 20237 bytes img/pipeline1.dot | 1 + img/pipeline1.png | Bin 6723 -> 24280 bytes img/pipeline2.dot | 1 + img/pipeline2.png | Bin 5365 -> 19370 bytes img/proto.dot | 1 + img/proto_pass.dot | 1 + img/proto_pass.png | Bin 6501 -> 23184 bytes img/protohaskell.dot | 1 + img/protohaskell.png | Bin 4460 -> 15385 bytes img/stack.dot | 1 + img/stack.png | Bin 9062 -> 5621 bytes img/titles/basics.png | Bin 4650 -> 17804 bytes img/titles/evaluation.png | Bin 3305 -> 11310 bytes img/titles/extended_parser.png | Bin 5508 -> 20672 bytes img/titles/hindley_milner.png | Bin 6684 -> 24865 bytes img/titles/introduction.png | Bin 3679 -> 13317 bytes img/titles/lambda_calculus.png | Bin 5558 -> 20562 bytes img/titles/llvm.png | Bin 0 -> 5009 bytes img/titles/parsing.png | Bin 2900 -> 10042 bytes img/titles/protohaskell.png | Bin 4214 -> 15236 bytes img/titles/systemf.png | Bin 0 -> 12266 bytes img/titles/type_systems.png | Bin 5210 -> 19659 bytes template.latex | 104 ++++- title.md | 44 +++ 101 files changed, 4067 insertions(+), 166 deletions(-) create mode 100644 008_extended_parser.md create mode 100644 009_datatypes.md create mode 100644 010_renamer.md create mode 100644 011_pattern_matching.md create mode 100644 012_systemf.md create mode 100644 026_llvm.md create mode 100644 CONTRIBUTORS.md create mode 100644 chapter10/.gitkeep create mode 100644 chapter10/generics.hs create mode 100644 chapter11/.gitkeep create mode 100644 chapter12/.gitkeep create mode 100644 chapter12/systemf/Syntax.hs create mode 100644 chapter27/cfg/branch.dot create mode 100644 chapter27/cfg/branch.ll create mode 100644 chapter27/cfg/branch.png create mode 100644 chapter27/cfg/cbranch.dot create mode 100644 chapter27/cfg/cbranch.ll create mode 100644 chapter27/cfg/cbranch.png create mode 100644 chapter27/cfg/for.dot create mode 100644 chapter27/cfg/for.ll create mode 100644 chapter27/cfg/for.png create mode 100644 chapter27/cfg/phi.dot create mode 100644 chapter27/cfg/phi.ll create mode 100644 chapter27/cfg/phi.png create mode 100644 chapter27/cfg/ret.dot create mode 100644 chapter27/cfg/ret.ll create mode 100644 chapter27/cfg/ret.png create mode 100644 chapter27/cfg/switch.dot create mode 100644 chapter27/cfg/switch.ll create mode 100644 chapter27/cfg/switch.png create mode 100644 chapter27/dsl/Codegen.hs create mode 100644 chapter27/dsl/JIT.hs create mode 100644 chapter27/dsl/Main.hs create mode 100644 chapter27/dsl/dsl.cabal create mode 100644 chapter27/example.cpp create mode 100644 chapter27/example.ll create mode 100644 chapter9/assign/.gitignore create mode 100644 chapter9/assign/Eval.hs create mode 100644 chapter9/assign/Lexer.x create mode 100644 chapter9/assign/Main.hs create mode 100644 chapter9/assign/Makefile create mode 100644 chapter9/assign/Parser.y create mode 100644 chapter9/assign/Syntax.hs create mode 100644 chapter9/assign/happy.cabal create mode 100644 chapter9/assign/input.test create mode 100644 chapter9/happy/.gitignore create mode 100644 chapter9/happy/Eval.hs create mode 100644 chapter9/happy/Lexer.x create mode 100644 chapter9/happy/Main.hs create mode 100644 chapter9/happy/Makefile create mode 100644 chapter9/happy/Parser.y create mode 100644 chapter9/happy/Syntax.hs create mode 100644 chapter9/happy/happy.cabal create mode 100644 chapter9/layout/Layout.hs create mode 100644 chapter9/provenance/Eval.hs create mode 100644 chapter9/provenance/Infer.hs create mode 100644 chapter9/provenance/Lexer.hs create mode 100644 chapter9/provenance/Main.hs create mode 100644 chapter9/provenance/Parser.hs create mode 100644 chapter9/provenance/Pretty.hs create mode 100644 chapter9/provenance/Syntax.hs create mode 100644 chapter9/provenance/Type.hs create mode 100644 img/Haskell-Logo.ps create mode 100644 img/titles/llvm.png create mode 100644 img/titles/systemf.png diff --git a/000_introduction.md b/000_introduction.md index 5cff34a..e73aece 100644 --- a/000_introduction.md +++ b/000_introduction.md @@ -1,14 +1,19 @@ +
![](img/titles/introduction.png) +
-****** +

+

-> When the limestone of imperative programming is worn away, the granite of -> functional programming will be observed. + Introduction ============ @@ -151,42 +156,71 @@ refines the space of allowable behavior and degree of expressible programs for the language. Types are the world's most popular formal method for analyzing programs. -$$ -\begin{aligned} -1 &: \t{Nat} \\ -(\lambda x . x) &: \forall a. a \to a \\ -(\lambda x y . x) &: \forall a b. a \to b \to a \\ -\end{aligned} -$$ +In a language like Python all expressions have the same type at compile time, +and all syntactically valid programs can be evaluated. In the case where the +program is nonsensical the runtime will bubble up exceptions at runtime. The +Python interpreter makes no attempt to analyze the given program for soundness +at all before running it. -In more sophisticated languages types and terms will commingle either with -explicit annotations on binders, or even as first class values themselves. +```bash +>>> True & "false" +Traceback (most recent call last): + File "", line 1, in +TypeError: unsupported operand type(s) for &: 'bool' and 'str' +``` -$$ -\t{Pair} \ u \ v = \Lambda X . \lambda x^{U \rightarrow V \rightarrow X} . x u v -$$ +By comparison Haskell will do quite a bit of work to try to ensure that the +program is well-defined before running it. The language that we use to +predescribe and analyze static semantics of the program is that of *static +types*. -In all the languages which we will implement the types present during compilation are -*erased*. Although they are present in the evaluation semantics, the runtime -cannot dispatch on types of values at runtime. Types by definition only exist at -compile-time in the static semantics of the language. +```bash +Prelude> True && "false" + +:2:9: + Couldn't match expected type `Bool' with actual type `[Char]' + In the second argument of `(&&)', namely `"false"' + In the expression: True && "false" + In an equation for `it': it = True && "false" +``` + +Catching minor type mismatch errors is the simplest example of usage, although +they occur extremely frequently as we humans are quite fallible in our reasoning +about even the simplest of program constructions! Although this just the tip of +the iceberg, the gradual trend over the last 20 years toward more *expressive +types* in modern type systems; which are capable of guaranteeing a large variety +of program correctness properties. + +* Preventing resource allocation errors. +* Enforcing security access for program logic. +* Side effect management. +* Preventing buffer overruns. +* Ensuring cryptographic properties for network protocols. +* Modeling and verify theorems in mathematics and logic. +* Preventing data races and deadlocks in concurrent systems. + +Type systems can never capture all possible behavior of the program. Although +more sophisticated type systems are increasingly able to model a large space of +behavior and is one of the most exciting areas of modern computer science +research. Put most bluntly, **static types let you be dumb** and offload the +checking that you would otherwise have to do in your head to a system that can +do the reasoning for you and work with you to interactively build your program. Functional Compilers -------------------- -A compiler is typically divided into parts, a *frontend* and a *backend*. These -are loose terms but the frontend typically deals with converting the human -representation of the code into some canonicalized form while the backend -converts the canonicalized form into another form that is suitable for -evaluation. +A *compiler* is a program for turning high-level representation of ideas in a +human readable language into another form. A compiler is typically divided into +parts, a *frontend* and a *backend*. These are loose terms but the frontend +typically deals with converting the human representation of the code into some +canonicalized form while the backend converts the canonicalized form into +another form that is suitable for evaluation. The high level structure of our functional compiler is described by the following *block diagram*. Each describes a *phase* which is a sequence of transformations composed to transform the input program. -

![](img/pipeline1.png) -

* **Source** - The frontend textual source language. * **Parsing** - Source is parsed into an abstract syntax tree. @@ -200,15 +234,13 @@ A *pass* may transform the input program from one form into another or alter the internal state of the compiler context. The high level description of the forms our final compiler will go through is the following sequence: -

![](img/pipeline2.png) -

Internal forms used during compilation are *intermediate representations* and typically any non-trivial language will involve several. -Lexing ------- +Parsing +------- The source code is simply the raw sequence of text that specifies the program. Lexing splits the text stream into a sequence of *tokens*. Only the presence of @@ -222,22 +254,22 @@ let f x = x + 1 For instance the previous program might generate a token stream like the following: -Token Value ------ ----- -reserved let -var f -var x -reservedOp = -var x -reservedOp + -integer 1 +```haskell +[ + TokenLet, + TokenSym "f", + TokenSym "x", + TokenEq, + TokenSym "x", + TokenAdd, + TokenNum 1 +] +``` -Parsing -------- - -A datatype for the *abstract syntax tree* (AST) is constructed by traversal of -the input stream and generation of the appropriate syntactic construct using a -parser. +We can then scan the token stream via and dispatch on predefined patterns of +tokens called *productions* and recursively build up a datatype for the +*abstract syntax tree* (AST) by traversal of the input stream and generation of +the appropriate syntactic. ```haskell type Name = String @@ -319,6 +351,19 @@ Let "f" [] (Lit (LitInt 1)))) ``` +Transformation +-------------- + +The type core representation is often suitable for evaluation, but quite often +different intermediate representations are more amenable to certain +optimizations and make explicit semantic properties of the language explicit. +These kind of intermediate forms will often attach information about free +variables, allocations, and usage information directly onto the AST to make it + +The most important form we will use is called the *Spineless Tagless G-Machine* +( STG ), an abstract machine that makes many of the properties of lazy +evaluation explicit directly in the AST. + Code Generation --------------- @@ -356,11 +401,11 @@ resulting module. ```perl f: - movl %edi, -4(%rsp) - movl -4(%rsp), %edi - addl $1, %edi - movl %edi, %eax - ret + movl %edi, -4(%rsp) + movl -4(%rsp), %edi + addl $1, %edi + movl %edi, %eax + ret ``` @@ -370,11 +415,11 @@ instructions defined by the processor specification. ```perl 0000000000000000 : - 0: 89 7c 24 fc mov %edi,-0x4(%rsp) - 4: 8b 7c 24 fc mov -0x4(%rsp),%edi - 8: 81 c7 01 00 00 00 add $0x1,%edi - e: 89 f8 mov %edi,%eax - 10: c3 retq + 0: 89 7c 24 fc mov %edi,-0x4(%rsp) + 4: 8b 7c 24 fc mov -0x4(%rsp),%edi + 8: 81 c7 01 00 00 00 add $0x1,%edi + e: 89 f8 mov %edi,%eax + 10: c3 retq ``` \pagebreak diff --git a/001_basics.md b/001_basics.md index 69cb384..47730e3 100644 --- a/001_basics.md +++ b/001_basics.md @@ -1,6 +1,6 @@ +
![](img/titles/basics.png) - -****** +

@@ -19,14 +18,15 @@ composition, function abstraction of a single variable. The **lambda calculus** consists very simply of three terms and all valid recursive combinations thereof: +![](img/lambda.png) + +The terms are named are typically referred to in code by the following +contractions. + - **Var** - A variable - **Lam** - A lambda abstraction - **App** - An application -

-![](img/lambda.png) -

- $$ \begin{aligned} e :=\ & x & \trule{Var} \\ @@ -183,15 +183,8 @@ choose the Haskell convention which denotes lambda by the backslash (``\``) to the body with (``->``), and application by spaces. Named variables are simply alphanumeric sequences of characters. -Logical notation: - -$\mathtt{const} = \lambda x y . x$ - -Haskell notation: - -```haskell -const = \x y -> x -``` +* **Logical notation**: $\mathtt{const} = \lambda x y . x$ +* **Haskell notation**: ``const = \x y -> x`` In addition other terms like literal numbers or booleans can be added, and these make writing expository examples a little easier. In addition we will add a diff --git a/004_type_systems.md b/004_type_systems.md index 28f0c9e..f55fdfe 100644 --- a/004_type_systems.md +++ b/004_type_systems.md @@ -1,12 +1,15 @@ +
![](img/titles/type_systems.png) +
-****** +

+

-> [A type system is a] tractable syntactic method for proving the +> *[A type system is a] tractable syntactic method for proving the > absence of certain program behaviors by classifying phrases -> according to the kinds of values they compute. +> according to the kinds of values they compute.* > -> - Benjamin Pierce +> — Benjamin Pierce

@@ -194,6 +197,11 @@ $$ \tau_1 \to \tau_2 \to \tau_3 \to \tau_4 \quad = \quad \tau_1 \to (\tau_2 \to (\tau_3 \to \tau_4)) $$ +In all the languages which we will implement the types present during +compilation are *erased*. Although types are possibly present in the evaluation +semantics, the runtime cannot dispatch on types of values at runtime. Types by +definition only exist at compile-time in the static semantics of the language. + Small-Step Semantics -------------------- @@ -603,18 +611,16 @@ the space of all programs and draw a large line around the universe of discourse programs that we are willing to consider, since these are the only programs that we can prove properties for. -> Well-typed programs don't go wrong, but not every program that never goes wrong +> *Well-typed programs don't go wrong, but not every program that never goes wrong > is well-typed. It's easy to exhibit programs that don't go wrong but are > ill-typed in ... any ... decidable type system. Many such programs are useful, > which is why dynamically-typed languages like Erlang and Lisp are justly -> popular. +> popular.* > -> -Simon Peyton Jones +> — Simon Peyton Jones Power always comes at a price. Using one system you can do more things. In diff --git a/005_evaluation.md b/005_evaluation.md index 273c4bc..1ce066d 100644 --- a/005_evaluation.md +++ b/005_evaluation.md @@ -1,10 +1,10 @@ +
![](img/titles/evaluation.png) +
-****** - -> Well-typed programs cannot "go wrong". +> *Well-typed programs cannot "go wrong".* > -> -Robin Milner +> — Robin Milner

@@ -22,8 +22,8 @@ lambda expression are necessarily evaluated before a lambda is reduced. A language in which the arguments are not necessarily evaluated before a lambda is reduced is non-strict. -Alternatively expressed, diverging terms are represented by the *bottom* value, -written as $\bot$. A function $f$ is non-strict if: +Alternatively expressed, diverging terms are represented up to equivalence by +the *bottom* value, written as $\bot$. A function $f$ is non-strict if: $$ f \bot \neq \bot @@ -81,9 +81,9 @@ how the subexpression ``(2 + 2)`` is evaluated to normal form before being bound. ```haskell -(λx. λy. y x) (2 + 2) λx. x + 1 -=> (λy. y 4) λx. x + 1 -=> (λy. x + 1) 4 +(\x. \y. y x) (2 + 2) λx. x + 1 +=> (\y. y 4) \x. x + 1 +=> (\y. x + 1) 4 => 4 + 1 => 5 ``` @@ -169,16 +169,15 @@ For example, the same expression we looked at for call-by-value has the same normal form but arrives at it by a different sequence of reductions: ```haskell -(λx. λy. y x) (2 + 2) λx. x + 1 -=> (λy.y (2 + 2)) λx. x + 1 -=> (λx.x + 1) (2 + 2) +(\x. \y. y x) (2 + 2) \x. x + 1 +=> (\y.y (2 + 2)) λx. x + 1 +=> (\x.x + 1) (2 + 2) => (2 + 2) + 1 => 4 + 1 => 5 ``` -Call-by-name is non-strict, although very few languages use this model, -[Frege](https://github.com/Frege/frege) being the most notable example. +Call-by-name is non-strict, although very few languages use this model. Call-by-need ------------ diff --git a/006_hindley_milner.md b/006_hindley_milner.md index c3f57d9..3a6eaa1 100644 --- a/006_hindley_milner.md +++ b/006_hindley_milner.md @@ -1,8 +1,11 @@ +
![](img/titles/hindley_milner.png) +
-****** +

+

-> There is nothing more practical than a good theory. +> *There is nothing more practical than a good theory.* > > — James C. Maxwell @@ -20,7 +23,7 @@ program give rise to a set of constraints that when solved always have a unique *principal type*. The simplest Hindley Milner type system is defined by a very short set of rules. -The first four rules describe the judgements by which we can each syntactic +The first four rules describe the judgements by which we can map each syntactic construct (``Lam``, ``App``, ``Var``, ``Let``) to their expected types. We'll elaborate on these rules shortly. @@ -100,6 +103,51 @@ let S f g x = f x (g x); As before ``let rec`` expressions will expand out in terms of the fixpoint operator and are just syntactic sugar. +Polymorphism +------------ + +We will add an additional constructs to our language that will admit a new form +of *polymorphism* for our language. Polymorphism is property of a term to +simultaneously admit several distinct types for the same function +implementation. + +For instance the polymorphic signature for the identity function maps a input of +type $\alpha$ + +$$ +\begin{aligned} +\mathtt{id}\ & ::\ \forall \alpha. \alpha \to \alpha \\ +\mathtt{id}\ & =\ \lambda x : \alpha.\ x +\end{aligned} +$$ + +Now instead of having to duplicate the functionality for every possible type +(i.e. implementing idInt, idBool, ...) we our type system admits any +instantiation that is subsumed by the polymorphic type signature. + +$$ +\begin{aligned} +& \t{id}_\t{Int} = \t{Int} \to \t{Int} \\ +& \t{id}_\t{Bool} = \t{Bool} \to \t{Bool} \\ +\end{aligned} +$$ + +A rather remarkably fact of universal quantification is that many properties +about inhabitants of a type are guaranteed by construction, these are the +so-called *free theorems*. For instance the only (nonpathological) +implementation that can inhabit a function of type ``(a, b) -> a`` is an +implementation precisely identical to that of ``fst``. + +A slightly less trivial example is that of the ``fmap`` function of type +``Functor f => (a -> b) -> f a -> f b``. The second functor law states that. + +```haskell +forall f g. fmap f . fmap g = fmap (f . g) +``` + +However it is impossible to write down a (nonpathological) function for ``fmap`` +that was well-typed and didn't have this property. We get the theorem for free! + Types ----- @@ -121,11 +169,10 @@ typeInt = TCon "Int" typeBool = TCon "Bool" ``` -However we will add an additional construct that will admit a new form of -*polymorphism* for our language. *Type schemes* model polymorphic types, they -indicate that the type variables bound in quantifier are polymorphic across the -enclosed type and can be instantiated with any type consistent with the -signature. +*Type schemes* model polymorphic types, they indicate that the type variables +bound in quantifier are polymorphic across the enclosed type and can be +instantiated with any type consistent with the signature. Intuitively the +indicate that the implementation of the function ```haskell data Scheme = Forall [TVar] Type @@ -229,8 +276,8 @@ $$ \begin{aligned} \FTV{\alpha} &= \{ \alpha \} \\ \FTV{\tau_1 \rightarrow \tau_2} &= \FTV{\tau_1} \cup \FTV{\tau_2} \\ -\FTV{\t{Int}} &= \emptyset \\ -\FTV{\t{Bool}} &= \emptyset \\ +\FTV{\t{Int}} &= \varnothing \\ +\FTV{\t{Bool}} &= \varnothing \\ \FTV{\forall x. t} &= \FTV{t} - \{ x \} \\ \end{aligned} $$ @@ -342,9 +389,9 @@ s := [n_0 / m_0, n_1 / m_1, ..., n_k / m_k] \\ $$ Two terms are said to be *unifiable* if there exists a unifying substitution set -between them. A substitution set is said to be **confluent** if the application -of substitutions is independent of the order applied, i.e. if we always arrive -at the same normal form regardless of the order of substitution chosen. +between them. A substitution set is said to be *confluent* if the application of +substitutions is independent of the order applied, i.e. if we always arrive at +the same normal form regardless of the order of substitution chosen. The notation we'll adopt for unification is, read as two types $\tau, \tau'$ are unifiable by a substitution $s$. @@ -1206,7 +1253,7 @@ Finally tab completion for our shell will use the interpreter's typing environment keys to complete on the set of locally defined variables. Repline supports prefix based tab completion where the prefix of the current command will be used to determine what to tab complete. In the case where we start with -the command ":load" we will instead tab complete on filenames in the current +the command ``:load`` we will instead tab complete on filenames in the current working directly instead. ```haskell diff --git a/007_path.md b/007_path.md index 3972825..c7734b9 100644 --- a/007_path.md +++ b/007_path.md @@ -1,6 +1,6 @@ +
![](img/titles/protohaskell.png) - -****** +
+ +

+

+ + +LLVM +==== + +LLVM is a statically typed intermediate representation and an associated +toolchain for manipulating, optimizing and converting this intermediate form +into native code. + +So for example consider a simple function which takes two arguments, adds them, +and xors the result. Writing in IR it would be formed as such: + +~~~~ {.haskell include="chapter27/example.ll"} +~~~~ + +Running this through the LLVM toolchain we can target our high level IR into +multiple different assembly codes mapping onto various architectures and CPUs +all from the same platform agnostic intermediate representation. + +**x86-64** + +```perl +test1: + .cfi_startproc + andl %edx, %esi + andl %edx, %edi + xorl %esi, %edi + movl %edi, %eax + ret +``` + +**ARM** + +```perl +test1: + and r1, r2, r1 + and r0, r2, r0 + eor r0, r0, r1 + mov pc, lr +``` + +**PowerPC** + +```perl +.L.test1: + .cfi_startproc + and 4, 5, 4 + and 3, 5, 3 + xor 3, 3, 4 + blr + .long 0 + .quad 0 +``` + +A uncommonly large amount of hardware manufacturers and software vendors (Adobe, +AMD, Apple, ARM, Google, IBM, Intel, Mozilla, Qualcomm, Samsung, Xilinx) have +come have converged on the LLVM toolchain as service agnostic way to talk about +generating machine code. + +What's even more impressive is that many of the advances in compiler +optimizations and static analysis have been mechanized in the form of +optimization passes so that all compilers written on top of the LLVM platform +can take advantage of the same advanced optimizers that would often previously +have to be developed independently. + +Types +----- + +**Primitive** + +```perl +i1 ; Boolean type +i8 ; char +i32 ; 32 bit integer +i64 ; 64 bit integer +float ; 32 bit +double ; 64 bit +``` + +**Arrays** + +```perl +[10 x float] ; Array of 10 floats +[10 x [20 x i32]] ; Array of 10 arrays of 20 integers. +``` + +**Structs** + +```perl +{float, i64} ; structure +{float, {double, i3}} ; nested structure +<{float, [2 x i3]}> ; packed structure +``` + +**Vectors** + +```perl +<4 x double> +<8 x float> +``` + +**Pointers** + +```perl +float* ; Pointer to a float +[25 x float]* ; Pointer to an array +``` + +The traditional ``void*`` pointer in C is a ``i8*`` pointer in LLVM with the +appropriate casts. + +**Constants** + +```perl +[i1 true, i1 false] ; constant bool array + ; constant vector +float 1.23421e+2 ; floating point constant +null ; null pointer constant +``` + +The ``zeroinitializer`` can be used to instantiate any type to the appropriate +zero of any type. + +```perl +<8 x float> zeroinitializer ; Zero vector +``` + +**Named Types** + +```perl +%vec4 = type <4 x i32> +%pair = type { i32, i32 } +``` + +Recursive types declarations are supported. + +```perl +%f = type { %f*, i32 } +``` + +**Platform Information** + + +```perl +target datalayout = " + e- + p : 64 : 64 : 64- + i1 : 8 : 8- + i8 : 8 : 8- + i16 : 16 : 16- + i32 : 32 : 32- + i64 : 64 : 64- + f32 : 32 : 32- + f64 : 64 : 64- + v64 : 64 : 64- + v128 : 128 : 128- + a0 : 0 : 64- + s0 : 64 : 64- + f80 : 128 : 128- + n8 : 16 : 32 : 64- + S128 + " +target triple = "x86_64-unknown-linux-gnu" +``` + +Specifications are delimited by the minus sign ``-``. + +* The ``e`` indicates the platform is little-endian. +* The ``i`` indicate the bitsize and alignment of the integer type. +* The ``f`` indicate the bitsize and alignment of the floating point type. +* The ``p`` indicate the bitsize and alignment of the pointer type. +* The ``v`` indicate the bitsize and alignment of the vector type. +* The ``a`` indicate the bitsize and alignment of the aggregate type. +* The ``n`` indicate the widths of the CPU registers. +* The ``S`` indicate the alignment of the stack. + +Variables +--------- + +Symbols used in an LLVM module are either global or local. Global symbols begin +with ``@`` and local symbols begin with ``%``. All symbols must be defined or +forward declared. + +Instructions in LLVM are either numbered sequentially (``%0``, ``%1``, ...) or +given explicit variable names (``%a``, ``%foo``, ..). For example the arguments +to the following function are named values, while the result of the add +instructions unnamed. + +```perl +define i32 @add(i32 %a, i32 %b) { + %1 = add i32 %a, %b + ret i32 %1 +} +``` + +Instructions +------------ + +```perl +%result = add i32 10, 20 +``` + +**Logical** + +* ``shl`` +* ``lshr`` +* ``ashr`` +* ``and`` +* ``or`` +* ``xor`` + +**Binary Operators** + +* ``add`` +* ``fadd`` +* ``sub`` +* ``fsub`` +* ``mul`` +* ``fmul`` +* ``udiv`` +* ``sdiv`` +* ``fdiv`` +* ``urem`` +* ``srem`` +* ``frem`` + +**Comparison** + +op unsigned signed floating +-- --------- -------- -------- +lt ULT SLT OLT +gt UGT SGT OGT +le ULE SLE OLE +ge UGE SGE OGE +eq EQ EQ OEQ +ne NE NE ONE + +```perl +%c = udiv i32 %a, %b +%d = sdiv i32 %a, %b +%e = fmul float %a, %b +%f = fdiv float %a, %b +``` + +```perl +%g = icmp eq i32 %a, %b +%i = icmp slt i32 %a, %b +%j = icmp ult i32 %a, %b +%k = fcmp olt float, %a, %b +``` + +Data +---- + +```perl +i1 1 +i32 299792458 +float 7.29735257e-3 +double 6.62606957e-34 +``` + +Blocks +------ + +Function definitions in LLVM introduce a sequence of labeled *basic blocks* +containing any number of instructions and a final *terminator* instruction which +indicates how control flow yields after the instructions of the basic block are +evaluated. + +```perl +define i1 @foo() { +entry: + br label %next +next: + br label %return +return: + ret i1 0 +} +``` + +A basic block has either zero (for entry block) or a fixed number of +*predecessors*. A graph with basic blocks as nodes and the predecessors of each +basic block as edges constitutes a *control flow graph*. LLVM's opt command can +be used to dump this graph using graphviz. + +```bash +$ opt -view-cfg module.ll +$ dot -Tpng module.dot -o module.png +``` + +We say a basic block A *dominates* a different block B in the control flow +graph if it's impossible to reach B without passing through "A, equivalently +A is the *dominator* of B. + +All logic in LLVM is written in *static single assignment* (SSA) form. Each +variable is assigned precisely once, and every variable is defined before it is +used. Updating any existing variable reference creates a new reference with for +the resulting output. + +Control Flow +------------ + +* Unconditional Branch +* Conditional Branch +* Switch +* Return +* Phi + +\clearpage + +**Return** + +The ``ret`` function simply exits the current function yielding the current +value to the virtual stack. + +```perl +define i1 @foo() { + ret i1 0 +} +``` + +![](chapter27/cfg/ret.png) + +\clearpage + +**Unconditional Branch** + +The unconditional branch ``br`` simply jumps to any basic block local to the +function. + +```perl +define i1 @foo() { + entry: + br label %next + next: + br label %return + return: + ret i1 0 +} +``` + +![](chapter27/cfg/branch.png) + +\clearpage + +**Conditional Branch** + +The conditional branch ``br`` jumps to one of two basic blocks based on whether +a test condition is ``true`` or ``false``. This corresponds the logic of a +traditional "if statement". + +```perl +define i32 @foo() { +start: + br i1 true, label %left, label %right +left: + ret i32 10 +right: + ret i32 20 +} +``` + +![](chapter27/cfg/cbranch.png) + +\clearpage + +**Switch** + +The switch statement ``switch`` jumps to any number of branches based on the +equality of value to a jump table matching values to basic blocks. + +```perl +define i32 @foo(i32 %a) { +entry: + switch i32 %a, label %default [ + i32 0, label %f + i32 1, label %g + i32 2, label %h + ] +f: + ret i32 1 +g: + ret i32 2 +h: + ret i32 3 +default: + ret i32 0 +} +``` + +![](chapter27/cfg/switch.png) + +\clearpage + +**Phi** + +A ``phi`` node selects a value based on the predecessor of the current block. + +```perl +define i32 @foo() { +start: + br i1 true, label %left, label %right +left: + %plusOne = add i32 0, 1 + br label %merge +right: + br label %merge +merge: + %join = phi i32 [ %plusOne, %left ], [ -1, %right ] + ret i32 %join +} +``` + +![](chapter27/cfg/phi.png) + +\clearpage + +**Loops** + +The traditional ``while`` and ``for`` loops can be written in terms of the +simpler conditional branching constructrs. For example in C we would write: + +```cpp +int count(int n) +{ + int i = 0; + while(i < n) + { + i++; + } + return i; +} +``` + +Whereas in LLVM we write: + +```perl +define i32 @count(i32 %n) { +entry: + br label %loop + +loop: + %i = phi i32 [ 1, %entry ], [ %nextvar, %loop ] + %nextvar = add i32 %i, 1 + + %cmptmp = icmp ult i32 %i, %n + %booltmp = zext i1 %cmptmp to i32 + %loopcond = icmp ne i32 %booltmp, 0 + + br i1 %loopcond, label %loop, label %afterloop + +afterloop: + ret i32 %i +} +``` + +![](chapter27/cfg/for.png) + +\clearpage + +**Select** + +Selects the first value if the test value is true, the second if false. + +```perl +%x = select i1 true, i8 10, i8 20 ; gives 10 +%y = select i1 false, i8 10, i8 20 ; gives 20 +``` + +Calls +----- + +* ``ccc``: The C calling convention +* ``fastcc``: The fast calling convention + +```perl +%result = call i32 @exp(i32 7) +``` + +Memory +------ + +LLVM uses the traditional load/store model: + +* ``load``: Load a typed value from a given reference +* ``store``: Store a typed value in a given reference +* ``alloca``: Allocate a pointer to memory on the virtual stack + +```perl +%ptr = alloca i32 +store i32 3, i32* %ptr +%val = load i32* %ptr +``` + +Specific pointer alignment can be specified: + +```perl +%ptr = alloca i32, align 1024 +``` + +For allocating in main memory we use an external reference to the C stdlib +memory allocator which gives us back a (``i8*``). + +```haskell +%ptr = call i8* @malloc(i32 %objectsize) +``` + +For structures: + +```perl +extractvalue {i32, float} %a, 0 ; gives i32 +extractvalue {i32, {float, double}} %a, 0, 1 ; gives double +extractvalue [2 x i32] %a, 0 ; yields i32 +``` + +```perl +%x = insertvalue {i32, float} %b, float %val, 1 ; gives {i32 1, float %b} +%y = insertvalue {i32, float} zeroinitializer, i32 1, 0 ; gives {i32 1, float 0} +``` + +GetElementPtr +------------- + +Casts +----- + +* ``trunc`` +* ``zext`` +* ``sext`` +* ``fptoui`` +* ``fptosi`` +* ``uitofp`` +* ``sitofp`` +* ``fptrunc`` +* ``fpext`` +* ``ptrtoint`` +* ``inttoptr`` +* ``bitcast`` + +```haskell +trunc i32 257 to i8 ; yields i8 1 +zext i32 257 to i64 ; yields i64 257 +sext i8 -1 to i16 ; yields i16 65535 +bitcast <2 x i32> %a to i64 ; yields i64 %a +``` + +Toolchain +--------- + +```bash +$ llc example.ll -o example.s # compile +$ lli example.ll # execute +$ opt -S example.bc -o example.ll # to assembly +$ opt example.ll -o example.bc # to bitcode +$ opt -O3 example.ll -o example.opt.ll -S # run optimizer +``` + +Individual modules can be linked together. + +```bash +$ llvm-link a.ll b.ll -o c.ll -S +``` + +Link time optimization. + +```bash +$ clang -O4 -emit-llvm a.c -c -o a.bc +$ clang -O4 -emit-llvm a.c -c -o a.bc +$ llvm-link a.bc b.bc -o all.bc +$ opt -std-compile-opts -std-link-opts -O3 all.bc -o optimized.bc +``` + +The clang project is a C compiler that targets LLVM as it's intermediate +representation. In the case where we'd like to know how some specific C +construct maps into LLVM IR we can ask clang to dump its internal IR using the +``-emit-llvm`` flag. + +```perl +# clang -emit-llvm -S add.c -o - +int add(int x) +{ + return x+1; +} +``` + +```perl +; ModuleID = 'add.c' +define i32 @add(i32 %x) nounwind uwtable { +entry: + %x.addr = alloca i32, align 4 + store i32 %x, i32* %x.addr, align 4 + %0 = load i32* %x.addr, align 4 + %add = add nsw i32 %0, 1 + ret i32 %add +} +``` + +LLVM is using a C++ API underneath the hood of all these tools. If you need to +work directly with the API it can be useful to be able to expand out the LLVM IR +into the equivalent C++ code. + +```bash +$ llc example.ll -march=cpp -o - +``` + +~~~~ {.haskell include="chapter27/example.ll"} +~~~~ + +```cpp +Function* func_test1 = mod->getFunction("test1"); +if (!func_test1) { +func_test1 = Function::Create( + /*Type=*/FuncTy_0, + /*Linkage=*/GlobalValue::ExternalLinkage, + /*Name=*/"test1", mod); +func_test1->setCallingConv(CallingConv::C); +} +AttrListPtr func_test1_PAL; +func_test1->setAttributes(func_test1_PAL); + +{ + Function::arg_iterator args = func_test1->arg_begin(); + Value* int32_x = args++; + int32_x->setName("x"); + Value* int32_y = args++; + int32_y->setName("y"); + Value* int32_z = args++; + int32_z->setName("z"); + + BasicBlock* label_1 = BasicBlock::Create(mod->getContext(), "",func_test1,0); + + BinaryOperator* int32_a = BinaryOperator::Create( + Instruction::And, int32_z, int32_x, "a", label_1); + BinaryOperator* int32_b = BinaryOperator::Create( + Instruction::And, int32_z, int32_y, "b", label_1); + BinaryOperator* int32_c = BinaryOperator::Create( + Instruction::Xor, int32_a, int32_b, "c", label_1); + ReturnInst::Create(mod->getContext(), int32_c, label_1); + +} +``` + +llvm-general +------------ + +The LLVM bindings for Haskell are split across two packages: + +* **llvm-general-pure** is a pure Haskell representation of the LLVM IR. + +* **llvm-general** is the FFI bindings to LLVM required for constructing the C representation of the + LLVM IR and performing optimization and compilation. + +llvm-general-pure does not require the LLVM libraries be available on the system. + +GHCi can have issues with the FFI and can lead to errors when working with +``llvm-general``. If you end up with errors like the following, then you are +likely trying to use ``GHCi`` or ``runhaskell`` and it is unable to link against +your LLVM library. Instead compile with standalone ``ghc``. + +```bash +Loading package llvm-general-3.3.8.2 +... linking +... ghc: /usr/lib/llvm-3.3/lib/libLLVMSupport.a: unknown symbol `_ZTVN4llvm14error_categoryE' +ghc: unable to load package `llvm-general-3.3.8.2' +```` + +Code Generation (LLVM) +====================== + +Resources +--------- + +* [LLVM Language Reference](http://llvm.org/docs/LangRef.html) +* [Implementing a JIT Compiled Language with Haskell and LLVM](http://www.stephendiehl.com/llvm/) + +\clearpage diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 0000000..c8a16fe --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,14 @@ +Contributors +============ + +* Matthew Pickering +* Nick Sinopoli +* Nicolas Trangez +* Ingo Blechschmidt +* Rein Henrichs +* Ian Connolly +* Ben James +* Abe Voelker +* Paulo Tanimoto +* Brandon Williams +* Dmitry Ivanov diff --git a/Makefile b/Makefile index 395d10b..534a9ad 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,7 @@ all: $(OBJ) top $(PANDOC) --filter ${FILTER} -f $(IFORMAT) $(FLAGS) -o $@ $< pdf: $(FILTER) + # $(PANDOC) --filter ${FILTER} -f $(IFORMAT) --template $(TEMPLATE_TEX) --latex-engine=xelatex $(FLAGS) -o WYAH.pdf title.md 0*.md contributing.md $(PANDOC) --filter ${FILTER} -f $(IFORMAT) --template $(TEMPLATE_TEX) --latex-engine=xelatex $(FLAGS) -o WYAH.pdf title.md 0*.md epub: $(FILTER) diff --git a/README.md b/README.md index 49dd7a3..c1df804 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ [![Build Status](https://travis-ci.org/sdiehl/write-you-a-haskell.svg)](https://travis-ci.org/sdiehl/write-you-a-haskell) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/sdiehl/write-you-a-haskell?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge) +[![MIT License](http://img.shields.io/badge/license-mit-blue.svg)](https://github.com/sdiehl/write-you-a-haskell/blob/master/LICENSE) Read Online: diff --git a/chapter10/.gitkeep b/chapter10/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/chapter10/generics.hs b/chapter10/generics.hs new file mode 100644 index 0000000..3a84874 --- /dev/null +++ b/chapter10/generics.hs @@ -0,0 +1,36 @@ +{-# LANGUAGE TypeOperators #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE DefaultSignatures #-} + +import GHC.Generics + +-- Auxiliary class +class GEq' f where + geq' :: f a -> f a -> Bool + +instance GEq' U1 where + geq' _ _ = True + +instance (GEq c) => GEq' (K1 i c) where + geq' (K1 a) (K1 b) = geq a b + +instance (GEq' a) => GEq' (M1 i c a) where + geq' (M1 a) (M1 b) = geq' a b + +instance (GEq' a, GEq' b) => GEq' (a :+: b) where + geq' (L1 a) (L1 b) = geq' a b + geq' (R1 a) (R1 b) = geq' a b + geq' _ _ = False + +instance (GEq' a, GEq' b) => GEq' (a :*: b) where + geq' (a1 :*: b1) (a2 :*: b2) = geq' a1 a2 && geq' b1 b2 + +-- +class GEq a where + geq :: a -> a -> Bool + default geq :: (Generic a, GEq' (Rep a)) => a -> a -> Bool + geq x y = geq' (from x) (from y) + +instance GEq Char where geq = (==) +instance GEq Int where geq = (==) +instance GEq Float where geq = (==) diff --git a/chapter11/.gitkeep b/chapter11/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/chapter12/.gitkeep b/chapter12/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/chapter12/systemf/Syntax.hs b/chapter12/systemf/Syntax.hs new file mode 100644 index 0000000..0636306 --- /dev/null +++ b/chapter12/systemf/Syntax.hs @@ -0,0 +1,24 @@ +type Name = String +type TypeVar = String +type TypeCon = String + +data Expr + = Lam Type Name Expr -- \x -> a + | Var Name -- x + | App Expr Expr -- a b + | TLam Name Expr -- /\ a . b + | TApp Expr Type -- a [ b ] + | Lit Literal -- 1 + | Let Name Expr Expr -- let x = v in a + +data Type + = TForall [Name] Type + | TArr Type Type + | TCon TypeCon + | TVar TypeVar + deriving (Show) + +data Literal + = LitInt Integer + | LitChar Char + deriving (Eq, Ord, Show) diff --git a/chapter27/cfg/branch.dot b/chapter27/cfg/branch.dot new file mode 100644 index 0000000..425c0e8 --- /dev/null +++ b/chapter27/cfg/branch.dot @@ -0,0 +1,9 @@ +digraph "CFG for 'foo' function" { + graph [ dpi = 72 ]; + label="Unconditional Branch"; + Node0x103c3c0 [shape=record,label="{start:\l br label %next\l}"]; + Node0x103c3c0 -> Node0x1038a90; + Node0x1038a90 [shape=record,label="{next: \l br label %return\l}"]; + Node0x1038a90 -> Node0x1038b90; + Node0x1038b90 [shape=record,label="{return: \l ret i1 false\l}"]; +} diff --git a/chapter27/cfg/branch.ll b/chapter27/cfg/branch.ll new file mode 100644 index 0000000..b881704 --- /dev/null +++ b/chapter27/cfg/branch.ll @@ -0,0 +1,9 @@ +define i1 @foo() { +start: + br label %next +next: + br label %return +return: + ret i1 0 +} + diff --git a/chapter27/cfg/branch.png b/chapter27/cfg/branch.png new file mode 100644 index 0000000000000000000000000000000000000000..8fef29f12842267d60340538f1db67a0367c251d GIT binary patch literal 6228 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 literal 0 HcmV?d00001 diff --git a/chapter27/cfg/cbranch.dot b/chapter27/cfg/cbranch.dot new file mode 100644 index 0000000..a386fe7 --- /dev/null +++ b/chapter27/cfg/cbranch.dot @@ -0,0 +1,10 @@ +digraph "CFG for 'foo' function" { + graph [ dpi = 72 ]; + label="Conditional Branch"; + + Node0x1f793c0 [shape=record,label="{start:\l br i1 true, label %left, label %right\l|{T|F}}"]; + Node0x1f793c0:s0 -> Node0x1f75a20; + Node0x1f793c0:s1 -> Node0x1f75b40; + Node0x1f75a20 [shape=record,label="{left: \l ret i32 10\l}"]; + Node0x1f75b40 [shape=record,label="{right: \l ret i32 20\l}"]; +} diff --git a/chapter27/cfg/cbranch.ll b/chapter27/cfg/cbranch.ll new file mode 100644 index 0000000..eb96bb3 --- /dev/null +++ b/chapter27/cfg/cbranch.ll @@ -0,0 +1,8 @@ +define i32 @foo() { +start: + br i1 true, label %left, label %right +left: + ret i32 10 +right: + ret i32 20 +} diff --git a/chapter27/cfg/cbranch.png b/chapter27/cfg/cbranch.png new file mode 100644 index 0000000000000000000000000000000000000000..625b8a175f3d51e17b8b769090d963d72beb03a5 GIT binary patch literal 6823 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 literal 0 HcmV?d00001 diff --git a/chapter27/cfg/for.dot b/chapter27/cfg/for.dot new file mode 100644 index 0000000..123dcf6 --- /dev/null +++ b/chapter27/cfg/for.dot @@ -0,0 +1,11 @@ +digraph "CFG for 'printstar' function" { + graph [ dpi = 72 ]; + label="For loop"; + + Node0x11ea390 [shape=record,label="{entry:\l br label %loop\l}"]; + Node0x11ea390 -> Node0x11e72d0; + Node0x11e72d0 [shape=record,label="{loop: \l %i = phi i32 [ 1, %entry ], [ %nextvar, %loop ]\l %nextvar = add i32 %i, 1\l %cmptmp = icmp ult i32 %i, %n\l %booltmp = zext i1 %cmptmp to i32\l %loopcond = icmp ne i32 %booltmp, 0\l br i1 %loopcond, label %loop, label %afterloop\l|{T|F}}"]; + Node0x11e72d0:s0 -> Node0x11e72d0; + Node0x11e72d0:s1 -> Node0x11e7540; + Node0x11e7540 [shape=record,label="{afterloop: \l ret i32 %i\l}"]; +} diff --git a/chapter27/cfg/for.ll b/chapter27/cfg/for.ll new file mode 100644 index 0000000..f34f1a3 --- /dev/null +++ b/chapter27/cfg/for.ll @@ -0,0 +1,17 @@ +define i32 @printstar(i32 %n) { +entry: + br label %loop + +loop: + %i = phi i32 [ 1, %entry ], [ %nextvar, %loop ] + %nextvar = add i32 %i, 1 + + %cmptmp = icmp ult i32 %i, %n + %booltmp = zext i1 %cmptmp to i32 + %loopcond = icmp ne i32 %booltmp, 0 + + br i1 %loopcond, label %loop, label %afterloop + +afterloop: + ret i32 %i +} diff --git a/chapter27/cfg/for.png b/chapter27/cfg/for.png new file mode 100644 index 0000000000000000000000000000000000000000..e24626a0aba067ba409fc29d5904bb7567f296a8 GIT binary patch literal 15790 zcmb_@bySsWx9=hpBxDgH(p@4UAsq{(O9=r90R=@GB&55fk(N?Gq$H$E0Vxrrly2!* z2oe%^viJGE@0@+lxPRTX#~wOxvDW)O?|kO`)f1+vu0V)KiHATS2$dA&?jjHvx8Z*o zTuk_hT?i*N{BhAtML`a6cK%;hV}3jWL61<9lhJld-+1M2NP2Jo%np+nTVIa2vivO< zra^?)SoiBHE8^<0kqd>|-|EN`@btX&6Y}ZF$Ra{>Ds#$fhG;%i-Ig)fVB-96rI~ZH zlTw@9FYpFM=kaMxvt=r4{KN8)*@m<2mxfyt9-Ap5UtV>cOtdoMVqzd#aDN;L!4*Yf zpa~FPFy^iyk^{<`2p>r9Z%&FiFUK?$FPC6ny!ib2^VRWiTdcN<5fS&Dh2FGVUS3{% zHj4X9Qc}}HL(YSFYDYqE#u4Zu{LfJ|e}?awtc-_mDtLI*H>oXKwEW^n@ZyA8A|6~u z_90rR=`%2VMWn@Dsa!V3h6e_6?5-mMF3#0@XzJ41p(cK|$?PjUH*KslPYIzmJVk($Kt0O8P!A(cu2e z0tYALwLg+K3!-u`_E7y@IK0ZEgZ|}Uk zJZ^4oL++$ri>)7J^S!sGzkK;({q(7mqazA;Z)K2;m$!d>yxwlQNhOK88$acL>fjT<_}1zquM`&-jK!|!zFJEFfQdr7-u&FN?U7#mYh zx%mhlzLJts61P!!c(|jpGg+7%E(3aB4_hWVIhj6?l8TB>%3C#2Wuh9s(P^$Ntk!91 zuC%zgn0I>fiM04yN&pU#dYaG;R#ppmASRyZ+X@ODW#%17)XK`r@bK_~lZ8cIe*V&r zGIPtX=^P|s2cD;~ObSR;S67$t0bhk>U&bxFjM`d})3N@3`=i|_Zq1XgAACF<5z^bt z$NDx6i}WfzJy~FSBxQ{PtAWTI6F&Fn&!0(NprP7rv zi-kUe(7&XF+uYo|p&{@x_2rIl-(q_f-;JiGy9^8t-YYiPTglHfu5}FJf(0@)HKn1U z!Lvc^Vt%P6^q2HHYCwOc+FhI1yW1?NzX4TWWLR7N=FOY8Zy&dZUm>ECY+EcSDCkMN z(JB?(Q;pG&Z|@^S_QQJdYmjI5g_9BX@q(fvGQ1#NU0op|A&pGQb}6f=TBne9v&Pe- zH31uhGf`WGX>3xGrJbFW#h2ti`&$taj4H~?3)ELgNl9sGHA@w#(lIbFlwT&s#s2o!tHPpptj2-Kc$v|ta~?f6H%CoF z^J{14A`$KS#)grxaY;f1LZroW{Qbc@6iPA?4!@Ke|N9T4d6E+7?Di`Rf5u2%?gpNrt1y<>csDpr(@(zYNl2fAd3m zd7aA!B`UOUsi%~O4A05Q=>n#VwKW$?kshg8C6AOdH)lezOG-+Lh`7TAYvrld`kXbn zsp%j89=B77re(o3YYQd5aNz<62Zx`Z-&~`BprC_r`q-F(p%1j%sHmufAd;%wygcY< z_td^)F!N3e$xTd5*i$f3_Pzc5`7<<}o+KVRJ~Qm2{218=!B|DPZvNKRRwhP9Zo`_H z+1c#=WOxt!%HgjiDfgW>H8nrrp9cryhXPHzdwPOU3zh);@alXdsB>XKj7` ze2ebmi_*}YWdr+`>T7EHJ@eb=(NH7ASFQvNCpj8usb!?Z#P|k{LXW~_xE#_tYafWp zc0)q_zaL$nn=>nKo1C2d_U%rc=3HOACcCqXOYpu`D(2ki`<83Q-bX9>AD(`nBU$Ms z;1y2C^?zGbWc}nxL1AI*pAa2w?aHdEyH)ZWeaz$8>x;1d&{s!BMsTxX*WSN>{~o+_ zb)#q{Qrpd9JH~$ez{bY*+@EwkcnihS->=z?Dqnm8iRpQG{Q3Gy?CfBk z=>Glj0|wN7jd3?JbcAL~g;HN&HUtu)=}0rTql z-s&(egNcdB3W_@^Eh7Wky91OW6lHQUMFU|(cL|oFG*7`Z>0LG%Q`2l15>RoOl3okn zvA=WRf2qbW!m37Yz}#L=NKH*GD&h)6o?h+edY^&a&*9?Y^5n1Akx*bt%Lz<%thRs8 z;O*lg{GDIFE@1k>boVABBRe=cg6Y1AeSBKbzxHz?s@dvAyX=!Pv>zG3q=4#pQYHRPF>`ym8-^25PN6vn%N<-CCCXQ>;{l%q#lkCtCxa9;XK1N)+; zMp!8AhS3jzYEQqHG{WjnH~Xv%0gM|M8^il$ zgU}2mpRa9fJUKwm<7S`y*>`nufd`bDk^-Qchm*5=Yz!JN1%sS^XjgalSe4CvHMQQc z4^OEmDb+J22`g+7G127Hb}&yoI-+RAT-IAmZrr#5Q<3pbNI9~?v^5yO#!MfeXd+ti z{)_@d3jx8MXpDVRgeGA?#L|B{2?B9MVR*_ZCRSg0{u1z_!bD6Gwbn^F)lNVQER>oi z$HlI9*>H4p%t^4i`#Yzg#4jUQX2t*6)jmK8g}TK@yMr2~hP5d2aJiiK@83s7T|OTE z`jwlLQ~AUst-h`f8laB8zS3cHLSszO59aIF3*qV(7Zzf!KzC|vXyCeWL+W_D74V(X zt^0at7nmD!v1p( zCEmvOIPT=AB@X%_CeibkfvI4+N^VZh+?N#o&CSh+?#jyD8{^f(m40!B_evQ9x5sYg z3cIZTIB$HbtCGjtvQ$)5FlCW)HZ~jn7w}IH=A!{`j*X70r3xq=wXA(F?O8#8d#&K$ z;NYw}P*ZyM?p^Ke0O6ew)+L{3PE*5lSzM3Dd^W}ehq;AR_b&OLSd9hO zzugR4)PJG1vE|raU58aZr=P0n7JLE%mG9ppuO=oWJbd^tIW?6raCL1hz~8^FuFk%k zBDJQrRxMpPR$Z<4=-vDG_JEx-y?&>Z<5*$Sq`MYhj>$U-uJFF2@XLmXhzRD~z+W%) zd`E>|5#Wv8-QAcNWOuLC55oeE&Qp`qbp0FH-; zM^aK!{Mr4xcW;`0!iFvf)!DOhyCLRF%F*(-*H9y#?>s#{?Rl93gD=w@jXf>pxblS} z)yHi40FPm4Xo!rGl9HI1&vv55yd%nHvTpd}$60_n@vLg)@8AEZcjYOm0Imene|dR% zeSID3T})V*TH<-7NwYT#3yY49&i_i}?z$MRz6k1D(lX%YlRlmShH>fX(>0%yHIt2v z4PZe)zF?>_;v^>}?ZZH*7+s&4nE?)%m`Lv9bGESXaKZqvfSX%QX6E$I-ZWxVZ*MQj zl;)CQ3@$dNXKT9P(~-}SRJR$4AGw>GzfO@EBNMTSv$Dp&=wT z8vd@WtDBgVWH;5|4x=149%JnC?#iHIm%ECkDh$oY$^h z6V`<*b@1voX2yeU92Xato}O+y)xa@nZfH0GE0o)FMLm*Cm;TQ3b$|MwUsB@Z<7JU@ zwzefedcIn{hyDpby{%0S+H;t?N#paNq_y*%Kl3p_oR-M7ZPp%2=8``<56{`rTB*)^ z!_%{FI{fI4KR`&>Z(OCz%FTTQ&{YN*a+wCGAhgp@TFfg``5KwD*RF+0Dagsq5Wx&F zEz|RqlwxB802nIAsBHJvlUtEW^6dE6`nt70y{MR&LKJmMa&jnDEW3uHVphZBmwPv$ z-s>VP9lZZ+RKvI?!R7-544W7re@lzB|EdTxKw-sjz%J;KwvP1F)Uj$ilQ7gV>+6aN z((n16W5hh`%ge$(r^is6^3k+6Ohw?bw_AzeCRrrd2|rf|Cp1}ETg&0LcXR+vw;L^o zIl%$#hh)B8KHN3DqjTw3`*sHaObN$#_MAr@UP+peVUjs^pi$XQAKPemN#VkpS&Ri+TS`m zG%_;RUGKW(;_S?fn^RDrRF}S!qw}%)D0&ItdTG;9IDKeGG#yhQK+3QyUjyIWYdE+A z6BquGF;=kw>GRq0jxNtY5Kuc9M+aUMUC_x3-@PMC%{I93h| zYOO>SikQDh91jvV@y7kU)J1^~mZw|^a3e9yVq!2DlhZ|&cDc#$prUvTYu-C8soxC5 z^*?~ZzshYGYH2!}b*$p9&)L4uz~Y=wduN31g=uB% zELv|Lbw$ON(YUd(F(ium9Qfk~p-`mFC*9xfagI0D*Z+BM+S-;jcFyP9BXEdli%MQr z#x7omMiHp#;v!U{3y{OW;GMzMcs30f@n`RJ3b#L#jL8=KlC+NPt#TlnzqLRC!@Ntlvg7v6$pxAFG(;NXh` zTc9LOd;hti&%nac4sGDmr<|gqb)cAR>gk#zs4#DzV{`{xkG`E*jG+l31@8l>D8NU6 zN9q9ZX={_6UT2ap2G$&?3A?7LkUkK4F|()vaLO=Jwx3^LU7z+2y4WN0Rgb+d0WPWy zfi^C?Uu{bW$mhiiPhhhE+cP;2gn2HytSz*`m5L$ zXmsZ1j3yg8Dt8hUIe9QrSxt=v7e$YJ0o`cm?HyQHoDxzRn#gJ9SOFm+ZlgNw?2xil zov{Z&PAC!cTF1q3uAX)rx2-7&e|peN00I~{xP2QL5qdJf%+FuJq!1N@<+(kBF?yPx z>8;$v&48OzQQ-t%Y-?*Pb$aj`G`@!qnWH;M_k%^3a*B%y(;B`0{01z}t@plVdirdw zv{_wQnQ`rxn|PSxN`!9I65-LI{`}kDLpHb;$2&bdvLTm;Gn52GoR|B3&iAVkQOdrYe>ZvSy zKQ^d)T<;|wv39-rU=H6aEnuX?sAtw5z=f%GQA;)8MA$GxTLU=>31s9EEK8yQ3eI(c zr&d-mi~%b|6Nqo<+AODU;T{>1T!LrnGjanDMV}xL&S7#0%0%Nh(@?pb7cU4bEiL_| zrSqv*G^;KhY08`FJy!~5APECD0*|fN@y(@C)`1uS9S%RX2kdVTQ@>{I#*Gd377!%b zD4$U>6sF5P8qLcyR5O{mv`qYYm1XZbK|&Ch+DlaN%kFYDwc6CC7E)eng4;Y#lIui* ztkk-Nh*9FSc3p8SWo2b(GNwNKI2{A7Xmv{3~#@cW?3wk}_TRO z|NUtnDIT8a9ieiw_HaO*KYsjx?fKou|K8q4 z;$l+?S?fW~Pg`80Vmfaj+Zo=llg~9<25N%jn3xz1$-{-ko+Nd3^?^pu?TIY1fza$V7DCNiY<|vZ z!fMf#dJ4L=oFa(;<^GGyO%sdR-qz#euvLgfcu9!XU&%PrQcd{;m3wFDq!+pZgmzV=XLXCn+vss>&jE<0xgdy7*RP z`75%IC{@)KFFraJ%<>WVQ)ftC*T?h3cTCBKzUfB&Cx*hjk3&PXgC~Ohqz{UW?^3r8 zsas*~cq>|VzI(ze_-xZT)4USLjQzP1L1rI7>ge$B=VvGTP`qSRRAO%1Gf=`rk_RmV z12;uP4x!J3+5;NVM714VT&&?;@q#(fmlkd@N=dK;M_JuP`Mr(xi;4XH{X6g^lBK

Pe7y!XOQ!~M^ytY=KovhnVP8YwMF&t)+Fs8 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

d*Ij;J2aa{R@IeB7yt=%29Lg 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 am-iZ;Z4?UqUU-3uItfu(ks_hj@BRn1#uu*u literal 4460 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 aXQCvNm>W6m&p3h0AP7A(-AeeK=>Gu-fv30t diff --git a/img/stack.dot b/img/stack.dot index 07cdc24..54a0e31 100644 --- a/img/stack.dot +++ b/img/stack.dot @@ -1,4 +1,5 @@ digraph G { + graph [ dpi = 72 ]; rankdir=TB node [shape=box] WriterT -> IO [label = " execWriterT"] diff --git a/img/stack.png b/img/stack.png index 44b6c82522ecda89c478b5db2ca8042951766d76..e529da57810d2b21588aeffad00ef1cbbf36ae48 100644 GIT binary patch literal 5621 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 Kl`fSse)(^26`?W! diff --git a/img/titles/basics.png b/img/titles/basics.png index b1d83b6794b7f6e3d939ab2aeac286b6742223ea..a7d89bb53b8679f61f0126075daf11a567ab5e49 100644 GIT binary patch literal 17804 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 r;@Tf%X$n&BgZxj$kMTFop8Wf|h5sk*x zbxjBcvnD=wO^8JONQ_3!b2a(I=;}ry(eN@^MME$|6ogeUpb17$h(rt$#3=Y8usrUq z{iAxAzK1#UICJj3hs*hWKJz&<=Tui$ @d?yjy8Ri%pZe?UZL0H*-6RrS(l7AF@( z;I373>m@gvJfN`q2v+R;q9xlg*fA(O8e~(AiU{%rLpsJgIO~5i> znuweV+>H%2#{jEnu(N4#S?i{*LFawyNsiqROf}?od_AeE`>bb@WR?-^-O*=9P;(mH{W1AXi7= zW-O33j(;5%czA3Io=>_mkL0*t-|^~x2&jpntpRQV{*mH7Ee4LsAjdVX+_nU|PkVLr ze=U>F_&iT5vpz0&e3z!AKg|6nYg63gdf*A*;1cBO1KbbnOsHcE@DpG_3ZDPv%Dhy9 zJZAu}rD*d`V0N14!{a>~cqs+%mB6JyTd!aSA9xV>EoRww6wv(w z=#^5Y-USM{5ts|y1Kb771O6Uy1D^)|e<_A*2i%@gmKJBQu*mN^$M?Ym+5>>45jwCP^T6jgeVhlpN$9aD7U+5#&_1PHCl>rq zYu&T(L(GUR#ynGaD>ytJRMS+Vc^x0JsB~fQ5+6aqaZ=@A4GEKL8%VJgh<+@Hba)XS^?)-NOQY>F729-^YUe+7_X01Dr$HV=CsV?w3$UYj^V% z*zDx%ScJ9*X5s(r)$t4t-j>;9RPb+iILi%r-Tb@wUJU==(_Nycg@f1!8zI&fmj zI{MSlWB5V>eTy zn=ji!=plZM1Y_%!9Z16|oIe6x3TV0mTix%EX5c*p8$C^Q*OgYDuY#^R~v~LX2$Sn?-}3QB7Q&5`%in9+NPGYta~l+hCBa{C<3?AbAr2k zwh3g4g@{}Y{K#GY0=Ps~>tl+H!?Irhd_`5?%~GG*>e6_3*%$Nde_9+wq@9QyE+SW9 z6UURW`H!c8PpImKSOz(vwoma3n5R;U{clln4kAp=)13Nv6`@{zO;!Jtm4T{mRn@V; zDXMx?1j&i+^L5RUGtCccxJX2fDV0$S`ZWU2-Jq(QMdVS;l|8HoSsSb;0NWhfY!H#l zu+<(&VXQ=CKWt(Wf6P0aUP`^Hx>!UW1}*}w6Ol<;Wcj#4@DmaFFePmbrf*9pQ@>8w*>@Fhh zR5eQmj$QB#RzI4^xHKY`yU#%)(neKx_&=)Zb`hD6OQkvG_ONGxU~@EsFpsOLu!1nwC<-rOSrmE#7mLW` zrZT7=zKNyd*@|U%Xe>PG_;<#1d1@(4e1r8TZ27d@7)Ce@YitAtt2L&aD0v;EUG1^2~d0p`4x$bhYs=nTc)jfqR z7PSE$a1O=Kvoi4w)?8JcP$uDaK}4>l1cN0aov`3Fe?PML0Bl}h6Sk_d35!`-3cQF- zBnRk0w86R`I1QTwJOX%CL}p{g;|WzwN(o#tMC2lD*|&yl#tK4%^_=F+oar8v7qQ6r zN;g=OG-Ez2A0ko-rFhhzWyC=t0*RUgj4rw?XSe0}VNP38x>xC!&%mSW!1o33~# z5$T}Oe^Kx^VBrKuVv7xHMdVkQemtvg#=4Pk9HG~~tP$%$RX-GwaainHTVS$?jK|tJ zO;y*Y=0ydq5@J2#cQGZ<3`ZReBXdW^)X|EDtBS#~5x5tdfGoON7sI#cDk0_u2jK{_ zv+~Ct2F2pF+LhtB!|_{Rq`nrhN?5>mly@I@e*h<>C^HnBwBMFdAGcwPK*4p~itN5v zd|x4tH?ZOR&=T7lyGn=|@}RD<<+{%aGMx#$AMxzY#TF-G<0va?FQJG`z~0mn?4w(c zEw`@4daJjw$-A!Z=!VU^9fi#U9Gs>eH4o)-5xE;PsADi!wJR3f=C6A8ScDk?!h0#l3-O0v7*;D?bsKC?bCW9>XH^ zU(V9*81(ke8`Z-KpsI7+ME{q8uVAC5e;VL)ckC3A1z4=sLmIJQxzJm>!J9%ZA-(X>GVlZ4KM@MWDbUqFD zQz;4i@F*}?*c@E2-)aUn6#Z9^-z-uL4Y9eBpvQM?}gE`xp!2ei&nM{a{v!0#B$^V{wjtqWr4lML2bf1Z5bZwkFi z+0ORZ{MzCIqt&h1Bi&u}`6t}vOwAa*U4Z?|Akr?V>KawO8Iy0V`}#%~#2JSpG4H88 zW~|0)!qTTtf*f^(p$sQg6VH_ee|Mj?{+BL?R1keWS@XSJr`-DZf~sDP zg(7UhhE(6l!E!O?X+i~Me_&OMnxBdp{D<7vLxFLXp!h=x-;}&4C$CXC%SS?0R}tm_ zuSrqQAy`o6RN&$QV})8bGL|q-=Vu~vYy!_&?sH$@V<|_3_UCk(1Xae{+_P!vaG2M#d33 zOu^oN7a239w)$}{7D~|$cuYikN6|VwOxPP%U!af=hhnRGu)9&}>z(J#GqVz|qFcE%>ZD+;c2f5KgktOSF#7@MDg96geV^uqFEH5TfyNqDe?VsUt$7-JPc zEyDgn%n zTd8=5&0w* zt}|6c+7|qFx`=d+E}4j+t&5;CRtf!hl_{i5?&ZpM#Nwxdm4u?JgxDUwVD)E2hC13{ zd!ZCta*d1+eoIi46RsF8p-9%onDQ48E*o#BNc;^gY?Tn(O5-Qi`vb)@ z%|7nYjn7z5AHuAizCLy+plj>?zj|!DO6pv3*rLE1$9G{2U6urX|KiE|7I1dPc7K&H zG-(qs#QSZe`)vcZMJh6DYZ1QVJh{eHiot4)jZ*`k;A4M?cx04(Y@D06-cZ61TwhA?$=9WXkE_Ig62wT+k*$zGYR*c?UB{;j~d zG4y-1!NR=ZBOI?_{x9IUE>2b~kT^(-U5`z0cTK3T8KY8`xuAB&}L1Md;?*~gkl**B8|FNrZ2W1Fevjb1b7I|u7^`~b^Q5p~pH z5%udlx}Zn-9hPruEH)W_E#~d{d&q80Xlve=e^7KM+<*2yF)4GgPzyiT{G0B6U59P$ zI0{P(d^r{u=C|WDERkKDER|xg))KzrD$TKq;`>nF!;C^=tRLo)t@p})gr(v6G8SWZ zG?q5|7OaEyUlMUQ)}fx`eYaa27SV5Rs>f1a&%|N?FTmzGZ=_+TUJsm?(1uc8LUA z9v3t6g>N{CJ3hj^g;;OQ@vanumG{`;f9~UTKu*jAhuQ}W%4d9Ay=TOmvaw@6i=q|6YJ z69_kR{!mjS%yX0Imtu`O7|UnW4twC zG)q&y=+muojRtnAYSGQsA~F~^w}8FDC3h~T0-jk>hj~V8-0^0b|1LqEo|s2*92R5O zADhP5i0R|Y*vn7;x1gNgj&Ey0U_!}=dOBl4$G$EO#X8nNAD>W*!%8Ff+1Su?gR0(_ zrc8wV=V2bzU~EyV273+z&vyp)9A-+(s;4KH8as;q~oC@At7M|=|8X_At9S1 zmLqAXh*z!s4N2k;MW`;wiiY@kM)UMF@t!tF-!7DdL{{X#FKN^}oe1JX?y!fpVU~g5 zut?Vs50c2pNLlXy-%xkgAP?EV5Ks8FCJzb8EfUa!dsb1!TMNho>BYcaC?m zc8=F0x~30%rh?)ceH+gApJ`65E;=m5HjFU+_t)awXryDqyWJhY^ zzy*|L#h(>wyv*-Ud_NZMD}wtjI(MmpmA@Wc{y-+6L9@#)*jkM7J?fFv(49FV~U>BSGDj zTmK0_>cg0f8a0?UU|&@3tN*Wo4e5@T#{bWyq~LIB+<&S~?_m4{T)17_E;cAy6<-`+KGv3An&P6_yY z9m}_C)om=ewiF5KREfM8Q%Zu$kkm7F=c|-y+;4lCXv1}R0cFypotMNz=l3*JAW&lp zZMyo=&62;V$;S~Rb>Jh_#>n0s@+%UD9Mt}Qpcq}qT`amAXff9Rrai#lX*soR$T>+1 z4P!o}+4fXA$^&_+`3%lJUiBh8>$2XfVf+Gc_BZ8RJ5483x!t&#>+hZ5_&OUNw)1Qc zUg|J7C=nv60f#HS)KKV_-k-N0|H*)WA%nT;&@Iw>i*JaWGEQ*ooj}c$DayxHDx)_& z;j>!|8d(6Xi5KTvFetyt>CX2-)*%}elwcUQMVCooSZrIQ8(4#M^QNNONpfo&}AYA1?{-smnm4WNjXw%%}haVs#f9O&^Y*Lk9Mp zklS1-gX**=LP0j`q59~h#MLAvpLoWQg!qFqMzbLhy#U%+cE zCyFuAFiFnZ^Kh@#L)hcp;!?s&yp91^bZN<6U=aCkU{93eGvHGJy#lZO9q<&MJ)}?l zR`7*4uCV9XU0^I68aIeRk_%8|QY})y*;!l7Yf@eQyy}2!1h?w(Sw|u#q-SO@nF=WC z#2U1Xgg{c`NG-Y-?TjIi0e`i>;+jvCM=@duJh;cW8~uKsCi^T@t|pWMiYW3`hTS4J zF#OBTUkS8Wn0ETN)Wf7v48aX(-v!tBml;6?K~f_P745lCf?fsj2*nE_;a(9HF-_nR zj9Ag^29^NEIpO+}7{A6&a@et}a<@-odT&m*s85T7ThpNYl$s0<_lvfjkc;n~+|kNt zC2+(?sJ|8!wX8!S#xEME@nSb_Auqj^7R{X4H~3DCd>m5%MCp*&+~}>_JaENv05ujc zi;G|Rqx3Y&Dh*md8M{o7AE9xSCm&06@%qm551|X6R6W6= zMYGD_2zgiN7fxE}O_(1W?ih^)KOPeA+5`sQSwBxcJ{eQ=ya8@!Pefq|>cCjjg-=$4 zm{t)Cz|T5T`ZHG(eURR5PL0KhF;BXngbHi{xYg~It&azIltcpnD`{X-#um*MgIjx` zj&$?)W`2JQ6d6b-@f@g$UTPvV15pn#gi-VYnljnEL@Yu(t)6_|3oKZpabwzO@7ztW z|NO!it*O<0ZkN24^>;Z=mutCa3NxmFVvl*Y^idwQ7yN|~iLP**&!_Pn45UU>E#^`=)IF~ z&v>H11AQCISnq3&44tmMhc1plxHNuGc4xH10^`TjU-)Cd>K9WtdUIoJ_m?61dAHi( z5^LD>DU_s`Q%{OHXG1O`2P&gGy!*kMGZL856nq-*WIBBuba5JWu_$P&f31>77WC)H z1V?_i+P5)Mm|<*79G}n`#q<$~I!)Y9I&M3yV`c$2Ua4H2oA+;CjfiK-tGK#fLz0z_ z?MVeIE_b}idws!Dq-DHYA0812=X9IR;?h{$3zY)p7skKS6k20nBE;T?IZEIQm;_fC zI(NKuDCYHNek-xJKjcSP08wj6#|&K!#;2NP_ZRhS1zRf-KhzU8I>o$Op(TvZYSO!) z4~xuUBbytO{2sk|uhKgR)566%yn|(1$XrF7i;EWU*TcyJ<%GUB`w|HOa(9DMR)|RR zEuE|8H?16eV})E3jJmEsf8LhSJBWBcHg^XBY5Dig^-|sMx%l=o>^x33&fY2_aqt44 z8>rV{m;5P!@Um>ZZUW^vW3pZAl3`~9VO1QF6eqqIKo!sK`9?+ff>DgEU?cCNMpHL* z>n-c)rKN<4W{-2=_a#2N6{V%FZB?mfS7nlW7j2vW$57QODwVB)pYmNK|I=^rOaUSv2IEPn@ca9yFDzMb|r^ttWu*!&5_3y zfD->A5#D#*85NLWx}(=_8(V=r#^xs9EZ8J}Z0@kns*q7^+-~N7+;jP&*3EZSttEdk z>rQ%j_}7g{$|l#BAF^%}_+z`V)0dJiV-@E|N^__D#;U1lgffwA7()5pqHz)3-!FTj zb4KJQB+AqUIW2vNeNnBcHTO0E-UH-mFqggSn!sV!$~qH;QvpA=>K^PU%|2kpWr@PB zC{L)G(h%W*IMYd`+Mq`!la+KY%GD7_1Cwn+bv^y9-sv4&cpMn$tz_Jqu5n*n`8sL zLFWdY-PBpr%Aje(IcRq52@KNLN^$4ixVFCIwK{U}I)PP{FDeBQ2|7a}x`1CO6A?Cm z5?OE7U6%gAQ0`whdi58$+`!bVkJ3lu2Rc5p$tCa*6nW4)GH!&)|-52_nZvSa|{0~IsIR=p)Ioliut4ZAO5YFJP8-z>&m&B z2}1Rsdr2@=nDRxu6X16MjYRq+kO*)cEgiFJ z7ZwzTy+(BXrQO5=N=(JyIULcS-WY$R5K%PCoN6d#px8%0^JKE%Z!q_E1PDe}|45w1 zS~>JfY+@az-b>E5VdYW3J3VZk+7E#LQ479d0npN&5eauqU8gGc0asROA7(}{t{mw3 z&^?U>*11h5$gJ=N4Lv}y#j377({ye4DU^Iz@BA7?n<3&|fcQ*H$vX1J>6v;JA_S=r zT(v>b|E0WyX7qk$U5K5&3P4NNTdJS(^38)#auaTPyw#98@SLK&^2rxUbSGpa4B7nJ zkmriG=)vj4R^*Mvr3`yvc9mPDCYvo?HsqUzog&Uwm6qZ~ZTvxQsq2QUlmEul{v}4X zZ07R(6wuRup(1`%9%U0hP3iM0_aGA20AVUTuxi|HGk{dFMmQCIB?+>fZ`g9k&&+Nq zML4T?aEL#gG^O!vvlMY<+Z6?nV=+@CBj8n4mJ_cRa)4_Su7=+7-;K{GPGZ7Y!U<;m zRg)7JWG9J;+xssqrJ0hq?u&~RHggLtf8veO>(aK2T5TbC9i^$MopNb2{PpJRc4@#OEs6SVY z=gfsvkzP|>v=aaP7pArT4x+VaHa6+S6FzOrNl*4kA?1l_@xq9GbPkYqaRLd_EYC7g zw1;H>`mkh7RbbE}feMH-G8<-8haSMT8c)9HZ#=qXHfz4mcdJwkYoezC9a28v}bnu^P54H4^Nhy=cdrBhFr@$Ti8+f3>NUGYxqr;PnB zv%cMxj*YpXz#y(<HC$XJ7VX&V0nah=j;v4-#AQ{Eg+xrp;kCWJJoPuOwOy|UeiYBw{2jqkGy zXVX{nx8Pe6d2h6&C;aUCVOksW;sD3{!>JBW3n!W>+ppZfp*N_+E#lz3`p$_;P8fz3 zAfA+)X0~>!UKJ5>sXzHHoO&W@r_gJEPJm^{Yg*drYe}J3tECR$t>9P8qHeHm3=O4^ z&)3}9+gF14JQMf^%|M5Cg#OA2#pGa%!+so@t=7c4giDA{K!Kn!=GzC6?70VCdA#`X zH8owk^Ij4BlSv7fj%rKFh{hZ?`-!@|%4G+~acJ`7a>D`QF7{SB?;VTExy6YHWFi8d zxX*^Y(ERHzud`pC3KsT@f7W#N`d?~|YoA#K{s=skM?X?|CVCh^?{VhOdw=+6adR`& zemoLVD};fggE``_QM^4_O_Ei zZub!6Qt|ygst&A#iYNhww?v@c@ZI*lRVZnoE`&5SWq+l?@LpqW={wq7Y3N&n1o{$9 zN9ljX*xq8KcOI)n^S+FqjIVS#IFlmYG3cTpnc~1wVPKM8kou8~9?xM5QL)^EVyH2t zvd_d*Cf#!Q(pvgRNAJE)>MAdM_JnF65;yyHl&PK7CjlOGGYDl4Wsu|)D#r0G7=0-pJYU^YB6SNd zk2`uUwr`zvHT))5TH6@Fvo8=f(pFc}%JG+#4zgfm z*1HfUxdKtTX~SP+qky?$#m8VX(FMZ}0C|@cpMezT)Iqxz=W)?Ou~%zmWD76AX{{vB zs}&BF$rC9xDVl|#O;W*5Z>x-hzf^j8=S1EpHtbRfo|m&dA6HIY1ttmpra|0es*Xai zyVUU|y>W9x#CZ^joKn7{6(F+d|^Leh%VOjGF; z-(OwJHn{G#g&xHBkzUQca5=N~dGeM{&!U(fURKnPtfcELb_yN2pG=N^n*k;_GUb!|IdSz7 z5gNmiAyxg96n^RLq^FTTxkDjm_C3GioyZM!+M1B9v5fHVyO~FC^)rT@mUd2I8lren zU>Dg*&^_Yj%ugOvGv?N)S%41?F|clP=r+>(^>bAmM|i$!51UPc@JxJAK!tldno;(D zd9$kU^1Ed)KaRp>Im+H^rjHY#*;bgc;KXyZ!7I28T+D% z@yh7Lgo!iFn1UdIcgj)u<_Cj+Hq6TIpgfX(@T{hX4otcvylt=4qIQkAIM7_a6BLbc zzt>^o?by-r<8^D@P)D*fTLWa5SLo+bVe>;P>HNt?Il3Q3v;UHrcfwcv{dKL!kW&Nj z*-*4d@}a|h9l=`&s?LU|N}UzP&0|Ws1hc+emD2k=!eQ^bgn;lbyyNA1G`#hJc?VgL zW6PFDUBR)=4u&4h;5UbvM=ueZp}z@U%qy>zlhcny?fLA#5$6s2XsiJF#rwCj+u);& z&O-O1SyuFIRxA&6QZ6%%V06-CM{SF!NP*o5+~HcAF#>imwg=B_nSfAIX+%d;0mVqW zF(HQLx#=nJ_r#UP8EmLvkR%3-g%M$?9DN?_*_`QO9jYd6BT~8su;31kB(396jEzM` zaiLkZ-oLN(Uz`YN%}u;dJIeM5b*D*c7v(_uu}Ni+S5~(0V8h`PqG+~18Cz9Gq5SU3 zynYXjh~oYC9J+wv)nFP^dIfDTP)&&-eO#}`N5lD5FinL7Ltt@{Y%II4@{!zjl5LjK5@H;x~%z7=?`8_jAO&{$iw*c z7J3beLZmzIcs-}2;UtAKohS6zmi=`YT8V$DMdPix7y{^;Dswn?$7`WB@(_U@d%_7^Ni=AXfZsI;P6&xWMBqOv~ z71?YLt=lGUM|P^i!9wK2;sn!3H&aJJ)*Dc~$C6-X zMSCLl2;Azot$_OQY*UQV*hk8YO>Zflw*K3TF1B4hp~0EqGF0Me(&@_h@^xueQ}5z9 zaJmpfxP^l!AH*)i4ySEBVU z_uK~rhNeEUk?Z0X##{FfFZm~jWfsk9CTo7meYNoTQ}vkR zAjZ!eN0wICof$?MB)qEulCxp4NkeS7^Vu+5_7yE9Oun|Sb7({MNk6H;z8R_f!)#jU z^*#NaE0U6^f2u8d-4^%yIhZ=Typq2<-%{c-vsOKG8AFIg-xGz8-|Eg>s_U8=_X1qf zx63Y)yzc7PA-`y^YMM_>=Zq>ekN><%jxH1}v3Im8$yLlSpUgqmId_3;g0q zn_!4JDW6smSlu)D1w_yOv=s$ZMk^R?eoT_w~W!QF&f9opm z3G74QeAA4jyvQe6O5-Z>>Vvaj`n<2a@!bfNWY$2(;t0g`3q}kwmM`OS9F?=XbaBx@~aNuRY`iV|T3~yInh=Dd>2&1Y* zrxO5vCy7ne5hlX5F_-;hyUC$I93~h3X?gUKeKF`l>eATe3Zm;vb+<8i$2tz*3 zrW6EcD8;G|@cpTCXvUW~$>0l8oK7gkiUZt&f8ZwuqxaD@cVJJi`GNeaXuYn45_(PB zpl3j!ePv2k8~>mP#Vp;Af#&s^%%h(WS5v@w}7M)Oe@_iE$-W!!F{hA`CkJ*daRi%+C%9xitYNp0It#a zz}w~yXz;YHc@r@cB-TXC1dRd~rnXjFmhb=PWG(%s0iZspGM+tMIk}bTWupz_e>YZn zov-+sef7&qv|)b8IKe;u585fxj>wSj!n2|`y=KpL~pNi;Ag^JS6)IW$hdq3=%bV`@$DP;yUs;zWv z0kxE63^M7~R`ysFi2oazkT0^Wz~0Z-%Yj0%)Y49od`M3uc`2x6*87dDAhcNZN+HND z^X?b*9WUlr1{RmlS-zXq2XLl~+T8PPi`q)9ApT@8>4+9fLp_U{x-$dml+snTcVp!? z+?b2bnl%MvmVOL-J7B`kBhAx;Iuj~m+8lgJD^_~|E3XhVJ%hLQ-^WQJ1d?~)_9E_oj#oHFdHap0l+IKk=9a@E<_K=mp2mnWIE1@_xLC9!)pFtTw}ISo*#ywh1U3+S^3BYkXdbEdzh{z z-Uj->DL_>1l&IP!Fr3dv5smz0B=;7jofOHL+ z^1Fhpf$(n+MaM!p-*ZdkTR(ltckijBU`BTQ^}NlVY5}D z+dj-`rc*@I^2i{Zb+JS=jRE85NbE-TD2a)6Lp8FRZyUpKmR0#l{@x_Dti%^zZGwTK zA4_MxGe@jH#q~abze_?<$uE>ax9A8^uLzaHr*ypEiS46^!$4Q3S)h-%(My8m5IOM? z>$fGHV**ll20*|p%KtdAf0<5+mewIyU#<8-4C;cx<(L$k zu@pt*#9heMgJ4p4&x-yyZ_%tq67$Uqrz0|@%2eNpgc7e-n%zT&W#Z1ifucCWQ!vW7 zc>BV*`i^WO@l*kQ*?(sNOhjSZa`>v+)!@qg%p;uSTvI#XPITV2bKYd2*lsRT z_-}&(K9xxU)hh{Rm5V_38$Qfh2lUq)Lh1)?sgdd8f(1wS@+&y9GV&m)SRndSR z3O@S^{3md$-QaSVG+0yhw#8toj|;p*al|`*OmJ8EoW7%qL#>$S&kZ3pR1yk`ccIM^KEe4>y%zaJ&RL+(J z679K)ugiPF3iO~z(!v6-&Mc_X75y*FRqn2UcfQOT9F08{<|#pFB%QNiN31l$Wb|X0 zPPlf7aolv0!hy9%8SK6e4*h?ClOkHQgj?Q^KALyjBqD1qBbU3$r$f@OcyrLEr*O*Q zZB;&-zUe33VZ^_o6QQ5tVC6PqB3j>hy4GxP0o{6cYjbr|%v*gB9-Sg>%=OO4Xo`q3 zrwQ=;vkc6EnXf>uVw!M&Z(|_a9b0d7)pZOG)hyc=TezfEe zdt(t-v62m0X*sZZ;z=DvI->+O9yXZN5w}y~IH`j2FXcTK1S?lVFR5L*?ds^c64Uhy ztH!o4to|kns6(l&r->kS_z{@Ak8$1y47a&yVUO`kQsvsW8F?35!bsp$dD%&fbspg~ zU_mPx-~bo7wDg&aj9t;6`g>_w){MTxFf>0n;%*5)CD6VfV*;oja{BldZ-{P%Y-3q% z6HYaQVpAhR*$Q%=`L-BoSpP2}nt~RTkZp)dM8qn*JQRbNkebNNK657Kc*MO8uMU$xk zc&%BXY+#a;GAarY^Q66O=hlwJai%N;maX)23{Zm842tvG+e zp|fY;2)c6NrNtH}J-SBIOZIo(d?+{A*ROf@3Et>(v?I9HKGWM32p`AvJ{rFD&-%%@ zElIHqzR-Hes=tqIMaEsGpJAc~T+lF+3B`JVHQ=*mblHpNm? zA_VaZOR$>UNjjy4Yu<*>vY=m<$O08md&z6hyU2dsm=e3L$UXn70+CHCnOU;be)-n{ zoj?)`n-!$t?vZ_CmmMQk#dX2eMBZcq@4HGsKkgOl>iFG;3|Pv3@I4UC$gkP<`EOCE#cvE7jVe_0VLQDifS!ML5mlLcn0gHBm!)V!4M zRac-X*KELXV7!h{C^iC3=BRlUvKJUCUruH}J5)x7`MIJk2fEk}Vec&sBn`mtYIbIs zW$e8`>pBiJY3_bKIqoRA^Y@ntpAAWRTlOBo$%s?3u)7pT zcVPj^l<3pWQ|{d#ug_r%pEp9D2yaJj#K+kWbSMT{rtAc>Xitw*Mv#hyu?)>6Gk#0h z5-u?8Of4U3+-!NST2`;oOILQhMLB-{v-kbm^_Ug$5&vFp1vXV=g{@?HliI(1@X;-y z^Sc_~>-X6#__mo`z*%fn+gG|=vt`-@<zjPsw+jDIjqEVYI6bnl$$ZYdSJSN@wdy4=}GOcmld_@Y- z;&2`hm2i5j3}cV#L3CpXvi%RQw7TQ3G(p2`y*C22QwqqY$UC7AwQ`!)FY{%$Mc^kf zfuzJ!9r;r3-2LL4K`1PtEZOATumAN{bDsS#jVk>ZMKD19FxDf7^L(x3Qbki z-+4(qb!3R6>AwrQ{U!G}j!6i+RQTKD=lS!%S9~HX>^t)Q7Y1zfKk~%z(z=hb%4;xH zXTYXj1bI*H0{_dyR9?16Zty<=I4$Fyr_4DAwTK?t=va7>UP8Mw*$!dI8$f)$KknxfA| zw`6OKv@aj!hEckn&gQ}Hb6WzikT9|))@6rF8>~>q0mCl4ixS9~Uq48OXf+wk#a%4H zk0CWRC2kUK<#w1J3byD>bmFk z${hol!=_2rG~WrPQ+$)xWN^^jgGmpip-D?fmEl~{ZuDW)s}#T63k!F154sUAXi??W z770p=o{8>B`2b=f3f4#L83NF zqk6Ow+hU-zw+JbqR)7rP@_EzZ+4sARp1MwAgkQ5cO@f1rBKUitGGV`O3rS5B^3%tI z?r7R%gK9&Av+iz%AZMTps`JI4(BnhFQV+r?)bEc zFB?X;jKrg8y+=xg{46@4*$F3LTxtAe6Q2~u&jhEHtT`~sqE2(aO_ckRew7mEjk~8S zuvml6KVTXEW{O#@Gbg%(x@T(6yAD&TPVr#}g~dWpY8 hfA%0Itp8k-gTP*-N|WPniD!FBKo3nGAaz}y{~sFHJp=#% delta 3278 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 X0w@Ip>}kwi00000NkvXXu0mjfGNUni delta 5499 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 diff --git a/img/titles/hindley_milner.png b/img/titles/hindley_milner.png index 114d291e555050d56a87defe6b2a162da9d3605d..12b533a160a811e86422beab1943092b0b930787 100644 GIT binary patch literal 24865 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 S;S3-J6U@lMu=X0_;r|0kp3&(5 literal 6684 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 WtF(1=6aTV90(@-rs8-YY<^KWVmp+^T delta 3655 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 z zog)HGy?hhx?0mteXtVwTWr0!zGzYw05`!2%gT4;j<;)BSiu7trV+gs4F;2F9uLwlB zb3AujSu{LP6D$%TT>gN&UG)WKfmJOQF}Qt_jfJ)a>DB|S2GVEoP$V#8>PHF_PUX}I zCqTtJbK$-2B;`dj2n@3et1kA}e`Ymb>y7c^YZmtaFN$@QcyX4b;0uF7x+Z=+w*F>k zU9qMUfczDE!pRYeclLH1-h(zE87!+G ztz_F(Ij|Q0hWErkLM(-~&G&*iV02X&Pi=(%P`~#f@qFLjMRO}xD`$A#@NC$nrLC?$ zm-Y)j%%07d{p|i`wypCNW1mLugU;?(N^LRQEhR`kC4y`p^0!VkJLNVT@6Hdg8DsxX6IAHsovx>sQaAF}q$bDb4M;{mxau_}iegRB;QrbhT~ztATqW*7)5vsU zQ!(}2_(Ns#_iV>uPl{keO!ixV%P=AJmE1$s;`i716^zr~s?tbw)J52qdrriX7<{ao zS>^s3pSg1h{cD?xtfG>?>m$U6O~H2=0BBB>kG>mY_>y;efxiXR6n5i1cy`lVtF8SG z9Tn9-X~R9jpHdbS!B@=|-*ceisBZAhC9DG1cYU+o$Ou?V8qa-=_-?s{P4Im!&W`%gM}q@v#tX6o}fcw=7DTOcU={N4wTwIK3!!Sol}q7 zy|x(ygH81NXlagc+2iw_zj8`oiPG=1DM8O9i5`{J~ zD@!@XF`5a?Xe3plJ?3fQ^ib+vj`g%qID5bjrr3)B8?ixXUlE1nc>=#VYsigy;bX>X zw#>VFnm?4PbLH1#$69x3>lBHIiPyA|6yVH{Ocu?` z9o|N#9`@VdGi)KEfGTUbM_SIgAyIX0FDm1!FUVg4E1&Bb3fbe!m%Be<>U+Ztu5zbU z5#x_~`G~J1Yl{9O9g1AYHN!U5=;b z*SSl(w?zpRkT&%@YY<-wN5OL>dbC&yPbDEXIkA+FuBsC=pnlrNtp{CQ+=GUx>GH2^ zK+W%=CNh|P*7Y*4Clx01Xoj*_)PBT~rSg*=wRc4^?JB>c>xP=C z24#8~PM33$e7-fCl)wCVOg#to=Tr`iSH>(vF{iiNSt+){z;b4P<^`#%1||XYJ!aN? zevuZFta}?Rl>1VkM~jct@yMWm=b=RYB7h9-VIz|~#}a9fG9VQ@6h4Wk1Qir$&OM$N zBm`y@4Hho3m?(~JTv+yYNHBxWeCOd34|68GE$eY}<#uhFexCUbqRaG>@j77h&uj6H!qyIX zubi25n+3$&z7Fprg=*hVPGYh^ek#d%etNMAf~jA>24Hl}Oa8{sjWvX6W9OaiSr9o! z?vNhpxwPboQ~ZR#s`%VUym}GwKDD}Lg5B=tj;(9|?EZVeRpkqwE{Fug&|=vmBVXd1`W>i?*5s#%jUZC%qI1>~PZJjCb^p-TeIP5dr*~HZgZz-ntjj`$f>67x6 z^Pc0l+xfa9qBL4r9VGWOoc&($y8kx)F7Axpn3>&2{uoR?Yxk?APEjI6Ewx~6^;)&9pG?RD>SM7R_Q zV)$sA=JXc@!u|NFTKS6g@E2mCty(v0H?2Ny1&jG^l=~6v_v9m-EpIlMEkq$T2BYs| zI5FAB=FJHr^?I-gb{x<-co=zW9s^nNV@ZEu59WK&CsJvqe}-)3cL-unL0yX4 zz5Ux`Ec7PIE0H!tE@X~-*Ps$she0#*EWEah14Owwf`qGDcRtxNoGNb^K=g{a^~Om5&ga)evy8fZ-yS$r zk)Nbo=#?ra@43pH4PSbWn1$R56*+YqB^e8|za<0WfDl^h6g3R+b^yw7Y_Vi?k-$h`aZw3OM!xFj$3VB$-`{fCPR{vJR)}`b z^(Wucbc+SLZKL;_vk$mELEXV=h9hZe5`awht$l>FchjIKP@Aq-;{&vXWPbkVyJl7Z zljxRaz>Coo+wMx9KNnyp(`_b;W3iWGg3m7(-`{IkK<4!NXT6WCvn)HhP>WZFb#sP?Kiq zO&(kr4Bd`nTM?e6oY13;K~ssb%dfe2thon?(0Bon(qxv7Vl0&=Q;`yuV}TbaP~O54 zPj{i^z1oPA{@{uSecQjeanrxj&?X&)K)-2@ol8u=SkjQjcSSgNJ9!TMJOf|0pl^PA zB_;|TJ6qyjFjw-rvOCpQcDlzQ$mHO-g5>#cNZEqz7cdL}y1abMx%@aQA9F5mX_(Q? zFvuW}_K|%4zR#xGO zFrITHIQ52JmRuH4;yO=>2~j$GJwlyv(KybJPyJU55PTehM~Mo*n<0BEt4RquuO@eB zxlH??@)=5gF@LLmVL*A(tggBU^aiL^PuR8?2h9zR(Y7lAwN~~^vqSNV4RJ5<0;vf; z;Ap*%{M-)LOECwhC=%RhEG}_rWKgt=`f}_xniGt#sx_Sw+;SWfx4zNXAzbet-FWn& z1e1h+iwyuj9pgo)Ht6f-3lUwDUqE4k2R{srGfclZuwitGL&Jb02DC^R-b97_8+{Q{X6yz^7st{K>R*PW#E6vH-q zAqP5x!E|wYu)s3@=?sUe+1ZC0bvp-MGHKA+aTm&8ScYK!QzZx}$&0wnqfRN?jlD$G z@Qb_33rQBI?+>FD)v7_AaJ{S3C(ECV{1R*U9JVxm-Mf%EFmLL7EX|C=TVnPMe@z@R zXw?vtcb~hAeTx9aZ0#by^w=mi=z)HLVxOg>#I!xeT5SErjOGYuLZ@Qyo`=$(Uy>ap z!{p$a3O)5Ui^n zTsnoXB6w2EXPTOPETuTCFU)wxog~TSFgzP{&W&3^YHTo?`pPyu;pt&A)~?3SN30dq zvL~&lbjl(Odl+KC()eiWqIgP@VQJt!lVY9vMs8sz(0S@N!MChHFpm1@`$>}n&EIYk z*A03Tth(fJ{BJsB9u=v64YJB33Cq(Ghi`_~gKf8>;*i>!d+B896vLAe7yAJh?C*bp;#u&N zo{<^^sy62&mNMv8D_;GbS2qc%6;C+^%)-tJ-T3%6vI?Peapj0wIDHJqWdQ0Qz6`4R zvR{UO*i|U@b#jAuo2d^=8Xu#}%NmzN?(Rv=?NPx!z7!bR!R(c`Ba}Hk^YdO`$N2_d zNLRFfkM%!%mz-`SE3UHW);&etbrC=8G#_#LO5Le$jV2nIbc@O24k1e;9!>{e6gOk@ z9>F|m7JimJ$VF=f`di+Q-zmv}8Y0QCC(=k<>3HUA`r}GyQ}pszlF%y8cGR>~Qj*ZH z@-lEe$2NuCK|Y|e>Rotq8+6x~&b<{{E3DE6{e;Up_>0??HAe98@O-LeS3dZ&I~SW_ zNqJWRVpwy8N>W8yS%Fe_di35tZrbYkdWxxruX!&ox2~NF7567RBNXPnA14(r73{cU z@tfH1y~hDGvz-emV9gMTUe}mq>H+|j;HjL%6LXX;z)8Rb_@Gbo$(Ra)k_>%>lT*5< z3p%sq_)3LwYFca-fro*Z3xlp$oT>y7QuLQ%v6sk!Wocn@5?8WYB0|TmSVFz&;&gqXVo9F_|QiDeIuJptel1x!(!uk z4cf;l#3|G?Bc5TLA-0-#<~v^TNn_KvHM(XHk@QjXE)GY=VS@y(A|M6$uI%lh zXmJ!ARF??Nwn_;tr30Nopcby6N0M;uL1!aH$>WUTTEkGN624;QrZoOR5!D(VS;Duz zhGa~~#vw`}n90`^liJpb!7%}x8^|XD>f!=AMzIjnWD3HYu4I_341`RM-CvsBiM@mb>2}x3E@l@XYd@QxAJ^g&K zPVov8kY(2wlxh5m@M;qX5yx=YeEd@Rgf>M)`bO=OFoVGG5%Jvp;>-7O=b*De7DP4&Em`o={Vai582Zs3knQ7 z@XB@626L3fw6T5%Eh`mO_CzZ6Rri?-2#Lno^4#8Xf8w=D9|s`JKtA9ONZ3jPvmf86 zy(Lg9jf3~QZryeu@7DF_H=)`{^va4MzAz?O>B6zNj~Dm}8fXnNhR!Y`6#c62a&gY< z{WfVs6}Zb@mSFNH#81ZL5w~(pd#^Dx!@rEQg01t=?YCo#m4imhn!D4}Y7)S4-0>8@ z{-uPoS72rnKubW~T1go(h3-iJ*Q>Hg)@Wu<#!;$mlz z7H%vSAy&PVfA4Il6HlN+!>8BWg7M)%tEETjrjNM!$iiF;mOk0~lNt_2m_K>YrYsw1KT+Hd3R_z9T-t_n8DhE&M_RXw@gLnOA`=1RZk2{ z?~)1toK=m}`+z(>~fqY%rjIxz@!YVFxI0d>Vjq}Lc7m?|CE^DT* zGAb~RRE2nxBeu%c$&Ifos2(~y<(E-19!kNe_!9_8W&8`*3r1QT2oRrM#6VjuBQbmj zGn+;sQR8+A-*{!!59T7!LL6-hxJUGcCPN=1QM7Vq3I|LbXfX%H#7xRJS)AN$ z$5>bZ@DP$5i;mE>zj5v>qJr?2FV5CQZR`jk5$zf*^i-?wryKvKow9jt2r*E5#EhtY zKtFqZT$s7tDN&N-1$ZWMK ztld3+Xr&Ed>vMiqrR+!;e#i&vg(HLBlCH@H>;l%z8ux2gkY_(w-7Rb8mL34kr{Vcc zrN*|g$sG72vy@TqeEkM=wy&3*tkoXJufIRcADu8zAO=4~WO_Hn?Ts2R-gxYj_6SDr zE(52c{>hfHTM_}fXlxBzJ2j?))`8CLeaIZlGBiH(7|lyFHPaJdE~5wfCo;IJ!U<*I z^`Sdd3r3KM&qUV)#I?*S^82rH1U@eGwqPtd9uf^YN_j!yR(%A#Q3IbYqSM6fa#Rb3 zY0AI)`qvKC^@Y5&BjQgCl1`tvYWqU?$<~y-%%ON{lq`K#G?d!IYe8$w_BFTDBYv(~ z+;86><_0m0;N56FihNZNXX{(ru^H@O)2sp3KcRsX6toO0DkKQR-`_7=+)$Uhd`@<4 zHTop%^JvAJ{x&h|%-L|nn`l=|V>!w8FGVAlPCdyNF51FrtoT|V%8DLrVUo_d6Cvwc zf02&o(qWc`6;DLqVi5-E>VjWVKQZSoJrR-l+LF?tIH{G(|4Ow_BLiv@c*6!dGe-3@ zTb!rXc#povNs#19=vSZgJO`;g!jwtuBmB9)5pUvkCLIZBeoNXEkf``tTQc>MBk(lP zK7z6p8|jSWZW3QU5S3VZ1BAPvEI_T0Hi=j73lvAf1W@bE*J`?UZBI^08ALVteE-NIk??herjNT z=YX;vbtMPIs1eDOUQfW6Wy^Gm~o+q z+baKYDJ)o9uOD7kk|@dG{;aPsTfC~(n2e*@SUB&g9LIc#sRZ&SM> zv8_o4E)d7Jv3a@rwf2O)p1ZChRZiAR$uuUeO&Vg?mA9wmwe!t=;(*gBCyHtgqyIY9 z3CX_H3(7AeQz2U=*xDoK*Fq)tW(Jrc`NO6zic8suq-f?0nxu7S11<& zNfXG*t50`IeEz~t2s-0+_x);K5wWQL`}M}JpJ!5F4pAsfYBPJul~yrv<~Ha-->>1M z=v|WJyf4pfswq#n9_=j$C`O@JiEGm}MMXarkZlu*#{`7$!8tI&KIN+ml5o5EDgz;YG{!Z-cj72m&%f-*opRNih za>S-R(n6&?%cTuf(i|Dng2nM#B})49Yhv7i?Gyj+zu8?8Jw>$-$k4AKshod+lQ>OT z2HwZ^f2~{2b7!k6Qc62^hj&L&c6chH;%x3VlbpXk!3;xpsTPJL;K|}8uaSR&+4%CM z?OK6+$P|oGRN^3^+(5O{l1Lr9eJH<#ZWI%cnphie>q--t;9WRXY>+zR0W(*UYQHS& zlAu`aVqx)#{xbz%so$?JCZE{N>o<$`9r52ts!y+0w|r4iF302{KA$ucjuV9gBcZKo zO&-hj{Udrb5b3--;;fp?iLWP~f6bsSZ=EQnd?1McB;ZCE3E>HE7t-)QzwJEgRG0q%_=R&f<+Vet!SsjVy`o=4p$M3l~Yz z?dzev65M)CGYl`lA{5qoV8cB=xhX-h_p1Dh zpXC;Xl5h_igyoDSNP<(FD;8oO6t&onbg5ATcc@?cJ_Y(yh;TXN>m}1XeV}U2XF97C zXS=%*igA2iHN>o7visj0DOFzJxJ}IZz+mON5?QpI7t~waBR!e3&U}RPx6XXtQdkK!Ppei4Jxonh&P+jiOS_^`UwGV<1axR_=;r zcaaUf=gOjQ(TDDdRynRp7oBJpVCtJ4FYC+VT7yr}Ph7dihd2n+g z17$Y$6Ka_M7^j8j&B+l_WHQ84HdGbN3I4u$pix%b3T%6kkSYeB3qAJqT1XG*yH$WV z+gyOH|1esV6OxMnb#k!n>P7diNhwH38SQn)1dnl%IM+%{z2}%D6V9#1ZNR5DA(&c* ztLUH`ceg#Q2y(J@()lZXOu$JIlcJ{xRY4P2SD|xL5ubKz7e5Uq^dy|Dib%?{YRL*c z4}&h?ze?IXa{%rne<`%Eb%@v5#bVK?K^>Y(TWL7A7tXN~uzZFFhD32py~b1 zuqM+VEWHviHfe6a@>3e!h+Q!2dNG!Rn8qC8W$Cki)=WqK{ozsJ*@8u)Pt17+$zN&T zhTZ>+U6MH~Toe!TA>6u_-vR#O+-OuF1~TD3sxVXMOZf}XnU?SUj3q?N)vATMtZXY8BS{DN;u)+6!lU%dZ0GEomy!J1mMu)W}|F9@!W&y z+kK7jx8-Ew@NY30WgA%@^;|bEbHy4M{^4ZV7g0F-rUMeKY7L&ZmS!fwk?}ECW(Afk zFFr4V9Br(o)N6JiS+UQCMhy|U&3!L;F>G|J7jsPKPpt_7;36SysLTKx^+Lf9!espv z_97RJU-T5gS~uO{^69foey24p%TqY<5U+sL&KitsN_N1;UZMWOr6ClZNT8Es|J*+Y zX7+lH1t{Iol-%p0KqS}Aj2nko3bmk@PxbGbf4nP6F^+4jq3Iv6_PdukkUZ(6Pdd9o zth#E>&BIpIaHZgG|8=g#E5zO?M(7A7qB-t^S#VLSLv9UL;9=(VpOh4hwv5W78AafBh;DafOvc3hpd=Zx}`McEQOQuM9kO4 zB9peJN!{210kvYi(NHC#QhddEgzFWGl|xDY1Lfnfhd}!k%XI&e_m+6h)}RVWzb1Hy zfyuh_8lb=%&s25~zu_=Y_A=->)Sq!LH@_srO5;+y{sD}qEWVH?U2xPJZwq$SCv|@EQyGM1SzL@K~eZ+>=xV_st)d z8}BNrhf}|NF|6K%vQRG!MQT`^bNf??41Y3qC^5t?;!3C?y_LvpR!ajv6!q1)Zx9J( zQ9nBnNs(0(l$0_7!FEw&dmDg7;lN3 z^$O?kK}H!pi`GcAC2ES zk)P$ff>R!B%5uE}6(PGwbgSC1J*WbAV{NlZ)krokKe0yez}~TNSC;ZzYzK@)*RP3Y z9ZI2Wfa7!zi+H%T`7w}~0MG9~ve+||$X{Cw-p}HdNl=Ua<28pZE-GU&7qT|8t1Ecd zP@33BZ0{)lkZP#=uHe+e`gpP*?o`C&*xMcOSYhN6~#PZuq4osQbqDw{a20pczl+a9W;TL(Z$ljHOJN)a2Uwa2`SeY57IicqF zPcZyS@|>UYwPy7S?!JW$>{@0d4Gc5V8zNw+DeLgpCw=|(ZrE#NFMr`RXpK#E74=8K z{JFEqukjxk7Vel>&!OQ)k#a*+gG^6x;F-9T(`l|q@!XgT*ewE{jUm4Fw8m`z~ z3YwwrO`>);Z0QI6HcaHXVRIL;yl|0q?bvYYxQ|5ZY!@~>uqH;uq0NkAU|k32g9K7d z4{`{8PeM*gwQn_>JW&oJn4%F4K3Gcsk+&rw?1*d;k;m-KBHplTSUow_5}u(Ndc_^6 zu4k9R#WTpgWpW*AzHcW@J|mEcsl&8N9r1Sq3n)+qK`s`rSNC7R-=Z~krbnYZ;*z`%~M@k7v= z!VzES4IQgmy;&#(qG5)cYt06{xxZrWz8_(v_&$sj0PaEh5S(#kTL(NO!KMdZnoqXp znrWD+k8R^~u3}+P)c^gz0J(>i^Sey*H*$)1Gaq)x-hhJhgYF$#*L4`5IQ_2T#|Or0 zH4(_-ey5K-maX)!yGKjP0VX6DvfOxWHlKOM0c_SNhPg+>cn&xAJ{PfADx@Dad^u_P zDrpz{axQ7;nD92MNp;LVW=x*~IH1u)B^&pv%f1^Ymtxh!1&NmN!!A~2<}HF`Ekg<* zC))FmjfQ2xaZn3=h)_tOhH(^2f9XZwomX9+*#K_!3+}SmN8zbjUMx`xgxA9$Od2?> zk4kl&Y$u&u^h00;j4W1PiXW1i=0$uUq>L&%pA)l|!IWOmyi*wowT-@(!8$5kD~$%n zT4s?klBkb8f!sz!Ijoi4UT{?AV#+#X?FJJq_D@6UnPyyE=0AEC!2Dxho>7Jq$bMe_ zwx*xM{3b*fI?JN!&FzdC9lO0hPddL>eG{+<)(vMrz5s zK-3>zpF0{%ffFAO3zx&LKr1zmwx|Oe@UFwNYVRZ8v1lm=%9?WEak$--Cgk{r1qC7S$)vwiS`^StwURY0PTl3U z_*AHABDGPz8p<+=4qKVPq{iF=%9El@4_>sim%wniA#@2Rgo+!Ut%?O$;LKTSp5ASr zwz$uON0m$mChHA)4eGAzE{zJxI)8XhNgNkccbV-zSc7ykXVv^R?ei%q#+ONoKM#zL zlp1v_SdJl0xqG}Dsua4GL1!bV;NIhvrBdoQbAl*eVbbz;LZr?ucSS7jv_=z)EZGGd zTH89NyIxf%Tq&v?J=}?BZ3VdU{C@#b4XyIK^#nn;VP4en8xH#8pH3+`(31(TkYbSV=qJiywIk z=8eW3SH7NwV4m4-FZ68uxCQPhm}dd~K71^b%CS}mW_F^azvAzaTA`q|m=aGzvpX;* z^DzD^aCJM=Hpz1z?uq9|%Uh-PPt>T~ZqahJSxqdayxp?B77q$DGRWy9SQSWo^SGC4Aea z&bw{myg$itj0N!3oks8NiFlrl?*mITsec*V5Pvgn#BSyp^B-WLs(%9weCDZu)0_OP zh9_~o22T(@PZQ@KjlY1;#X}t$J^$T#t~Z{)sorsJFZepooBcMLxyFwIKg0)8Gqj*# zK|Jy9iNO8YJ=2JetAJ58j(uyL{a&p4ciycHf2Kay!u>h8y^be(-x>E79ND6_S#fWi zui#a#9&eM*3xU~6yv8%&bM7(zs9kDpV+tQ zXG-ETZJs#qQB~hxgS775#5Et>?!w0&i?#S0*ctc-jX#?Q+P{HCE4qdwfTNqxJOLlO z{Rq!KBRq`ae41&JG%%03b8IGlPC7R(F7$B_z94_f?d;;?V9=bH}-*4jg@$9&#(!k$2 z@X1muT#Dzj=$Z<(W;PDkUDDn70JqV1*%bK8cthYflHOp_YyLc*qhK!Fn`-Vs|J_Qi ziqn9vSr>%;nb|Y)f)5u1>o&OiLinHsV4|c4@%Pr_eEgj?7GLd~756?EcxTOl-xqVX z@DY9meA^;dOR1RI1=%X`;dsT_RzfRA;S-8o2M#akX*>!1Gx#8Va5LPvJYCkN&)R(W zO8v|&Xc>-sf$y5xRc$_QUCg~AHpLeUc4=_;Iq+(k2LMQV9KSao;^X(`>-aSsI-Z;z zSOGU+H_L^<7c6p+HI12_An6I*3!<5K(h6BST+*}n{q)?B_B>vIV)URkSGM1Z%CmsQ@I*rf8 z@4yXR9pMe1*)&ebyvj}@9a5iSxvU*H@DGyS6vl3q2 zwd&tQyW2BlML8q|;%=R<0x2qNt1l@pn+42=|53NpQB0d3G)XWaG z>@)ZZdTIHF3gk6BL~T(sJHsljlxof)xH0m^Dz)U`QvBXLsoUQ>orIaaW@h^XOW|I> zoy@?(`{HJHZq;H2V`hH^*1~gGb|M!7%bVFPRSW3_vU%;6c%uAH^fn)ZM{wvGke+0_P_^@w^prZ2ruIpU%GqWv$^~hhcy$mh^mNm28%dh{hM zB6=*99(u5nP!dZs$qdKQri2V<%<5-fdRo%eD4-S$07(ZWJ%dx@tI6)@VkWH}>g4_203fs1J7$r0ccV4|ee)qZnbP*Cki+Ky{hJdf+WwiKYDKyj(DCY>6@J2 zrJx@qH6&hOJN$sYGU`A4X?V+GSm$-FM85Rwi^T8>pe;Z zWd9$fJ63i0Ow!469~cq!*w8ISi=@BH?WaedH{*2G zQXCr!Q8N)S2787}aZpm;9^p`;@zJo6F}aXr3REyXEGc}E~$ zA|fW>=!N+>l3_%Ok3R%##QWB_X&k&GVj5N*>x~W-wO=wPS&!!f3$Q_*rtQ-kNAbG3 z1=y@1kQUt=5mAR#*&fHy5~EUl{2y4H;bUN{`l<6W5C&im>`(<%Ym;%B(#N0tD(O(# z{bof(Gyu!6V9`vjUKOr4nt%9_!=R zr;{wEiV+cWfMF$meZE#4TM;oF??X$0#aK--4bI{Wk9Byylogy35qDvyNGbM9YA>gc zv`Ov_7U4Z<5#=l8o&|Pc#nBzWwsQBPC>%VsK}6h+H?&#!V(1R6Xfu-D7wJx{(sB}L z#q|mH;7#o3!n0RUP(37u>+GaW#Rr%=JimKNMW4dyeBE0sut`Ix&R8Xhh#Rpg=0jM{ zethzC98k}dWBxCeaX*fY*_}yiPUAp06p4uIu;XMF-n+WK*CX-8RBwl~4qWT(IMBl7 zJ!?<38F&TRkk~$xaC&c7yB9kaMgTYU@$rk;DR?SrZCH@#r{w1WRcURcN)r)xb9rt~ z$KzQC+(z$NCKvGBJb}lqiNvm~<+Pw{nTQyNZI1EyOfkMk>uqkG!{>^_xYpdhr2UYF z!@ZV>h+FXCehxn1*LQ1mTseYoxE0T%zS>1>AGUXEf8jB0N;{b8KMFIhj+7+~)Bpeg07*qo IM6N<$f_5Wd#{d8T delta 5549 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 diff --git a/img/titles/llvm.png b/img/titles/llvm.png new file mode 100644 index 0000000000000000000000000000000000000000..a5cbfe48b4541d4add96cb499d596cc093fbff16 GIT binary patch literal 5009 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 Mp@l)CzU$Nf1N9eg&j0`b literal 0 HcmV?d00001 diff --git a/img/titles/parsing.png b/img/titles/parsing.png index 60389d2f2f73e1e202f2aec3da03de4d18af79c8..ec2a2a71dbcbfe66a267cc3343123432669f40d6 100644 GIT binary patch literal 10042 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 delta 2869 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 diff --git a/img/titles/systemf.png b/img/titles/systemf.png new file mode 100644 index 0000000000000000000000000000000000000000..0623cff3574d7fa02b071c690e3a75cd052bf3ac GIT binary patch literal 12266 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

*;v}47JR}vF#`q`}A$~<$ZSoVrb*0Q#% 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 Ns&A@SujBgU{{We5>;M1& literal 0 HcmV?d00001 diff --git a/img/titles/type_systems.png b/img/titles/type_systems.png index 81df3943f962b2c34cb9332f32f722c8d8c3f3bc..6125b9948f9eebb1debc9834a1325571b30cec2c 100644 GIT binary patch literal 19659 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 Qq4YYNCUTzXgf(v!o+SLqZ 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 Q=dckT|F}}"]; + Node0x175c3c0:s0 -> Node0x1758a20; + Node0x175c3c0:s1 -> Node0x1758b40; + Node0x1758a20 [shape=record,label="{left: \l %plusOne = add i32 0, 1\l br label %merge\l}"]; + Node0x1758a20 -> Node0x17593e0; + Node0x1758b40 [shape=record,label="{right: \l br label %merge\l}"]; + Node0x1758b40 -> Node0x17593e0; + Node0x17593e0 [shape=record,label="{merge: \l %join = phi i32 [ %plusOne, %left ], [ -1, %right ]\l ret i32 %join\l}"]; +} diff --git a/chapter27/cfg/phi.ll b/chapter27/cfg/phi.ll new file mode 100644 index 0000000..92666e6 --- /dev/null +++ b/chapter27/cfg/phi.ll @@ -0,0 +1,12 @@ +define i32 @foo() { +start: + br i1 true, label %left, label %right +left: + %plusOne = add i32 0, 1 + br label %merge +right: + br label %merge +merge: + %join = phi i32 [ %plusOne, %left], [ -1, %right] + ret i32 %join +} diff --git a/chapter27/cfg/phi.png b/chapter27/cfg/phi.png new file mode 100644 index 0000000000000000000000000000000000000000..ee0b6a0102d1fa4d343d1fb6d1d9839c0599ff85 GIT binary patch literal 15250 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 G!2badPpRAh literal 0 HcmV?d00001 diff --git a/chapter27/cfg/ret.dot b/chapter27/cfg/ret.dot new file mode 100644 index 0000000..8fdc2a5 --- /dev/null +++ b/chapter27/cfg/ret.dot @@ -0,0 +1,6 @@ +digraph "CFG for 'foo' function" { + graph [ dpi = 72 ]; + + label="Return"; + Node0x259a2b0 [shape=record,label="{%0:\l ret i1 false\l}"]; +} diff --git a/chapter27/cfg/ret.ll b/chapter27/cfg/ret.ll new file mode 100644 index 0000000..fcb04a8 --- /dev/null +++ b/chapter27/cfg/ret.ll @@ -0,0 +1,4 @@ +define i1 @foo() { + ret i1 0 +} + diff --git a/chapter27/cfg/ret.png b/chapter27/cfg/ret.png new file mode 100644 index 0000000000000000000000000000000000000000..c29142c00142e2b7caac99e33f0149cceb1485bc GIT binary patch literal 2167 zcmV--2#EKIP)CR*MQUjUI6Sn5chDQ9&sLQv%JP z=s_jRQcw(65~58LS0O1O6-|3sD*2EiNg2&Qa%I`fha~6J!l!LMja}XS{c-4icjq?e z_j{N9=)V3K=bn9b?&rMEIiGva`3xgT5?FrWu+a|uS+H`@VCA6UM3u_R%O@r#Hqe!g zg3IM*WMrT+Muk!g!-|TEHqNUJBPS>49}$e@_&c96#vNy42MtyZ8mt^NoYpo00Dyb< z?sa!}Yc!g3=gx(Ng`rA=!H}7mdE>?n7Z(@GOrcQdbh_y1=p#pt*u`bLLjJ+pVBO`Tnb$j;gq3XqAaZgVVb=lb1n3$M|$^wC)x3||)gMSpp9k*$*D3wZrAUr)i zH*enj?b|oh#HUZ6Fbq3z-~eS-P*9MVn25?TF){y_k8QIenV{3@e0_c8a(Q)iwLl<1 zH5nNh27`gJnVFfvFzmyJ59qR~sfo+wj*gD*+O^Br><`4a<2J<(7Z;cI_V&8EItK@b z+S*zG5Q#)tSy@V@QX-K!Iy$DOr;m+|ktFHu?Tvoo;o&hcG2!XydGh2*48!a;noMI> zB-`}Vzk`&KL#r=+BO{`?sLW@cuPO?!L0lamu;BWO=xy|Kd>wOZZU z+IsBRvBAN?-rnATfPlSw_e!PGZQHgXIgpuFtL1XJOpe=cVcl{R6&2;=+5e|eR4c`@+2xMio@XmfWN;#hr<~g8&fKkd_Et; zu*}TN`uchRAW5>Vt?lyV%L@w&d3kwuaoj$vV+%JnHdb9-edWp(s-~f#p|P=1qtWE% z<^~1^0zh$b@!Z_p($Z3RczA4V?C9udR8*8gq4<-dsd2~I9WA?~wG1l<4OR{szgrHK zO6BkGZ+nm$A0HPAg^`hw2?+^$z25k%#l=ODNW|mu=I7@b^Uv(dnf=h~^^YDsB1v+2 zdHLbPhyMQlb8~Z6?8Cys1_uYVTJ8S*`-g{zO`1YG2J0=X2~7mEwf_;ZSiGi-{r&yd zuV1&`8I?)}02+r@yQZ0+pPxV=ux>LxJ`Mm54i=qc{B>p> za?H)m6&4oqc)XgL8ZR%ep`jsEuU4xwGBR>0=IYil!Ufgp&I zk`gYLi&ndpegc3@CcAa(761r^!kU_zYuBz_ym&DxDyp!s(5(HXOP9``JsTMrSyEE6 z+Og*5W}7-`cFveZuh&0*{1^agYil1octFkJ`1ttd=4O&4TU%Q_JUm)jTEM~tHW&=g zpFgL*mC0n5ED@B!;NT#JVOp)Wxw#p~aq0lY*Z=^Ahli)9r_0L9%sMtZJGR4V23`ThO!IM_-m55q8DUtinrNU>wbj+ZZAIy*bR zfB&8!2)$lUoz5a$U0od<9L}6MQ(ax1kdR=>F|^yVhV8S%?0EL{^Z>xXz4-fyx zHdmw3Xkuey^Yio3?N;;S$B&4Jh_7G2^7;JJr%(TD$Nr5RD=RBh+1uMYIy(C5)vKkY zr5zm|`T6;~ckc#(+1c5Ffq~V(rAEW#)5?tqf>0`z^YinQlaq3}8~{c}Miv$pj9d8r z{rmm<_kDbP^7Hf2<7TyE+qZ9DyKiRaj9D}q&H3}^0YE4euB@z3^*?|9jEjqNcXtm8 z3i|Tpi%zEt2?;rP@L*qGpGgbL%gb3=SpZN~RW&j)g7W62rKM`MdiCv8Dpg8K3IG%o z6buawg@%Uu`S~?8G;lbayu3V;Bo`MKFI>0)05@;m?Ck7xb#=|o&Q3~7s;{p%>zFNz zh27w@8+^;Ka?oJqpux&PgO!5@D+dkQo(1KT{$~D>qoSfhqtR@jD;q^cMFmysCJ zbXsSU^-!zTR7OT3k))=kVi<-_0MpacF$|lWoHS1B$mR0l;$j|;*VEGz9v<%Q?p|40 z$-KwRs%tzuK7RbjvmVCA#_2^=)@rrJX`PvwnHMi!0Ko0rx0jZdL?V&5 zw>PuSlk3W}*p5gf>gec@$z%-;4KXn>U_&~_IK7C|Uc^Q)N z{U?KQNTE<9B_#nsZf>qzE+def|0|1|2}}"]; + Node0x1027390:s0 -> Node0x1024700; + Node0x1027390:s1 -> Node0x1024300; + Node0x1027390:s2 -> Node0x1024440; + Node0x1027390:s3 -> Node0x1023920; + Node0x1024300 [shape=record,label="{f: \l ret i32 1\l}"]; + Node0x1024440 [shape=record,label="{g: \l ret i32 2\l}"]; + Node0x1023920 [shape=record,label="{h: \l ret i32 3\l}"]; + Node0x1024700 [shape=record,label="{default: \l ret i32 0\l}"]; +} diff --git a/chapter27/cfg/switch.ll b/chapter27/cfg/switch.ll new file mode 100644 index 0000000..2f91ab8 --- /dev/null +++ b/chapter27/cfg/switch.ll @@ -0,0 +1,14 @@ +define i32 @foo(i32 %a) { +entry: + switch i32 %a, label %default [ i32 0, label %f + i32 1, label %g + i32 2, label %h ] +f: + ret i32 1 +g: + ret i32 2 +h: + ret i32 3 +default: + ret i32 0 +} diff --git a/chapter27/cfg/switch.png b/chapter27/cfg/switch.png new file mode 100644 index 0000000000000000000000000000000000000000..b53ed6c2c72e27c27363ff311f945e79481d9c1a GIT binary patch literal 11837 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 literal 0 HcmV?d00001 diff --git a/chapter27/dsl/Codegen.hs b/chapter27/dsl/Codegen.hs new file mode 100644 index 0000000..3874c96 --- /dev/null +++ b/chapter27/dsl/Codegen.hs @@ -0,0 +1,281 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} + +module Codegen where + +import Data.Word +import Data.String +import Data.List +import Data.Function +import qualified Data.Map as Map + +import Control.Monad.State +import Control.Applicative + +import LLVM.General.AST +import LLVM.General.AST.Global +import qualified LLVM.General.AST as AST + +import qualified LLVM.General.AST.Constant as C +import qualified LLVM.General.AST.Attribute as A +import qualified LLVM.General.AST.CallingConvention as CC +import qualified LLVM.General.AST.FloatingPointPredicate as FP + +------------------------------------------------------------------------------- +-- Module Level +------------------------------------------------------------------------------- + +newtype LLVM a = LLVM { unLLVM :: State AST.Module a } + deriving (Functor, Applicative, Monad, MonadState AST.Module ) + +runLLVM :: AST.Module -> LLVM a -> AST.Module +runLLVM = flip (execState . unLLVM) + +emptyModule :: String -> AST.Module +emptyModule label = defaultModule { moduleName = label } + +addDefn :: Definition -> LLVM () +addDefn d = do + defs <- gets moduleDefinitions + modify $ \s -> s { moduleDefinitions = defs ++ [d] } + +define :: Type -> String -> [(Type, Name)] -> Codegen a -> LLVM () +define retty label argtys body = addDefn $ + GlobalDefinition $ functionDefaults { + name = Name label + , parameters = ([Parameter ty nm [] | (ty, nm) <- argtys], False) + , returnType = retty + , basicBlocks = bls + } + where + bls = createBlocks $ execCodegen $ do + enter <- addBlock entryBlockName + void $ setBlock enter + body + +external :: Type -> String -> [(Type, Name)] -> LLVM () +external retty label argtys = addDefn $ + GlobalDefinition $ functionDefaults { + name = Name label + , parameters = ([Parameter ty nm [] | (ty, nm) <- argtys], False) + , returnType = retty + , basicBlocks = [] + } + +--------------------------------------------------------------------------------- +-- Types +------------------------------------------------------------------------------- + +-- IEEE 754 double +double :: Type +double = FloatingPointType 64 IEEE + +------------------------------------------------------------------------------- +-- Names +------------------------------------------------------------------------------- + +type Names = Map.Map String Int + +uniqueName :: String -> Names -> (String, Names) +uniqueName nm ns = + case Map.lookup nm ns of + Nothing -> (nm, Map.insert nm 1 ns) + Just ix -> (nm ++ show ix, Map.insert nm (ix+1) ns) + +instance IsString Name where + fromString = Name . fromString + +------------------------------------------------------------------------------- +-- Codegen State +------------------------------------------------------------------------------- + +type SymbolTable = [(String, Operand)] + +data CodegenState + = CodegenState { + currentBlock :: Name -- Name of the active block to append to + , blocks :: Map.Map Name BlockState -- Blocks for function + , symtab :: SymbolTable -- Function scope symbol table + , blockCount :: Int -- Count of basic blocks + , count :: Word -- Count of unnamed instructions + , names :: Names -- Name Supply + } deriving Show + +data BlockState + = BlockState { + idx :: Int -- Block index + , stack :: [Named Instruction] -- Stack of instructions + , term :: Maybe (Named Terminator) -- Block terminator + } deriving Show + +------------------------------------------------------------------------------- +-- Codegen Operations +------------------------------------------------------------------------------- + +newtype Codegen a = Codegen { runCodegen :: State CodegenState a } + deriving (Functor, Applicative, Monad, MonadState CodegenState ) + +sortBlocks :: [(Name, BlockState)] -> [(Name, BlockState)] +sortBlocks = sortBy (compare `on` (idx . snd)) + +createBlocks :: CodegenState -> [BasicBlock] +createBlocks m = map makeBlock $ sortBlocks $ Map.toList (blocks m) + +makeBlock :: (Name, BlockState) -> BasicBlock +makeBlock (l, (BlockState _ s t)) = BasicBlock l s (maketerm t) + where + maketerm (Just x) = x + maketerm Nothing = error $ "Block has no terminator: " ++ (show l) + +entryBlockName :: String +entryBlockName = "entry" + +emptyBlock :: Int -> BlockState +emptyBlock i = BlockState i [] Nothing + +emptyCodegen :: CodegenState +emptyCodegen = CodegenState (Name entryBlockName) Map.empty [] 1 0 Map.empty + +execCodegen :: Codegen a -> CodegenState +execCodegen m = execState (runCodegen m) emptyCodegen + +fresh :: Codegen Word +fresh = do + i <- gets count + modify $ \s -> s { count = 1 + i } + return $ i + 1 + +instr :: Instruction -> Codegen (Operand) +instr ins = do + n <- fresh + let ref = (UnName n) + blk <- current + let i = stack blk + modifyBlock (blk { stack = i ++ [ref := ins] } ) + return $ local ref + +terminator :: Named Terminator -> Codegen (Named Terminator) +terminator trm = do + blk <- current + modifyBlock (blk { term = Just trm }) + return trm + +------------------------------------------------------------------------------- +-- Block Stack +------------------------------------------------------------------------------- + +entry :: Codegen Name +entry = gets currentBlock + +addBlock :: String -> Codegen Name +addBlock bname = do + bls <- gets blocks + ix <- gets blockCount + nms <- gets names + let new = emptyBlock ix + (qname, supply) = uniqueName bname nms + modify $ \s -> s { blocks = Map.insert (Name qname) new bls + , blockCount = ix + 1 + , names = supply + } + return (Name qname) + +setBlock :: Name -> Codegen Name +setBlock bname = do + modify $ \s -> s { currentBlock = bname } + return bname + +getBlock :: Codegen Name +getBlock = gets currentBlock + +modifyBlock :: BlockState -> Codegen () +modifyBlock new = do + active <- gets currentBlock + modify $ \s -> s { blocks = Map.insert active new (blocks s) } + +current :: Codegen BlockState +current = do + c <- gets currentBlock + blks <- gets blocks + case Map.lookup c blks of + Just x -> return x + Nothing -> error $ "No such block: " ++ show c + +------------------------------------------------------------------------------- +-- Symbol Table +------------------------------------------------------------------------------- + +assign :: String -> Operand -> Codegen () +assign var x = do + lcls <- gets symtab + modify $ \s -> s { symtab = [(var, x)] ++ lcls } + +getvar :: String -> Codegen Operand +getvar var = do + syms <- gets symtab + case lookup var syms of + Just x -> return x + Nothing -> error $ "Local variable not in scope: " ++ show var + +------------------------------------------------------------------------------- + +-- References +local :: Name -> Operand +local = LocalReference + +global :: Name -> C.Constant +global = C.GlobalReference + +externf :: Name -> Operand +externf = ConstantOperand . C.GlobalReference + +-- Arithmetic and Constants +fadd :: Operand -> Operand -> Codegen Operand +fadd a b = instr $ FAdd a b [] + +fsub :: Operand -> Operand -> Codegen Operand +fsub a b = instr $ FSub a b [] + +fmul :: Operand -> Operand -> Codegen Operand +fmul a b = instr $ FMul a b [] + +fdiv :: Operand -> Operand -> Codegen Operand +fdiv a b = instr $ FDiv a b [] + +fcmp :: FP.FloatingPointPredicate -> Operand -> Operand -> Codegen Operand +fcmp cond a b = instr $ FCmp cond a b [] + +cons :: C.Constant -> Operand +cons = ConstantOperand + +uitofp :: Type -> Operand -> Codegen Operand +uitofp ty a = instr $ UIToFP a ty [] + +toArgs :: [Operand] -> [(Operand, [A.ParameterAttribute])] +toArgs = map (\x -> (x, [])) + +-- Effects +call :: Operand -> [Operand] -> Codegen Operand +call fn args = instr $ Call False CC.C [] (Right fn) (toArgs args) [] [] + +alloca :: Type -> Codegen Operand +alloca ty = instr $ Alloca ty Nothing 0 [] + +store :: Operand -> Operand -> Codegen Operand +store ptr val = instr $ Store False ptr val Nothing 0 [] + +load :: Operand -> Codegen Operand +load ptr = instr $ Load False ptr Nothing 0 [] + +-- Control Flow +br :: Name -> Codegen (Named Terminator) +br val = terminator $ Do $ Br val [] + +cbr :: Operand -> Name -> Name -> Codegen (Named Terminator) +cbr cond tr fl = terminator $ Do $ CondBr cond tr fl [] + +phi :: Type -> [(Operand, Name)] -> Codegen Operand +phi ty incoming = instr $ Phi ty incoming [] + +ret :: Operand -> Codegen (Named Terminator) +ret val = terminator $ Do $ Ret (Just val) [] diff --git a/chapter27/dsl/JIT.hs b/chapter27/dsl/JIT.hs new file mode 100644 index 0000000..7b5a51a --- /dev/null +++ b/chapter27/dsl/JIT.hs @@ -0,0 +1,58 @@ +module JIT where + +import Data.Int +import Data.Word +import Foreign.Ptr ( FunPtr, castFunPtr ) + +import Control.Monad.Error + +import LLVM.General.Target +import LLVM.General.Context +import LLVM.General.CodeModel +import LLVM.General.Module as Mod +import qualified LLVM.General.AST as AST + +import LLVM.General.PassManager +import LLVM.General.Transforms +import LLVM.General.Analysis + +import qualified LLVM.General.ExecutionEngine as EE + +foreign import ccall "dynamic" haskFun :: FunPtr (IO Double) -> (IO Double) + +run :: FunPtr a -> IO Double +run fn = haskFun (castFunPtr fn :: FunPtr (IO Double)) + +jit :: Context -> (EE.MCJIT -> IO a) -> IO a +jit c = EE.withMCJIT c optlevel model ptrelim fastins + where + optlevel = Just 0 -- optimization level + model = Nothing -- code model ( Default ) + ptrelim = Nothing -- frame pointer elimination + fastins = Nothing -- fast instruction selection + +passes :: PassSetSpec +passes = defaultCuratedPassSetSpec { optLevel = Just 3 } + +runJIT :: AST.Module -> IO (Either String AST.Module) +runJIT mod = do + withContext $ \context -> + jit context $ \executionEngine -> + runErrorT $ withModuleFromAST context mod $ \m -> + withPassManager passes $ \pm -> do + -- Optimization Pass + {-runPassManager pm m-} + optmod <- moduleAST m + s <- moduleLLVMAssembly m + putStrLn s + + EE.withModuleInEngine executionEngine m $ \ee -> do + mainfn <- EE.getFunction ee (AST.Name "main") + case mainfn of + Just fn -> do + res <- run fn + putStrLn $ "Evaluated to: " ++ show res + Nothing -> return () + + -- Return the optimized module + return optmod diff --git a/chapter27/dsl/Main.hs b/chapter27/dsl/Main.hs new file mode 100644 index 0000000..81ad7d3 --- /dev/null +++ b/chapter27/dsl/Main.hs @@ -0,0 +1,32 @@ +import JIT +import Codegen +import qualified LLVM.General.AST as AST +import qualified LLVM.General.AST.Float as F +import qualified LLVM.General.AST.Constant as C + +{- + +; ModuleID = 'my cool jit' + +define double @main() { +entry: + %1 = fadd double 1.000000e+01, 2.000000e+01 + ret double %1 +} + +-} + +initModule :: AST.Module +initModule = emptyModule "my cool jit" + +logic = do + define double "main" [] $ do + let a = cons $ C.Float (F.Double 10) + let b = cons $ C.Float (F.Double 20) + res <- fadd a b + ret res + +main = do + let ast = runLLVM initModule logic + runJIT ast + return ast diff --git a/chapter27/dsl/dsl.cabal b/chapter27/dsl/dsl.cabal new file mode 100644 index 0000000..d6632e6 --- /dev/null +++ b/chapter27/dsl/dsl.cabal @@ -0,0 +1,22 @@ +name: dsl +version: 0.1.0.0 +--synopsis: +--description: +license: MIT +license-file: LICENSE-MIT +author: Stephen Diehl +maintainer: stephen.m.diehl@gmail.com +copyright: 2015 Stephen Diehl +Category: Compilers +build-type: Simple +cabal-version: >=1.10 + +library + default-language: Haskell2010 + build-depends: + base >= 4.6 + , haskeline >= 0.7.1.2 + , llvm-general == 3.4.4.* + , llvm-general-pure == 3.4.4.* + , mtl >= 2.2 + , transformers diff --git a/chapter27/example.cpp b/chapter27/example.cpp new file mode 100644 index 0000000..cb2dd08 --- /dev/null +++ b/chapter27/example.cpp @@ -0,0 +1,93 @@ +// Generated by llvm2cpp - DO NOT MODIFY! + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace llvm; + +Module* makeLLVMModule(); + +int main(int argc, char**argv) { + Module* Mod = makeLLVMModule(); + verifyModule(*Mod, PrintMessageAction); + PassManager PM; + PM.add(createPrintModulePass(&outs())); + PM.run(*Mod); + return 0; +} + + +Module* makeLLVMModule() { + // Module Construction + Module* mod = new Module("example.ll", getGlobalContext()); + + // Type Definitions + std::vectorFuncTy_0_args; + FuncTy_0_args.push_back(IntegerType::get(mod->getContext(), 32)); + FuncTy_0_args.push_back(IntegerType::get(mod->getContext(), 32)); + FuncTy_0_args.push_back(IntegerType::get(mod->getContext(), 32)); + FunctionType* FuncTy_0 = FunctionType::get( + /*Result=*/IntegerType::get(mod->getContext(), 32), + /*Params=*/FuncTy_0_args, + /*isVarArg=*/false); + + + // Function Declarations + + Function* func_test1 = mod->getFunction("test1"); + if (!func_test1) { + func_test1 = Function::Create( + /*Type=*/FuncTy_0, + /*Linkage=*/GlobalValue::ExternalLinkage, + /*Name=*/"test1", mod); + func_test1->setCallingConv(CallingConv::C); + } + AttrListPtr func_test1_PAL; + func_test1->setAttributes(func_test1_PAL); + + // Global Variable Declarations + + + // Constant Definitions + + // Global Variable Definitions + + // Function Definitions + + // Function: test1 (func_test1) + { + Function::arg_iterator args = func_test1->arg_begin(); + Value* int32_x = args++; + int32_x->setName("x"); + Value* int32_y = args++; + int32_y->setName("y"); + Value* int32_z = args++; + int32_z->setName("z"); + + BasicBlock* label_1 = BasicBlock::Create(mod->getContext(), "",func_test1,0); + + // Block (label_1) + BinaryOperator* int32_a = BinaryOperator::Create(Instruction::And, int32_z, int32_x, "a", label_1); + BinaryOperator* int32_b = BinaryOperator::Create(Instruction::And, int32_z, int32_y, "b", label_1); + BinaryOperator* int32_c = BinaryOperator::Create(Instruction::Xor, int32_a, int32_b, "c", label_1); + ReturnInst::Create(mod->getContext(), int32_c, label_1); + + } + + return mod; +} diff --git a/chapter27/example.ll b/chapter27/example.ll new file mode 100644 index 0000000..4290f67 --- /dev/null +++ b/chapter27/example.ll @@ -0,0 +1,6 @@ +define i32 @test1(i32 %x, i32 %y, i32 %z) { + %a = and i32 %z, %x + %b = and i32 %z, %y + %c = xor i32 %a, %b + ret i32 %c +} diff --git a/chapter5/stlc/Main.hs b/chapter5/stlc/Main.hs index 7af67ae..fa2e0e6 100644 --- a/chapter5/stlc/Main.hs +++ b/chapter5/stlc/Main.hs @@ -22,7 +22,7 @@ main :: IO () main = runInputT defaultSettings loop where loop = do - minput <- getInputLine "Stlc> " + minput <- getInputLine "Happy> " case minput of Nothing -> outputStrLn "Goodbye." Just input -> (liftIO $ process input) >> loop diff --git a/chapter9/assign/.gitignore b/chapter9/assign/.gitignore new file mode 100644 index 0000000..1b8952b --- /dev/null +++ b/chapter9/assign/.gitignore @@ -0,0 +1,3 @@ +Lexer.hs +Parser.hs +Main diff --git a/chapter9/assign/Eval.hs b/chapter9/assign/Eval.hs new file mode 100644 index 0000000..d33b233 --- /dev/null +++ b/chapter9/assign/Eval.hs @@ -0,0 +1,34 @@ +module Eval (eval) where + +import Syntax +import Control.Monad.State +import qualified Data.Map as Map + +data Value + = VInt Int + | VUnit + +instance Show Value where + show (VInt x) = show x + +type Eval = StateT Env IO +type Env = [(String, Value)] + +eval1 :: Expr -> Eval Value +eval1 expr = case expr of + Num a -> return (VInt a) + Var a -> do + env <- get + case lookup a env of + Just val -> return val + Nothing -> error "Not in scope" + Print a -> do + a' <- eval1 a + liftIO $ print a' + return VUnit + Assign ref val -> do + modify $ \s -> (ref, VInt val) : s + return VUnit + +eval :: [Expr] -> IO () +eval xs = evalStateT (mapM_ eval1 xs) [] diff --git a/chapter9/assign/Lexer.x b/chapter9/assign/Lexer.x new file mode 100644 index 0000000..0337f3e --- /dev/null +++ b/chapter9/assign/Lexer.x @@ -0,0 +1,38 @@ +{ +module Lexer ( + Token(..), + scanTokens +) where + +import Syntax +} + +%wrapper "basic" + +$digit = 0-9 +$alpha = [a-zA-Z] +$eol = [\n] + +tokens :- + + -- Whitespace insensitive + $eol ; + $white+ ; + print { \s -> TokenPrint } + $digit+ { \s -> TokenNum (read s) } + \= { \s -> TokenEq } + $alpha [$alpha $digit \_ \']* { \s -> TokenSym s } + +{ + +data Token + = TokenNum Int + | TokenSym String + | TokenPrint + | TokenEq + | TokenEOF + deriving (Eq,Show) + +scanTokens = alexScanTokens + +} diff --git a/chapter9/assign/Main.hs b/chapter9/assign/Main.hs new file mode 100644 index 0000000..a7a498a --- /dev/null +++ b/chapter9/assign/Main.hs @@ -0,0 +1,21 @@ +import Eval (eval) +import Parser (parseExpr) +import System.Environment + +process :: String -> IO () +process input = do + let ast = parseExpr input + case ast of + Right ast -> eval ast + Left err -> do + putStrLn "Parser Error:" + print err + +main :: IO () +main = do + args <- getArgs + case args of + [] -> putStrLn "Usage: assign " + [fname] -> do + contents <- readFile fname + process contents diff --git a/chapter9/assign/Makefile b/chapter9/assign/Makefile new file mode 100644 index 0000000..83ab200 --- /dev/null +++ b/chapter9/assign/Makefile @@ -0,0 +1,6 @@ +all: + alex Lexer.x + happy Parser.y + ghc --make Main -o Main +clean: + rm -f *.o *.hi Parser.hs Lexer.hs Main diff --git a/chapter9/assign/Parser.y b/chapter9/assign/Parser.y new file mode 100644 index 0000000..d39965c --- /dev/null +++ b/chapter9/assign/Parser.y @@ -0,0 +1,46 @@ +{ +{-# LANGUAGE GeneralizedNewtypeDeriving #-} + +module Parser ( + parseExpr, +) where + +import Lexer +import Syntax + +import Control.Monad.Except +} + +%name expr +%tokentype { Token } +%monad { Except String } { (>>=) } { return } +%error { parseError } + +%token + int { TokenNum $$ } + var { TokenSym $$ } + print { TokenPrint } + '=' { TokenEq } + +%% + +terms + : term { [$1] } + | term terms { $1 : $2 } + +term + : var { Var $1 } + | var '=' int { Assign $1 $3 } + | print term { Print $2 } + +{ + +parseError :: [Token] -> Except String a +parseError (l:ls) = throwError (show l) +parseError [] = throwError "Unexpected end of Input" + +parseExpr :: String -> Either String [Expr] +parseExpr input = + let tokenStream = scanTokens input in + runExcept (expr tokenStream) +} diff --git a/chapter9/assign/Syntax.hs b/chapter9/assign/Syntax.hs new file mode 100644 index 0000000..9881101 --- /dev/null +++ b/chapter9/assign/Syntax.hs @@ -0,0 +1,8 @@ +module Syntax where + +data Expr + = Var String + | Num Int + | Print Expr + | Assign String Int + deriving (Eq,Show) diff --git a/chapter9/assign/happy.cabal b/chapter9/assign/happy.cabal new file mode 100644 index 0000000..ed65d8d --- /dev/null +++ b/chapter9/assign/happy.cabal @@ -0,0 +1,19 @@ +name: assign +version: 0.1.0.0 +build-type: Simple +extra-source-files: README.md +cabal-version: >=1.10 + +executable assign + build-depends: + base >= 4.6 && <4.7 + , containers >= 0.5 && <0.6 + , mtl >= 2.2 + default-language: Haskell2010 + main-is: Main.hs + + Build-depends: base, array + build-tools: alex, happy + other-modules: + Parser, + Lexer diff --git a/chapter9/assign/input.test b/chapter9/assign/input.test new file mode 100644 index 0000000..2b1a3ca --- /dev/null +++ b/chapter9/assign/input.test @@ -0,0 +1,6 @@ +x = 4 +print x +y = 5 +print y +y = 6 +print y diff --git a/chapter9/happy/.gitignore b/chapter9/happy/.gitignore new file mode 100644 index 0000000..1b8952b --- /dev/null +++ b/chapter9/happy/.gitignore @@ -0,0 +1,3 @@ +Lexer.hs +Parser.hs +Main diff --git a/chapter9/happy/Eval.hs b/chapter9/happy/Eval.hs new file mode 100644 index 0000000..1cb4615 --- /dev/null +++ b/chapter9/happy/Eval.hs @@ -0,0 +1,52 @@ +module Eval where +import Syntax + +import Control.Monad.Identity +import qualified Data.Map as Map + +data Value + = VInt Integer + | VBool Bool + | VClosure String Expr (Eval.Scope) + +instance Show Value where + show (VInt x) = show x + show (VBool x) = show x + show VClosure{} = "<>" + +type Evaluate t = Identity t +type Scope = Map.Map String Value + +eval :: Eval.Scope -> Expr -> Identity Value +eval env expr = case expr of + Lit (LInt x) -> return $ VInt (fromIntegral x) + Lit (LBool x) -> return $ VBool x + Var x -> return $ env Map.! x + Lam x body -> return (VClosure x body env) + App a b -> do + x <- eval env a + y <- eval env b + apply x y + Op op a b -> do + x <- eval env a + y <- eval env b + return $ binop op x y + +binop :: Binop -> Value -> Value -> Value +binop Add (VInt a) (VInt b) = VInt (a+b) +binop Sub (VInt a) (VInt b) = VInt (a-b) +binop Mul (VInt a) (VInt b) = VInt (a*b) +binop Eql (VInt a) (VInt b) = VBool (a==b) + +extend :: Scope -> String -> Value -> Scope +extend env v t = Map.insert v t env + +apply :: Value -> Value -> Evaluate Value +apply (VClosure v t0 e) t1 = eval (extend e v t1) t0 +apply _ _ = error "Tried to apply closure" + +emptyScope :: Scope +emptyScope = Map.empty + +runEval :: Expr -> Value +runEval x = runIdentity (eval emptyScope x) diff --git a/chapter9/happy/Lexer.x b/chapter9/happy/Lexer.x new file mode 100644 index 0000000..8414bc3 --- /dev/null +++ b/chapter9/happy/Lexer.x @@ -0,0 +1,63 @@ +{ +module Lexer ( + Token(..), + scanTokens +) where + +import Syntax +} + +%wrapper "basic" + +$digit = 0-9 +$alpha = [a-zA-Z] +$eol = [\n] + +tokens :- + + -- Whitespace insensitive + $eol ; + $white+ ; + + -- Comments + "#".* ; + + -- Syntax + let { \s -> TokenLet } + True { \s -> TokenTrue } + False { \s -> TokenFalse } + in { \s -> TokenIn } + $digit+ { \s -> TokenNum (read s) } + "->" { \s -> TokenArrow } + \= { \s -> TokenEq } + \\ { \s -> TokenLambda } + [\+] { \s -> TokenAdd } + [\-] { \s -> TokenSub } + [\*] { \s -> TokenMul } + \( { \s -> TokenLParen } + \) { \s -> TokenRParen } + $alpha [$alpha $digit \_ \']* { \s -> TokenSym s } + +{ + +data Token + = TokenLet + | TokenTrue + | TokenFalse + | TokenIn + | TokenLambda + | TokenNum Int + | TokenSym String + | TokenArrow + | TokenEq + | TokenAdd + | TokenSub + | TokenMul + | TokenLParen + | TokenRParen + | TokenEOF + deriving (Eq,Show) + +scanTokens = alexScanTokens + +} diff --git a/chapter9/happy/Main.hs b/chapter9/happy/Main.hs new file mode 100644 index 0000000..d4834f3 --- /dev/null +++ b/chapter9/happy/Main.hs @@ -0,0 +1,25 @@ +import Eval +import Parser (parseExpr, parseTokens) + +import Control.Monad.Trans +import System.Console.Haskeline + +process :: String -> IO () +process input = do + let tokens = parseTokens input + print tokens + let ast = parseExpr input + case ast of + Left err -> do + putStrLn "Parser Error:" + print err + Right ast -> print $ runEval ast + +main :: IO () +main = runInputT defaultSettings loop + where + loop = do + minput <- getInputLine "Happy> " + case minput of + Nothing -> outputStrLn "Goodbye." + Just input -> (liftIO $ process input) >> loop diff --git a/chapter9/happy/Makefile b/chapter9/happy/Makefile new file mode 100644 index 0000000..83ab200 --- /dev/null +++ b/chapter9/happy/Makefile @@ -0,0 +1,6 @@ +all: + alex Lexer.x + happy Parser.y + ghc --make Main -o Main +clean: + rm -f *.o *.hi Parser.hs Lexer.hs Main diff --git a/chapter9/happy/Parser.y b/chapter9/happy/Parser.y new file mode 100644 index 0000000..da837ca --- /dev/null +++ b/chapter9/happy/Parser.y @@ -0,0 +1,83 @@ +{ +{-# LANGUAGE GeneralizedNewtypeDeriving #-} + +module Parser ( + parseExpr, + parseTokens, +) where + +import Lexer +import Syntax + +import Control.Monad.Except + +} + +-- Entry point +%name expr + +-- Entry point +%name expr + +-- Lexer structure +%tokentype { Token } + +-- Parser monad +%monad { Except String } { (>>=) } { return } +%error { parseError } + +-- Token Names +%token + let { TokenLet } + true { TokenTrue } + false { TokenFalse } + in { TokenIn } + NUM { TokenNum $$ } + VAR { TokenSym $$ } + '\\' { TokenLambda } + '->' { TokenArrow } + '=' { TokenEq } + '+' { TokenAdd } + '-' { TokenSub } + '*' { TokenMul } + '(' { TokenLParen } + ')' { TokenRParen } + +-- Operators +%left '+' '-' +%left '*' +%% + +Expr : let VAR '=' Expr in Expr { App (Lam $2 $6) $4 } + | '\\' VAR '->' Expr { Lam $2 $4 } + | Form { $1 } + +Form : Form '+' Form { Op Add $1 $3 } + | Form '-' Form { Op Sub $1 $3 } + | Form '*' Form { Op Mul $1 $3 } + | Fact { $1 } + +Fact : Fact Atom { App $1 $2 } + | Atom { $1 } + +Atom : '(' Expr ')' { $2 } + | NUM { Lit (LInt $1) } + | VAR { Var $1 } + | true { Lit (LBool True) } + | false { Lit (LBool True) } + +{ + +parseError :: [Token] -> Except String a +parseError (l:ls) = throwError (show l) +parseError [] = throwError "Unexpected end of Input" + +parseExpr :: String -> Either String Expr +parseExpr input = + let tokenStream = scanTokens input in + runExcept (expr tokenStream) + +parseTokens :: String -> [Token] +parseTokens = scanTokens + +} diff --git a/chapter9/happy/Syntax.hs b/chapter9/happy/Syntax.hs new file mode 100644 index 0000000..6316009 --- /dev/null +++ b/chapter9/happy/Syntax.hs @@ -0,0 +1,19 @@ +module Syntax where + +type Name = String + +data Expr + = Lam Name Expr + | App Expr Expr + | Var Name + | Lit Lit + | Op Binop Expr Expr + deriving (Eq,Show) + +data Lit + = LInt Int + | LBool Bool + deriving (Show, Eq, Ord) + +data Binop = Add | Sub | Mul | Eql + deriving (Eq, Ord, Show) diff --git a/chapter9/happy/happy.cabal b/chapter9/happy/happy.cabal new file mode 100644 index 0000000..d7072a1 --- /dev/null +++ b/chapter9/happy/happy.cabal @@ -0,0 +1,27 @@ +name: happyParser +version: 0.1.0.0 +license: MIT +license-file: LICENSE +author: Stephen Diehl +maintainer: stephen.m.diehl@gmail.com +build-type: Simple +extra-source-files: README.md +cabal-version: >=1.10 + +executable happyParser + build-depends: + base >= 4.6 && <4.7 + , pretty >= 1.1 && <1.2 + , parsec >= 3.1 && <3.2 + , containers >= 0.5 && <0.6 + , haskeline >= 0.7 + , mtl + , transformers + default-language: Haskell2010 + main-is: Main.hs + + Build-depends: base, array + build-tools: alex, happy + other-modules: + Parser, + Lexer diff --git a/chapter9/layout/Layout.hs b/chapter9/layout/Layout.hs new file mode 100644 index 0000000..18337f9 --- /dev/null +++ b/chapter9/layout/Layout.hs @@ -0,0 +1,65 @@ +{-# LANGUAGE FlexibleContexts #-} + +module Layout ( + -- * Layout combinators + IParsec, + laidout, + indented, + align, + runIndentParser, +) where + +import Data.Text.Lazy + +import Text.Parsec (ParseError) +import Text.Parsec.Pos +import Text.Parsec.Prim hiding (State) + +import Control.Monad.Identity +import Control.Applicative ((<$>)) + +-- Indentation sensitive Parsec monad. +type IParsec a = Parsec Text ParseState a + +data ParseState = ParseState + { indents :: Column + } deriving (Show) + +initParseState :: ParseState +initParseState = ParseState 0 + +indentCmp + :: (Column -> Column -> Bool) + -> IParsec () +indentCmp cmp = do + col <- sourceColumn <$> getPosition + current <- indents <$> getState + guard (col `cmp` current) + +withIndent :: Monad m =>Column-> Column -> ParsecT s ParseState m b -> ParsecT s ParseState m b +withIndent cur pos m = do + modifyState $ \st -> st { indents = pos } + res <- m + modifyState $ \st -> st { indents = cur } + return res + +laidout :: Parsec s ParseState a -> Parsec s ParseState a +laidout m = do + cur <- indents <$> getState + pos <- sourceColumn <$> getPosition + res <- withIndent cur pos m + return res + +indented :: IParsec () +indented = indentCmp (>) "Block (indented)" + +align :: IParsec () +align = indentCmp (==) "Block (same indentation)" + +runIndentParser + :: Stream Text Identity a + => SourceName + -> IParsec a + -> Text + -> Either ParseError a +runIndentParser filePath p = runParser p initParseState filePath diff --git a/chapter9/provenance/Eval.hs b/chapter9/provenance/Eval.hs new file mode 100644 index 0000000..2c9c66c --- /dev/null +++ b/chapter9/provenance/Eval.hs @@ -0,0 +1,42 @@ +module Eval where + +import Syntax + +import Control.Monad.Identity +import qualified Data.Map as Map + +data Value + = VInt Integer + | VBool Bool + | VClosure String Expr TermEnv + +type TermEnv = Map.Map String Value +type Interpreter t = Identity t + +emptyTmenv :: TermEnv +emptyTmenv = Map.empty + +instance Show Value where + show (VInt n) = show n + show (VBool n) = show n + show VClosure{} = "<>" + +eval :: TermEnv -> Expr -> Interpreter Value +eval env expr = case expr of + Var _ x -> do + let Just v = Map.lookup x env + return v + + Lam _ x body -> + return (VClosure x body env) + + App _ fun arg -> do + VClosure x body clo <- eval env fun + argv <- eval env arg + let nenv = Map.insert x argv clo + eval nenv body + +runEval :: TermEnv -> String -> Expr -> (Value, TermEnv) +runEval env nm ex = + let res = runIdentity (eval env ex) in + (res, Map.insert nm res env) diff --git a/chapter9/provenance/Infer.hs b/chapter9/provenance/Infer.hs new file mode 100644 index 0000000..cbe844c --- /dev/null +++ b/chapter9/provenance/Infer.hs @@ -0,0 +1,205 @@ +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE TypeSynonymInstances #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} + +module Infer ( + inferTop, + TypeError(..), + Env, +) where + +import Control.Monad.Except +import Control.Monad.Reader +import Control.Monad.Writer +import Control.Monad.State + +import qualified Data.Map as Map +import qualified Data.Set as Set + +import Syntax +import Type + +setLoc :: Loc -> Type -> Type +setLoc l (TVar _ a) = TVar l a +setLoc l (TCon _ a) = TCon l a +setLoc l (TArr _ a b) = TArr l a b + +getLoc :: Type -> Loc +getLoc (TVar l _) = l +getLoc (TCon l _) = l +getLoc (TArr l _ _) = l + +------------------------------------------------------------------------------- +-- Substitution +------------------------------------------------------------------------------- + +type Unifier = (Subst, [Constraint]) +type Constraint = (Type, Type) +type Env = [(Name, Type)] + +extend :: (Name, Type) -> Env -> Env +extend xt env = xt : env + +newtype Subst = Subst (Map.Map TVar Type) + deriving (Eq, Ord, Show, Monoid) + +class Substitutable a where + apply :: Subst -> a -> a + ftv :: a -> Set.Set TVar + +instance Substitutable Type where + apply _ (TCon l a) = TCon l a + apply (Subst s) t@(TVar l a) = Map.findWithDefault t a s + apply s (TArr l t1 t2) = TArr l (apply s t1) (apply s t2) + + ftv TCon{} = Set.empty + ftv (TVar _ a) = Set.singleton a + ftv (TArr _ t1 t2) = ftv t1 `Set.union` ftv t2 + +instance Substitutable Constraint where + apply s (t1, t2) = (apply s t1, apply s t2) + ftv (t1, t2) = ftv t1 `Set.union` ftv t2 + +instance Substitutable a => Substitutable [a] where + apply = map . apply + ftv = foldr (Set.union . ftv) Set.empty + +data TypeError + = UnificationFail Type Loc Type Loc + | InfiniteType TVar Type + | UnboundVariable String + | Ambigious [Constraint] + | UnificationMismatch [Type] [Type] + +------------------------------------------------------------------------------- +-- Environment +------------------------------------------------------------------------------- + +inEnv :: (Name, Type) -> Check a -> Check a +inEnv (x,t) = local (extend (x,t)) + +lookupVar :: Name -> Check Type +lookupVar x = do + env <- ask + case lookup x env of + Nothing -> throwError $ UnboundVariable x + Just s -> return s + +letters :: [String] +letters = [1..] >>= flip replicateM ['a'..'z'] + +fresh :: Loc -> Check Type +fresh l = do + s <- get + put s{count = count s + 1} + return $ TVar l (TV (letters !! count s)) + +------------------------------------------------------------------------------- +-- Type Checker +------------------------------------------------------------------------------- + +-- | Inference state +data InferState = InferState { count :: Int } +type Check = + WriterT [Constraint] + (StateT InferState + (ExceptT TypeError (Reader Env))) + +check :: Expr -> Check Type +check expr = case expr of + Var l n -> do + t <- lookupVar n + return $ setLoc l t + + App l a b -> do + ta <- check a + tb <- check b + tr <- fresh l + unify ta (TArr l tb tr) + return tr + + Lam l n a -> do + tv <- fresh l + ty <- inEnv (n, tv) (check a) + return (TArr l ty (setLoc l tv)) + + Lit l _ -> return $ TCon l "Int" + +runCheck :: Env -> Check a -> Either TypeError (a, [Constraint]) +runCheck env = + flip runReader env + . runExceptT + . flip evalStateT (InferState 0) + . runWriterT + +inferTop :: Env -> Expr -> Either TypeError Type +inferTop env x = do + (ty, cs) <- runCheck env (check x) + s <- runSolve cs + return (apply s ty) + +------------------------------------------------------------------------------- +-- Constraint Solving +------------------------------------------------------------------------------- + +type Solve = StateT Unifier (Except TypeError) + +runSolve :: [Constraint] -> Either TypeError Subst +runSolve cs = runExcept (evalStateT solver st) + where st = (emptySubst, cs) + +-- Unification solver +solver :: Solve Subst +solver = do + (su, cs) <- get + case cs of + [] -> return su + ((t1, t2): cs0) -> do + (su1, cs1) <- unifies t1 t2 + put (su1 `compose` su, cs1 ++ (apply su1 cs0)) + solver + +-- | Empty unifier +emptyUnifer :: Unifier +emptyUnifer = (emptySubst, []) + +-- | The empty substitution +emptySubst :: Subst +emptySubst = mempty + +-- | Compose substitutions +compose :: Subst -> Subst -> Subst +(Subst s1) `compose` (Subst s2) = Subst $ Map.map (apply (Subst s1)) s2 `Map.union` s1 + +bind :: TVar -> Type -> Solve Unifier +bind a t + | eqLoc t a = return (emptySubst, []) + | occursCheck a t = throwError $ InfiniteType a t + | otherwise = return $ (Subst $ Map.singleton a t, []) + +eqLoc :: Type -> TVar -> Bool +eqLoc (TVar _ a) b = a == b +eqLoc _ _ = False + +occursCheck :: Substitutable a => TVar -> a -> Bool +occursCheck a t = a `Set.member` ftv t + +unifies :: Type -> Type -> Solve Unifier +unifies t1 t2 | t1 == t2 = return emptyUnifer +unifies (TVar _ v) t = v `bind` t +unifies t (TVar _ v) = v `bind` t +unifies (TArr _ t1 t2) (TArr _ t3 t4) = unifyMany [t1, t2] [t3, t4] +unifies t1 t2 = throwError $ UnificationFail t1 (getLoc t1) t2 (getLoc t2) + +unifyMany :: [Type] -> [Type] -> Solve Unifier +unifyMany [] [] = return emptyUnifer +unifyMany (t1 : ts1) (t2 : ts2) = + do (su1,cs1) <- unifies t1 t2 + (su2,cs2) <- unifyMany (apply su1 ts1) (apply su1 ts2) + return (su2 `compose` su1, cs1 ++ cs2) +unifyMany t1 t2 = throwError $ UnificationMismatch t1 t2 + +-- | Unify two types +unify :: Type -> Type -> Check () +unify t1 t2 = tell [(t1, t2)] diff --git a/chapter9/provenance/Lexer.hs b/chapter9/provenance/Lexer.hs new file mode 100644 index 0000000..41dfc8f --- /dev/null +++ b/chapter9/provenance/Lexer.hs @@ -0,0 +1,73 @@ +module Lexer where + +import Text.Parsec +import Text.Parsec.Text.Lazy +import qualified Data.Text.Lazy as L +import qualified Text.Parsec.Token as Tok +import qualified Text.Parsec.Expr as Ex + +import Data.Functor.Identity + +type Op a = Ex.Operator L.Text () Identity a +type Operators a = Ex.OperatorTable L.Text () Identity a + +reservedNames :: [String] +reservedNames = [ + "let", + "in", + "fix", + "rec", + "if", + "then", + "else" + ] + +reservedOps :: [String] +reservedOps = [ + "->", + "\\", + "+", + "*", + "-", + "=" + ] + +lexer :: Tok.GenTokenParser L.Text () Identity +lexer = Tok.makeTokenParser $ Tok.LanguageDef + { Tok.commentStart = "{-" + , Tok.commentEnd = "-}" + , Tok.commentLine = "--" + , Tok.nestedComments = True + , Tok.identStart = letter + , Tok.identLetter = alphaNum <|> oneOf "_'" + , Tok.opStart = oneOf ":!#$%&*+./<=>?@\\^|-~" + , Tok.opLetter = oneOf ":!#$%&*+./<=>?@\\^|-~" + , Tok.reservedNames = reservedNames + , Tok.reservedOpNames = reservedOps + , Tok.caseSensitive = True + } + +reserved :: String -> Parser () +reserved = Tok.reserved lexer + +reservedOp :: String -> Parser () +reservedOp = Tok.reservedOp lexer + +identifier :: Parser String +identifier = Tok.identifier lexer + +parens :: Parser a -> Parser a +parens = Tok.parens lexer + +semiSep :: Parser a -> Parser [a] +semiSep = Tok.semiSep lexer + +semi :: Parser String +semi = Tok.semi lexer + +contents :: Parser a -> Parser a +contents p = do + Tok.whiteSpace lexer + r <- p + eof + return r diff --git a/chapter9/provenance/Main.hs b/chapter9/provenance/Main.hs new file mode 100644 index 0000000..553a006 --- /dev/null +++ b/chapter9/provenance/Main.hs @@ -0,0 +1,149 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE TypeSynonymInstances #-} + +import Syntax +import Infer +import Parser +import Pretty + +import Data.Monoid +import qualified Data.Map as Map +import qualified Data.Text.Lazy as L +import qualified Data.Text.Lazy.IO as L + +import Control.Monad.Identity +import Control.Monad.State.Strict + +import Data.List (isPrefixOf) + +import System.Exit +import System.Environment +import System.Console.Repline + +------------------------------------------------------------------------------- +-- Types +------------------------------------------------------------------------------- + +data IState = IState + { tyctx :: Env -- Type environment + } + +initState :: IState +initState = IState [] + +type Repl a = HaskelineT (StateT IState IO) a + +hoistErr :: Show e => Either e a -> Repl a +hoistErr (Right val) = return val +hoistErr (Left err) = do + liftIO $ print err + abort + +------------------------------------------------------------------------------- +-- Execution +------------------------------------------------------------------------------- + +exec :: Bool -> L.Text -> Repl () +exec update source = do + -- Get the current interpreter state + st <- get + + -- Parser ( returns AST ) + mod <- hoistErr $ parseExpr source + + -- Type Inference ( returns Typing Environment ) + tyctx' <- hoistErr $ inferTop (tyctx st) mod + liftIO $ putStrLn (pptype tyctx') + return () + +showOutput :: String -> IState -> Repl () +showOutput arg st = do + case lookup "it" (tyctx st) of + Just val -> liftIO $ putStrLn $ ppsignature (arg, val) + Nothing -> return () + +cmd :: String -> Repl () +cmd source = exec True (L.pack source) + +------------------------------------------------------------------------------- +-- Commands +------------------------------------------------------------------------------- + +-- :browse command +browse :: [String] -> Repl () +browse _ = do + st <- get + undefined + {-liftIO $ mapM_ putStrLn $ ppenv (tyctx st)-} + +-- :load command +load :: [String] -> Repl () +load args = do + contents <- liftIO $ L.readFile (unwords args) + exec True contents + +-- :type command +typeof :: [String] -> Repl () +typeof args = do + st <- get + let arg = unwords args + case lookup arg (tyctx st) of + Just val -> liftIO $ putStrLn $ ppsignature (arg, val) + Nothing -> exec False (L.pack arg) + +-- :quit command +quit :: a -> Repl () +quit _ = liftIO $ exitSuccess + +------------------------------------------------------------------------------- +-- Interactive Shell +------------------------------------------------------------------------------- + +-- Prefix tab completer +defaultMatcher :: MonadIO m => [(String, CompletionFunc m)] +defaultMatcher = [ + (":load" , fileCompleter) + --, (":type" , values) + ] + +-- Default tab completer +comp :: (Monad m, MonadState IState m) => WordCompleter m +comp n = do + let cmds = [":load", ":type", ":browse", ":quit"] + ctx <- gets tyctx + let defs = fmap fst ctx + return $ filter (isPrefixOf n) (cmds ++ defs) + +options :: [(String, [String] -> Repl ())] +options = [ + ("load" , load) + , ("browse" , browse) + , ("quit" , quit) + , ("type" , Main.typeof) + ] + +------------------------------------------------------------------------------- +-- Entry Point +------------------------------------------------------------------------------- + +completer :: CompleterStyle (StateT IState IO) +completer = Prefix (wordCompleter comp) defaultMatcher + +shell :: Repl a -> IO () +shell pre = flip evalStateT initState + $ evalRepl "Poly> " cmd options completer pre + +------------------------------------------------------------------------------- +-- Toplevel +------------------------------------------------------------------------------- + +main :: IO () +main = do + args <- getArgs + case args of + [] -> shell (return ()) + [fname] -> shell (load [fname]) + ["test", fname] -> shell (load [fname] >> browse [] >> quit ()) + _ -> putStrLn "invalid arguments" diff --git a/chapter9/provenance/Parser.hs b/chapter9/provenance/Parser.hs new file mode 100644 index 0000000..c3ed8f0 --- /dev/null +++ b/chapter9/provenance/Parser.hs @@ -0,0 +1,77 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Parser ( + parseExpr, + parseModule +) where + +import Text.Parsec +import Text.Parsec.Text.Lazy (Parser) + +import qualified Text.Parsec.Expr as Ex +import qualified Text.Parsec.Token as Tok + +import qualified Data.Text.Lazy as L + +import Lexer +import Syntax + +import Control.Applicative ((<$>)) + +integer :: Parser Integer +integer = Tok.integer lexer + +variable :: Parser Expr +variable = do + x <- identifier + l <- sourceLine <$> getPosition + return (Var (Located l) x) + +number :: Parser Expr +number = do + n <- integer + l <- sourceLine <$> getPosition + return (Lit (Located l) (fromIntegral n)) + +lambda :: Parser Expr +lambda = do + reservedOp "\\" + args <- many identifier + reservedOp "->" + body <- expr + l <- sourceLine <$> getPosition + return $ foldr (Lam (Located l)) body args + +aexp :: Parser Expr +aexp = parens expr + <|> lambda + <|> number + <|> variable + +expr :: Parser Expr +expr = do + es <- many1 aexp + l <- sourceLine <$> getPosition + return (foldl1 (App (Located l)) es) + +type Binding = (String, Expr) + +val :: Parser Binding +val = do + ex <- expr + return ("it", ex) + +top :: Parser Binding +top = do + x <- val + optional semi + return x + +modl :: Parser [Binding] +modl = many top + +parseExpr :: L.Text -> Either ParseError Expr +parseExpr input = parse (contents expr) "" input + +parseModule :: FilePath -> L.Text -> Either ParseError [(String, Expr)] +parseModule fname input = parse (contents modl) fname input diff --git a/chapter9/provenance/Pretty.hs b/chapter9/provenance/Pretty.hs new file mode 100644 index 0000000..9db1e3d --- /dev/null +++ b/chapter9/provenance/Pretty.hs @@ -0,0 +1,82 @@ +{-# Language FlexibleInstances #-} +{-# LANGUAGE OverloadedStrings #-} +{-# Language TypeSynonymInstances #-} + +module Pretty ( + ppdecl, + ppexpr, + ppsignature, + pptype +) where + +import Type +import Syntax +import Infer + +import Text.PrettyPrint + +parensIf :: Bool -> Doc -> Doc +parensIf True = parens +parensIf False = id + +class Pretty p where + ppr :: Int -> p -> Doc + pp :: p -> Doc + pp = ppr 0 + +instance Pretty Name where + ppr _ x = text x + +instance Pretty TVar where + ppr _ (TV x) = text x + +instance Pretty Type where + ppr p (TArr _ a b) = (parensIf (isArrow a) (ppr p a)) <+> text "->" <+> ppr p b + where + isArrow TArr{} = True + isArrow _ = False + ppr p (TVar _ a) = ppr p a + ppr _ (TCon _ a) = text a + +instance Pretty Expr where + ppr p (Var _ a) = ppr p a + ppr p (App _ a b) = parensIf (p > 0) $ ppr (p+1) a <+> ppr p b + ppr p (Lam _ a b) = text "\\" <> ppr p a <+> text "->" <+> ppr p b + ppr _ (Lit _ a) = int a + +instance Pretty Loc where + ppr p (NoLoc) = "" + ppr p (Located n) = int n + +instance Show TypeError where + show (UnificationFail a la b lb) = + concat [ + "Cannot unify types: \n\t" + , pptype a + , "\n\tIntroduced at: " + , (pploc la) + , "\nwith \n\t" + , pptype b + , "\n\tIntroduced at: " + , (pploc lb) + ] + show (InfiniteType (TV a) b) = + concat ["Cannot construct the the infinite type: ", a, " = ", pptype b] + show (Ambigious cs) = + concat ["Cannot not match expected type: '" ++ pptype a ++ "' with actual type: '" ++ pptype b ++ "'\n" | (a,b) <- cs] + show (UnboundVariable a) = "Not in scope: " ++ a + +pploc :: Loc -> String +pploc = render . ppr 0 + +pptype :: Type -> String +pptype = render . ppr 0 + +ppexpr :: Expr -> String +ppexpr = render . ppr 0 + +ppsignature :: (String, Type) -> String +ppsignature (a, b) = a ++ " : " ++ pptype b + +ppdecl :: (String, Expr) -> String +ppdecl (a, b) = "let " ++ a ++ " = " ++ ppexpr b diff --git a/chapter9/provenance/Syntax.hs b/chapter9/provenance/Syntax.hs new file mode 100644 index 0000000..360dfb6 --- /dev/null +++ b/chapter9/provenance/Syntax.hs @@ -0,0 +1,15 @@ +module Syntax ( + Expr(..), + Name, + Loc(..), +) where + +type Name = String +data Loc = NoLoc | Located Int + deriving (Show, Eq, Ord) + +data Expr + = Var Loc Name + | App Loc Expr Expr + | Lam Loc Name Expr + | Lit Loc Int diff --git a/chapter9/provenance/Type.hs b/chapter9/provenance/Type.hs new file mode 100644 index 0000000..bc723af --- /dev/null +++ b/chapter9/provenance/Type.hs @@ -0,0 +1,15 @@ +module Type ( + Type(..), + TVar(..), +) where + +import Syntax (Loc, Name) + +data Type + = TVar Loc TVar + | TCon Loc Name + | TArr Loc Type Type + deriving (Show, Eq, Ord) + +newtype TVar = TV String + deriving (Show, Eq, Ord) diff --git a/contributing.md b/contributing.md index c70523c..21491aa 100644 --- a/contributing.md +++ b/contributing.md @@ -1,3 +1,6 @@ +Contributing +============ + As always, I rely on the perpetual kindness and goodwill of Haskellers (like you!) to help correct grammar, clarify, and fix errors. @@ -11,6 +14,10 @@ repo and then submit a pull request on Github. There should be no need to compile the text locally. I will try to merge the changes quickly and rebuild the text daily. +If you would like to add your name to +[CONTRIBUTORS.md](https://github.com/sdiehl/write-you-a-haskell/blob/master/CONTRIBUTORS.md) +submit this along with your pull request. + *Complex Fixes* If you'd like to submit a change to the publishing software around the text, @@ -59,6 +66,28 @@ syntax highlighting. *Math Typesetting* +Equations can be included in display form: + +```latex +$$ +\int_\Omega \mathrm{d}\omega = \oint_{\partial \Omega} \omega +$$ +``` + +$$ +\int_\Omega \mathrm{d}\omega = \oint_{\partial \Omega} \omega +$$ + +Or in inline form (like $a^2 + b^2 = c^2$) with single dollar signs. Specially +there must be no spaces around the dollar signs otherwise Pandoc will not parse +it properly. + +```latex +$a^2 + b^2 = c^2$ +``` + +For most definitions, the ``aligned`` block is used: + ```latex $$ \begin{aligned} @@ -105,7 +134,7 @@ Typography LaTeX ----- -The $\latex$ styling is sourced from the ``template.latex`` file, which is an +The LaTeX styling is sourced from the ``template.latex`` file, which is an extension of Pandoc's default template with some custom modifications. Images diff --git a/css/style.css b/css/style.css index 2b3543e..cb218e3 100644 --- a/css/style.css +++ b/css/style.css @@ -23,6 +23,18 @@ pre code { font: 15px/19px Inconsolata, Monaco,"Lucida Console",Terminal,"Courier New",Courier; } +.figure { + text-align: center; +} + +.pagetitle .figure { + text-align: left !important; +} + +.pagetitle .figure img { + height: 36px; +} + table th { border-right: 1em solid transparent; } diff --git a/img/Haskell-Logo.ps b/img/Haskell-Logo.ps new file mode 100644 index 0000000..2faae74 --- /dev/null +++ b/img/Haskell-Logo.ps @@ -0,0 +1,96 @@ +%!PS-Adobe-3.0 +%%Creator: cairo 1.10.2 (http://cairographics.org) +%%CreationDate: Wed Jan 14 11:07:43 2015 +%%Pages: 1 +%%BoundingBox: 0 0 490 349 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%DocumentMedia: 173x123mm 490 348 0 () () +%%EndComments +%%BeginProlog +/languagelevel where +{ pop languagelevel } { 1 } ifelse +2 lt { /Helvetica findfont 12 scalefont setfont 50 500 moveto + (This print job requires a PostScript Language Level 2 printer.) show + showpage quit } if +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%Page: 1 1 +%%BeginPageSetup +%%PageMedia: 173x123mm +%%PageBoundingBox: 0 0 490 349 +%%EndPageSetup +q 0 0 490 349 rectclip q +1 g +8 w +0 J +1 j +[] 0.0 d +4 M q 1 0 0 -1 0 348.156311 cm +4.016 344.156 m 117.402 174.078 l 4.016 4 l 89.055 4 l 202.441 174.078 +l 89.055 344.156 l h +4.016 344.156 m S Q +q 1 0 0 -1 0 348.156311 cm +117.402 344.156 m 230.789 174.078 l 117.402 4 l 202.441 4 l 429.211 +344.156 l 344.172 344.156 l 273.309 237.859 l 202.441 344.156 l h +117.402 344.156 m S Q +q 1 0 0 -1 0 348.156311 cm +391.418 244.945 m 353.625 188.254 l 485.906 188.25 l 485.906 244.945 l +h +391.418 244.945 m S Q +q 1 0 0 -1 0 348.156311 cm +334.727 159.906 m 296.93 103.215 l 485.906 103.211 l 485.906 159.906 l +h +334.727 159.906 m S Q +Q Q +showpage +%%Trailer +%%EOF diff --git a/img/lambda.png b/img/lambda.png index 2b1807abd52b37328aa297627c474e2b6c9eb484..5eb59b8772e73099a2960fa9279099541b859f26 100644 GIT binary patch literal 20237 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 literal 4640 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 C-KatU diff --git a/img/pipeline1.dot b/img/pipeline1.dot index e638ceb..2df9dcd 100644 --- a/img/pipeline1.dot +++ b/img/pipeline1.dot @@ -1,4 +1,5 @@ digraph G { + graph [ dpi = 300 ]; rankdir=LR node [shape=box] Source -> Parsing -> Desugar -> "Type Checking" -> Transformation -> Compilation diff --git a/img/pipeline1.png b/img/pipeline1.png index 98210905055d9a2a6992cc3618ae04796df2eb3a..0f6e4ef8022e8891a7475f0a0c5eea55981b11f3 100644 GIT binary patch literal 24280 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 literal 6723 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 MQ%zSDrD7HGKTq;UA^-pY diff --git a/img/pipeline2.dot b/img/pipeline2.dot index 7e35b49..13d70bc 100644 --- a/img/pipeline2.dot +++ b/img/pipeline2.dot @@ -1,4 +1,5 @@ digraph G { + graph [ dpi = 300 ]; rankdir=LR node [shape=box] Frontend -> "Core Language" -> "Compiler IR" -> "Machine Code" diff --git a/img/pipeline2.png b/img/pipeline2.png index ead3172f77a4393a79ac8804b16493a975694ea8..e26403f062f313c8f424655c5866a9ba0839bc41 100644 GIT binary patch literal 19370 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 Parsing -> Desugar -> Inference -> Transformation -> Compliation diff --git a/img/proto_pass.dot b/img/proto_pass.dot index 962d4bb..cf9b57f 100644 --- a/img/proto_pass.dot +++ b/img/proto_pass.dot @@ -1,4 +1,5 @@ digraph G { + graph [ dpi = 300 ]; rankdir=LR node [shape=box] Parse -> Rename -> Typecheck -> Desugar -> ToCore -> Evaluate diff --git a/img/proto_pass.png b/img/proto_pass.png index 02b4d92609224fffddb5a8a9f3ecf82fac88f7c6..e12ad0aa6fd4bcfa26279e64049e705a38a1b07b 100644 GIT binary patch literal 23184 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 C*;rZt literal 6501 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 Frontend -> Core -> PHOAS diff --git a/img/protohaskell.png b/img/protohaskell.png index 3ce1add92ca47c8087efdbdc026a5ced568dbdd3..025858340c0b5334a6177d88e7aca9b9fc9b52fb 100644 GIT binary patch literal 15385 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