forked from avsm/EpiVM
-
Notifications
You must be signed in to change notification settings - Fork 10
/
language.tex
93 lines (79 loc) · 2.98 KB
/
language.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
\section{The Epic Language}
\subsection{Definitions}
\newcommand{\Con}[2]{\DC{Con}\:#1(#2)}
\FFIG{
\AR{
\begin{array}{rcll}\\
\VV{def} & ::= & \vx\vec{(\vx\Hab\vT)} \rightarrow \vT = \vt &
\mbox{(Top level definition)} \\
\\
\vt & ::= & \vx & \mbox{(Variable)} \\
& \mid & \vt(\ttt) & \mbox{(Function application)} \\
& \mid & \lam{\vx}{\vT}\SC\vt & \mbox{(Lambda binding)} \\
& \mid & \RW{let}\:\vx\Hab\vT\:=\:\vt\:\RW{in}\:\vt & \mbox{(Let
binding)} \\
& \mid & \Con{\vi}{\ttt} & \mbox{(Constructor application)} \\
& \mid & \vt ! \vi & \mbox{(Argument projection)} \\
& \mid & \vt\:\VV{op}\:\vt & \mbox{(Infix operator)} \\
& \mid & \RW{if}\:\vt\:\RW{then}\:\vt\:\RW{else}\:\vt & \mbox{(Conditional)}\\
& \mid & \RW{case}\:\vt\:\RW{of}\:\vec{\VV{alt}} & \mbox{(Case expressions)}\\
& \mid & \RW{lazy}(\vt) & \mbox{(Lazy evaluation)} \\
& \mid & \RW{effect}(\vt) & \mbox{(Evaluate an effectful term)} \\
& \mid & \RW{while}(\vt,\vt) & \mbox{(While loops)} \\
& \mid & \RW{foreign}\:\vT\:\VV{str}\:\vec{(\vt\Hab\vT)} & \mbox{(Foreign call)} \\
& \mid & \vi \mid \vf \mid \vc \mid \vb \mid \VV{str} & \mbox{(Constants)} \\
\\
\VV{alt} & ::= &
\Con{\vi}{\tx} \cq \vt & \mbox{(Constructors)}\\
& \mid & \vi \cq \vt & \mbox{(Integer constants)} \\
& \mid & \RW{default} \cq \vt & \mbox{(Match anything)} \\
\end{array}
\medskip
\\
\begin{array}{rcll}
\VV{op} & ::= & + \mid - \mid \times \mid / \mid\:
==\: \mid \:<\: \mid \:\le\: \mid \:>\: \mid \:\ge \\
\end{array}
\medskip
\\
\begin{array}{rcll}
\vx & ::= & \mbox{Variable name} \\
\vi & ::= & \mbox{Integer literal} \\
\vf & ::= & \mbox{Floating point literal} \\
\vc & ::= & \mbox{Character literal} \\
\vb & ::= & \mbox{Boolean literal} \: \DC{True} \mid \DC{False} \\
\VV{str} & ::= & \mbox{String literal} \\
\end{array}
\medskip
\\
\begin{array}{rcll}
\vT & ::= & \TC{Int} \mid \TC{Char} \mid \TC{Bool} \mid \TC{Float}
\mid \TC{String} & \mbox{(Primitives)} \\
& \mid & \TC{Unit} & \mbox{(Unit type)} \\
& \mid & \TC{Ptr} & \mbox{(Foreign pointers)} \\
& \mid & \TC{Fun} & \mbox{(Any function type)} \\
& \mid & \TC{Data} & \mbox{(Any data type)} \\
& \mid & \TC{Any} & \mbox{(Polymorphic type)} \\
\end{array}
}
}
{Epic syntax}
{epicsyn}
BNF in Figure \ref{epicsyn}. Expressions. \texttt{let}, \texttt{case},
\texttt{lazy}, \texttt{while}
\subsection{Types}
\texttt{Int}, \texttt{Float}, \texttt{Bool}, \texttt{Data}, \texttt{Ptr},
\texttt{Unit}. Unchecked! Used for marshalling foreign functions only.
Run-time representation (31 bit ints).
\subsection{Foreign Functions}
Calling, exporting.
\subsection{Implementation}
How it's implemented is not really important --- a compiler can target
Epic without knowing. There is currently one back end, but more are
planned. Compiled via C. Garbage collection with
Boehm~\cite{boehm-gc}, \texttt{\%memory}.
Later plans: compile via LLVM, allow plug in garbage collectors
(important for embedded systems, device drivers, operating system
services, for example).
\subsection{Haskell API}
(Give HOAS translation as an example)