X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;ds=sidebyside;f=pres.mtask.tex;h=49a275feaced27d518ea03ba31b2754e030a1450;hb=2498dced580be1e7af31a662dadee26c4fd159ed;hp=e0732f08510741914a5954e06d938879e8fb09cc;hpb=26060876e5fffdeff52db1abe6e8ffc4619d3fd8;p=msc-thesis1617.git diff --git a/pres.mtask.tex b/pres.mtask.tex index e0732f0..49a275f 100644 --- a/pres.mtask.tex +++ b/pres.mtask.tex @@ -10,30 +10,127 @@ \item Language in a language \item Use the properties of the host \item E.g., Ivory, \ldots\pause{} and iTasks + \pause{} + \item Different embedding techniques \end{itemize} \end{frame} -\begin{frame} - \frametitle{Embedded Domain Specific Language (2)} - \framesubtitle{Embedding techniques} - \begin{block}{Deep} - \end{block} +\begin{frame}[fragile] + \frametitle{Deep embedding} + \begin{columns}[t] + \column{.49\textwidth} + \begin{block}{What is deep embedding} + \begin{itemize} + \item The EDSL as an ADT + \item A view is a function transforming the ADT + \end{itemize} + \end{block} + \column{.49\textwidth} + \pause{} + \begin{lstlisting}[language=Clean] +:: DSL = LitI Int | LitB Bool + | Var String | Plus DSL DSL + | Minus DSL DSL | And DSL DSL + | Eq DSL - \begin{block}{Shallow} +eval :: DSL Env -> Env +pprint :: DSL -> String + \end{lstlisting} + \end{columns} + \pause{} + \begin{block}{Properties} + \begin{itemize} + \item Easy to add views + \item Hard to extend + \item Not type safe + \pause\item GADT + \end{itemize} \end{block} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Shallow embedding} + \begin{columns}[t] + \column{.49\textwidth} + \begin{block}{What is shallow embedding} + \begin{itemize} + \item The EDSL as a function + \item The view is embedded in the function + \end{itemize} + \end{block} + \pause{} + \column{.49\textwidth} + \begin{lstlisting}[language=Clean] +:: Env = ... +:: DSL a = DSL (Env -> a) + +Lit :: a -> DSL a +Lit x = \e -> x - \begin{block}{Class based shallow} +Var :: String -> DSL Int +Var i = \e -> retrEnv e i + +Plus :: (DSL Int) (DSL Int) -> DSL Int +Plus x y = \e -> x e + y e + \end{lstlisting} + \end{columns} + \pause{} + \begin{block}{Properties} + \begin{itemize} + \item Difficult to add views + \item Easy to extend + \item Type safe + \end{itemize} \end{block} \end{frame} -\begin{frame} - \frametitle{Embedded Domain Specific Language (2)} - \framesubtitle{Shallow Embedding} -\end{frame} +\begin{frame}[fragile] + \frametitle{Class based shallow embedding} + \begin{columns}[t] + \column{.49\textwidth} + \onslide<1->{ + \begin{block}{The best of both worlds} + \begin{itemize} + \item The EDSL is a collection of classes + \item Views are types implementing a subset + \end{itemize} + \end{block} + } + \onslide<3->{ + \begin{block}{Properties} + \begin{itemize} + \item Extendable + \item Type safe + \item Easy to add views + \end{itemize} + \end{block} + } + \column{.49\textwidth} + \begin{onlyenv}<2-> + \begin{lstlisting}[language=Clean] +:: Env = ... +:: Evaluator a = Evaluator (Env -> a) +:: PrettyPrinter a = PP String -\begin{frame} - \frametitle{Embedded Domain Specific Language (3)} - \framesubtitle{Class Based Shallow Embedding} +class intArith where + lit :: t -> v t | toString t + add :: (v t) (v t) -> (v t) | + t + minus :: (v t) (v t) -> (v t) | - t + +class boolArith where ... + +instance intArith Evaluator where + lit x = Evaluator \e->x + add x y = Evaluator ... + ... + +instance intArith PrettyPrinter where + lit x = PP $ toString x + add x y = PP $ x +++ "+" +++ y + ... + \end{lstlisting} + \end{onlyenv} + \end{columns} \end{frame} \subsection{mTask} @@ -42,9 +139,9 @@ \pause{} \begin{block}{What is mTask} \begin{itemize} - \item EDSL - \item Generates C code - \item Arduino + \item Created by Pieter Koopman and Rinus Plasmeijer + \item EDSL for imperative programs + \item Arduino C++ generation, iTasks simulation \end{itemize} \end{block} @@ -53,9 +150,89 @@ \item Type safe \item Embedded in Clean \item Extendable - \item \ldots\pause{} but\ldots - \item No interaction - \item Compilation \end{itemize} \end{block} \end{frame} + +\begin{frame}[fragile] + \frametitle{Expressions} + \begin{block}{mTask} + Of the form \CI{v t p} + \end{block} + \pause{} + \begin{lstlisting}[language=Clean] +class arith v where + lit :: t -> v t Expr + (+.) infixl 6 :: (v t p) (v t q) -> v t Expr | +, zero t & isExpr p & isExpr q + (-.) infixl 6 :: (v t p) (v t q) -> v t Expr | -, zero t & ... + ... +class boolExpr v where + Not :: (v Bool p) -> v Bool Expr | ... + (&.) infixr 3 :: (v Bool p) (v Bool q) -> v Bool Expr | ... + ... + (==.) infix 4 :: (v a p) (v a q) -> v Bool Expr | ... + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Control flow} + \begin{lstlisting}[language=Clean] +class IF v where + IF :: (v Bool p) (v t q) (v s r) -> v () Stmt | ... + (?) infix 1 :: (v Bool p) (v t q) -> v () Stmt | ... + +class seq v where + (:.) infixr 0 :: (v t p) (v u q) -> v u Stmt | ... + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Assignment and Input/Output} + \begin{lstlisting}[language=Clean] +:: DigitalPin = D0 | D1 | D2 ... +:: AnalogPin = A0 | A1 | A2 ... + +class dIO v where dIO :: DigitalPin -> v Bool Upd +class aIO v where aIO :: AnalogPin -> v Int Upd + +class analogRead v where + analogRead :: AnalogPin -> v Int Expr + analogWrite :: AnalogPin (v Int p) -> v Int Expr + +class digitalRead v where + digitalRead :: DigitalPin -> v Bin Expr + digitalWrite :: DigitalPin (v Bool p) -> v Int Expr + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Shared Data Sources and Assignment} + \begin{lstlisting}[language=Clean] +:: In a b = In infix 0 a b +:: Main a = {main :: a} + +class sds v where + sds :: ((v t Upd)->In t (Main (v c s))) -> (Main (v c s)) | ... + +class assign v where + (=.) infixr 2 :: (v t Upd) (v t p) -> v t Expr | ... + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Examples} + \begin{lstlisting}[language=Clean] +blink = task \blink=(\x. + IF x) + (ledOn LED1) + (ledOff LED2) :. + blink (lit 1000) (Not x)) + In {main=blink (lit 1000) True} + +thermostat :: Main (View () Stmt) +thermostat = {main = digitalWrite (dIO D0) (analogRead A0 >. lit 50) + +thermostat2 :: Main (View () Stmt) +thermostat = {main = (dIO D0) =. (analogRead A0 >. lit 50) + \end{lstlisting} +\end{frame}