add print built-in

This commit is contained in:
darkf 2013-10-20 22:37:58 -07:00
parent 0770474931
commit cd309c9a58
1 changed files with 13 additions and 1 deletions

View File

@ -23,7 +23,7 @@ data Value = IntV Integer
| ListV [Value]
| Builtin BIF
| FnV [(Pattern, [AST])] -- pattern->body bindings
deriving (Show, Eq)
deriving (Eq)
type Env = M.Map String Value -- an environment
type InterpState = State ([Handle], Env) -- interpreter state (open handles, global env)
@ -34,6 +34,15 @@ lookup env name = M.lookup name env
bind :: Env -> String -> Value -> Env
bind env name value = M.insert name value env
instance Show Value where
show (IntV i) = show i
show (StrV s) = show s
show (ListV v) = show v
show (FnV _) = "<fn>"
show (StreamV _) = "<stream>"
show (Builtin _) = "<built-in>"
show UnitV = "()"
-- value operators
(IntV l) +$ (IntV r) = IntV (l + r)
(StrV l) +$ (StrV r) = StrV (l ++ r)
@ -61,6 +70,8 @@ _putstr (StrV str) = do
{-# NOINLINE unsafe_putstr #-}
unsafe_putstr h s = unsafePerformIO $ hPutStr h s >> hFlush h
_print v = _putstr $ StrV $ show v ++ "\n"
_getline UnitV = do
(handles,_) <- get
let stdin_s = handles !! 1
@ -78,6 +89,7 @@ initialState = ([stdout, stdin],
("stdout", StreamV 0),
("putstr", Builtin $ BIF _putstr),
("putstrln", Builtin $ BIF (\x -> _putstr $ x +$ StrV "\n")),
("print", Builtin $ BIF _print),
("itos", Builtin $ BIF _itos),
("getline", Builtin $ BIF _getline)])