summaryrefslogtreecommitdiff
path: root/assignment-8
diff options
context:
space:
mode:
Diffstat (limited to 'assignment-8')
-rw-r--r--assignment-8/skeleton8.icl63
1 files changed, 51 insertions, 12 deletions
diff --git a/assignment-8/skeleton8.icl b/assignment-8/skeleton8.icl
index 0c68ac9..3e81cce 100644
--- a/assignment-8/skeleton8.icl
+++ b/assignment-8/skeleton8.icl
@@ -5,6 +5,21 @@ module skeleton8
* Pieter Koopman, pieter@cs.ru.nl
*/
+import StdList
+import StdString
+
+import Control.Applicative
+import Control.Monad
+from Control.Monad.State import :: StateT(StateT),
+ instance Functor (StateT s m), instance Applicative (StateT s m), instance Monad (StateT s m),
+ gets, modify
+import Data.Error
+from Data.Func import $
+import Data.Functor
+import qualified Data.Map as Map
+import Data.Maybe
+from Text import <+
+
from iTasks import class iTask, class toPrompt, class Publishable, instance Publishable Task,
instance toPrompt String, instance Functor Task,
class TApplicative, instance TApplicative Task,
@@ -14,12 +29,13 @@ from iTasks import class iTask, class toPrompt, class Publishable, instance Publ
-||-, -||, ||-, >>*, always, hasValue, updateInformation, viewInformation, startEngine
import qualified iTasks
import qualified iTasks.WF.Combinators.Overloaded as WF
-import Data.Functor, Control.Applicative, Control.Monad
-import Data.Tuple, StdClass, StdList, StdMaybe, StdString
-import StdGeneric, StdBool
-from StdFunc import o
-import qualified Data.List as List
-import qualified Data.Map as Map
+
+(>>>=) :== 'iTasks'.tbind
+(>>>|) a b :== 'iTasks'.tbind a (\_ -> b)
+treturn :== 'iTasks'.return
+ActionOk :== 'iTasks'.ActionOk
+ActionQuit :== 'iTasks'.ActionQuit
+ActionNew :== 'iTasks'.ActionNew
:: Expression
= New [Int]
@@ -52,16 +68,39 @@ import qualified Data.Map as Map
// === State
+:: Val
+ = VElem Int
+ | VSet [Int]
+
+:: State :== 'Map'.Map Ident Val
+
+:: Sem a :== StateT State (MaybeError String) a
+// Or define :: Sem a = Sem (s -> MaybeErrorString (a,s)) and copy the relevant
+// instances from Control.Monad.State
+
+store :: Ident Val -> Sem Val
+store i v = modify ('Map'.put i v) $> v
+
+read :: Ident -> Sem Val
+read i = gets ('Map'.get i) >>= \v -> case v of
+ Nothing -> fail $ "unknown variable '" <+ i <+ "'"
+ Just v -> pure v
+
+fail :: String -> Sem a
+fail e = StateT \_ -> Error e
+
+eval :: Expression -> Sem Val
+eval (New xs) = pure $ VSet xs
+eval (Elem x) = pure $ VElem x
+eval (Variable i) = read i
+eval (Size s) = eval s >>= \xs -> case xs of
+ VSet xs -> pure $ VElem $ length xs
+ _ -> fail "Size :: Set -> Elem applied to Elem"
+//eval (a +. b) TODO
// === semantics
// === simulation
-(>>>=) :== 'iTasks'.tbind
-(>>>|) a b :== 'iTasks'.tbind a (\_ -> b)
-treturn :== 'iTasks'.return
-ActionOk :== 'iTasks'.ActionOk
-ActionQuit :== 'iTasks'.ActionQuit
-ActionNew :== 'iTasks'.ActionNew
Start = ()