hs-logo-0.3: Logo/Types.hs
module Logo.Types where
import Data.Map (Map)
import Text.Parsec.Prim (ParsecT)
import Diagrams.TwoD.Path.Turtle (TurtleT)
data LogoToken = Identifier String -- Identifier
| StrLiteral String -- String Literal, e.g @"word@
| VarLiteral String -- Variable, e.g @:size@
| NumLiteral Double -- Number
| OperLiteral String -- Operator
| LogoList [LogoToken] -- Input definition/variable reference
| LogoExpr [LogoToken] -- Expression inside parentheses
deriving (Eq)
instance Show LogoToken where
show (Identifier s) = "@" ++ s ++ "@"
show (StrLiteral s) = s
show (VarLiteral s) = ":" ++ s
show (NumLiteral s) = show s
show (OperLiteral s) = s
show (LogoList l) = show l
show (LogoExpr e) = "(" ++ show e ++ ")"
type TurtleIO = TurtleT IO
type LogoEvaluator = ParsecT [LogoToken] LogoContext TurtleIO
type LogoFunction = [LogoToken] -> LogoEvaluator LogoToken
type LogoSymbolTable = Map String LogoToken
data LogoFunctionDef = LogoFunctionDef
{ arity :: Int -- Number of arguments
, runFn :: LogoFunction -- Consumes an argument
} deriving Show
data LogoContext = LogoContext
{ functions :: Map String LogoFunctionDef -- Functions that can be called, mapped by the identifier
, locals :: LogoSymbolTable -- Vars in local context
, globals :: LogoSymbolTable -- Vars in global context
} deriving Show