3 \frametitle{Embedded Domain Specific Language
}
4 \framesubtitle{What are EDSLs
}
6 \item DSL:\ language for a specific domain
7 \item E.g., PostScript, VimScript, HTML,
\ldots
9 \item EDSL:\ Embedded DSL
10 \item Language in a language
11 \item Use the properties of the host
12 \item E.g., Ivory,
\ldots\pause{} and iTasks
14 \item Different embedding techniques
18 \begin{frame
}[fragile
]
19 \frametitle{Deep embedding
}
21 \column{.49\textwidth}
23 \begin{block
}{What is deep embedding
}
25 \item The EDSL as an ADT
26 \item A view is a function transforming the ADT
31 \begin{block
}{Properties
}
33 \item Easy to add views
42 \column{.49\textwidth}
44 \begin{lstlisting
}[language=Clean
]
45 :: DSL = LitI Int | LitB Bool
46 | Var String | Plus DSL DSL
47 | Minus DSL DSL | And DSL DSL
50 eval :: DSL Env -> Env
51 pprint :: DSL -> String
57 \begin{frame
}[fragile
]
58 \frametitle{Shallow embedding
}
60 \column{.49\textwidth}
62 \begin{block
}{What is shallow embedding
}
64 \item The EDSL as a function
65 \item The view is embedded in the function
71 \begin{block
}{Properties
}
73 \item Difficult to add views
79 \column{.49\textwidth}
81 \begin{lstlisting
}[language=Clean
]
83 :: DSL a = DSL (Env -> a)
88 Var :: String -> DSL Int
89 Var i =
\e -> retrEnv e i
91 Plus :: (DSL Int) (DSL Int) -> DSL Int
92 Plus x y =
\e -> x e + y e
98 \begin{frame
}[fragile
]
99 \frametitle{Class based shallow embedding
}
101 \column{.49\textwidth}
103 \begin{block
}{The best of both worlds
}
105 \item The EDSL is a collection of classes
106 \item Views are types implementing a subset
111 \begin{block
}{Properties
}
115 \item Easy to add views
116 \item Phantom types for extra constraints
120 \column{.49\textwidth}
122 \begin{lstlisting
}[language=Clean
]
124 :: Evaluator a = Evaluator (Env -> a)
125 :: PrettyPrinter a = PP String
127 class intArith v where
128 lit :: t -> v t | toString t
129 add :: (v t) (v t) -> (v t) | + t
130 minus :: (v t) (v t) -> (v t) | - t
132 class boolArith v where ...
134 instance intArith Evaluator where
135 lit x = Evaluator
\e->x
136 add x y = Evaluator ...
139 instance intArith PrettyPrinter where
140 lit x = PP $ toString x
141 add x y = PP $ x +++ "+" +++ y
152 \begin{block
}{What is mTask
}
154 \item Created by Pieter Koopman and Rinus Plasmeijer
155 \item EDSL for imperative programs
156 \item Arduino C++ generation, iTasks simulation
160 \begin{block
}{Considerations
}
163 \item Embedded in Clean
169 \begin{frame
}[fragile
]
170 \frametitle{Expressions
}
172 Of the form
\CI{v t p
}
175 \begin{lstlisting
}[language=Clean
]
178 (+.) infixl
6 :: (v t p) (v t q) -> v t Expr | +, zero t & isExpr p & isExpr q
179 (-.) infixl
6 :: (v t p) (v t q) -> v t Expr | -, zero t & ...
181 class boolExpr v where
182 Not :: (v Bool p) -> v Bool Expr | ...
183 (&.) infixr
3 :: (v Bool p) (v Bool q) -> v Bool Expr | ...
185 (==.) infix
4 :: (v a p) (v a q) -> v Bool Expr | ...
189 \begin{frame
}[fragile
]
190 \frametitle{Control flow
}
191 \begin{lstlisting
}[language=Clean
]
193 IF :: (v Bool p) (v t q) (v s r) -> v () Stmt | ...
194 (?) infix
1 :: (v Bool p) (v t q) -> v () Stmt | ...
197 (:.) infixr
0 :: (v t p) (v u q) -> v u Stmt | ...
201 \begin{frame
}[fragile
]
202 \frametitle{Assignment and Input/Output
}
203 \begin{lstlisting
}[language=Clean
]
204 :: DigitalPin = D0 | D1 | D2 ...
205 :: AnalogPin = A0 | A1 | A2 ...
207 class dIO v where dIO :: DigitalPin -> v Bool Upd
208 class aIO v where aIO :: AnalogPin -> v Int Upd
210 class analogRead v where
211 analogRead :: AnalogPin -> v Int Expr
212 analogWrite :: AnalogPin (v Int p) -> v Int Expr
214 class digitalRead v where
215 digitalRead :: DigitalPin -> v Bin Expr
216 digitalWrite :: DigitalPin (v Bool p) -> v Int Expr
220 \begin{frame
}[fragile
]
221 \frametitle{Shared Data Sources and Assignment
}
222 \begin{lstlisting
}[language=Clean
]
223 :: In a b = In infix
0 a b
224 :: Main a =
{main :: a
}
227 sds :: ((v t Upd)->In t (Main (v c s))) -> (Main (v c s)) | ...
230 (=.) infixr
2 :: (v t Upd) (v t p) -> v t Expr | ...
235 \begin{frame
}[fragile
]
236 \frametitle{Tasks and Examples
}
237 \begin{lstlisting
}[language=Clean
]
238 class mtask v a where
239 task :: (((v delay r) a -> v MTask Expr) -> In (a->v u p) (Main (v t q)))
240 -> Main (v t q) | ...
243 \begin{lstlisting
}[language=Clean
]
244 blink = task
\blink=(
\x.
248 blink (lit
1000) (Not x))
249 In
{main=blink (lit
1000) True
}
251 thermostat :: Main (View () Stmt)
252 thermostat =
{main = digitalWrite (dIO D0) (analogRead A0 >. lit
50)
254 thermostat2 :: Main (View () Stmt)
255 thermostat =
{main = (dIO D0) =. (analogRead A0 >. lit
50)