Project Based Learning (A.I).pptx detail explanation
Compiling fµn language
1. FµN
FROM DEFINITION TO EXECUTION
20 septembre 2017
Software Craftsmanship Toulouse
&@dplaindoux @fcabestre
1
LIV
E
CO
D
E
LIV
E
CO
D
E
LIV
E
CO
D
E
LIV
E
CO
D
E
LIV
E
CO
D
E
FµN
inside
3. LANGUAGE GRAMMAR
LL(1)?
exp ::= sexp sexp*
sexp ::= { (IDENT+ ->)? exp } -- à la Swift or Kotlin
| ( exp? )
| $ exp -- Infix application
| IDENT
| NUMBER
| STRING
| native STRING
def ::= def IDENT sexp
| exp
s0 ::= def*
3
4. SYNTAX HIGHLIGHTS
a (b (c d)) ≡ a $ b $ c d In x Application
{ a -> { b -> ... } } ≡ { a b -> ... } Curri ed form
{ a -> f a } ≡ { f _ } Implicit argument
{ f a } ≢ ( f a ) Abstraction vs. Application
{ a -> { b -> f a } } ≢ { { f _ } } Implicit variable scope
4
5. EXAMPLE :: FACTORIAL
def leq { l r t f in native "leq" } // l <= r ? t : f
def mult { l r -> native "mult" }
def minus { l r -> native "minus" }
def cond { c t f -> c t f () }
def fact { a ->
cond (leq a 1)
{ _ -> 1 }
{ _ -> mult a (fact (minus a 1)) }
}
fact 12
5
6. EXAMPLE :: FACTORIAL CONT'D
def leq { l r t f -> native "leq" } // l <= r ? t : f
def mult { l r -> native "mult" }
def minus { l r -> native "minus" }
def cond { c t f -> c t f () }
def fact { a ->
cond (leq a 1)
{ 1 }
{ mult a $ fact $ minus a 1 }
}
fact 12
6
7. EXAMPLE :: DSL
def do { f -> then () f }
def then { v f -> { v c -> c v } $ f v }
def yield { v f -> f v }
do { plus 20 2 }
then { minus _ 1 }
yield { mult _ 2 } // 42
7
15. ADVANCED INTERPRETER
No β-reduction based on term subtitution
Application interpretation is not tail recursive
type Result = NUMBER | STRING | (AstDB,Env)
and Env = List Result
[_] :: AstDB → Env → Result
[AstDB.constant(c)]e = c
[AstDB.variable(i)]e = e[i]
[AstDB.abstraction(b)]e = (b,e)
[AstDB.application(a,b)]e = [c]d::e' when [a]e =* (c,e')
and [b]e =* d
15
20. EXECUTION PROCESS :: CORE
type Result = NUMBER | STRING | (Objcode,Env)
and Env = List Result
and Stack = List (Result | Env | Objcode)
[_] :: Objcode → Env → Stack → Result
[Objcode.constant(n);c]e s = [c]e n::s
[Objcode.access(i);c]e s = [c]e e[i]::s
[Objcode.closure(c');c]e s = [c]e (c',e)::s
[Objcode.apply;c]e v::(c',e')::s = [c']v::e' c::e::s
[Objcode.returns;c]e v::c'::e'::s = [c']e' v::s
...
20
21. EXECUTION PROCESS :: EXTENSION
...
definition :: String -> Result
native :: String -> Env -> Result
[Objcode.ident(n);c]e s = [c]e (definition n)::s
[Objcode.native(n);c]e s = [c]e (native n e)::s
21