add print built-in
This commit is contained in:
parent
0770474931
commit
cd309c9a58
14
interp.hs
14
interp.hs
|
@ -23,7 +23,7 @@ data Value = IntV Integer
|
||||||
| ListV [Value]
|
| ListV [Value]
|
||||||
| Builtin BIF
|
| Builtin BIF
|
||||||
| FnV [(Pattern, [AST])] -- pattern->body bindings
|
| FnV [(Pattern, [AST])] -- pattern->body bindings
|
||||||
deriving (Show, Eq)
|
deriving (Eq)
|
||||||
|
|
||||||
type Env = M.Map String Value -- an environment
|
type Env = M.Map String Value -- an environment
|
||||||
type InterpState = State ([Handle], Env) -- interpreter state (open handles, global env)
|
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 -> String -> Value -> Env
|
||||||
bind env name value = M.insert name 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
|
-- value operators
|
||||||
(IntV l) +$ (IntV r) = IntV (l + r)
|
(IntV l) +$ (IntV r) = IntV (l + r)
|
||||||
(StrV l) +$ (StrV r) = StrV (l ++ r)
|
(StrV l) +$ (StrV r) = StrV (l ++ r)
|
||||||
|
@ -61,6 +70,8 @@ _putstr (StrV str) = do
|
||||||
{-# NOINLINE unsafe_putstr #-}
|
{-# NOINLINE unsafe_putstr #-}
|
||||||
unsafe_putstr h s = unsafePerformIO $ hPutStr h s >> hFlush h
|
unsafe_putstr h s = unsafePerformIO $ hPutStr h s >> hFlush h
|
||||||
|
|
||||||
|
_print v = _putstr $ StrV $ show v ++ "\n"
|
||||||
|
|
||||||
_getline UnitV = do
|
_getline UnitV = do
|
||||||
(handles,_) <- get
|
(handles,_) <- get
|
||||||
let stdin_s = handles !! 1
|
let stdin_s = handles !! 1
|
||||||
|
@ -78,6 +89,7 @@ initialState = ([stdout, stdin],
|
||||||
("stdout", StreamV 0),
|
("stdout", StreamV 0),
|
||||||
("putstr", Builtin $ BIF _putstr),
|
("putstr", Builtin $ BIF _putstr),
|
||||||
("putstrln", Builtin $ BIF (\x -> _putstr $ x +$ StrV "\n")),
|
("putstrln", Builtin $ BIF (\x -> _putstr $ x +$ StrV "\n")),
|
||||||
|
("print", Builtin $ BIF _print),
|
||||||
("itos", Builtin $ BIF _itos),
|
("itos", Builtin $ BIF _itos),
|
||||||
("getline", Builtin $ BIF _getline)])
|
("getline", Builtin $ BIF _getline)])
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue