2 (MalVal
(..), MalError
(..), IOThrows
(..), Fn
(..), EnvData
(..), Env
,
3 throwStr
, throwMalVal
, _get_call
, _to_list
,
5 _nil_Q
, _true_Q
, _false_Q
, _string_Q
, _symbol_Q
, _keyword_Q
,
6 _list_Q
, _vector_Q
, _hash_map_Q
, _atom_Q
)
9 import Data
.IORef
(IORef
)
10 import qualified Data
.Map
as Map
11 import Control
.Exception
as CE
12 import Control
.Monad
.Error
(ErrorT
, Error
, noMsg
, strMsg
, throwError
)
16 newtype Fn
= Fn
([MalVal
] -> IOThrows MalVal
)
23 | MalList
[MalVal
] MalVal
24 | MalVector
[MalVal
] MalVal
25 | MalHashMap
(Map
.Map
String MalVal
) MalVal
26 | MalAtom
(IORef MalVal
) MalVal
35 _equal_Q Nil Nil
= True
36 _equal_Q MalFalse MalFalse
= True
37 _equal_Q MalTrue MalTrue
= True
38 _equal_Q
(MalNumber a
) (MalNumber b
) = a
== b
39 _equal_Q
(MalString a
) (MalString b
) = a
== b
40 _equal_Q
(MalSymbol a
) (MalSymbol b
) = a
== b
41 _equal_Q
(MalList a _
) (MalList b _
) = a
== b
42 _equal_Q
(MalList a _
) (MalVector b _
) = a
== b
43 _equal_Q
(MalVector a _
) (MalList b _
) = a
== b
44 _equal_Q
(MalVector a _
) (MalVector b _
) = a
== b
45 _equal_Q
(MalHashMap a _
) (MalHashMap b _
) = a
== b
46 _equal_Q
(MalAtom a _
) (MalAtom b _
) = a
== b
49 instance Eq MalVal
where
53 --- Errors/Exceptions ---
55 data MalError
= StringError
String
58 type IOThrows
= ErrorT MalError
IO
60 instance Error MalError
where
61 noMsg
= StringError
"An error has occurred"
64 throwStr str
= throwError
$ StringError str
65 throwMalVal mv
= throwError
$ MalValError mv
68 -- Note: Env functions are in Env module
69 data EnvData
= EnvPair
(Maybe Env
, (Map
.Map
String MalVal
))
70 type Env
= IORef EnvData
74 ----------------------------------------------------------
76 -- General functions --
78 _get_call
((Func
(Fn f
) _
) : _
) = return f
79 _get_call
(MalFunc
{fn
=(Fn f
)} : _
) = return f
80 _get_call _
= throwStr
"_get_call first parameter is not a function "
82 _to_list
(MalList lst _
) = return lst
83 _to_list
(MalVector lst _
) = return lst
84 _to_list _
= throwStr
"_to_list expected a MalList or MalVector"
88 --catchAny :: IO a -> (CE.SomeException -> IO a) -> IO a
93 _func fn
= Func
(Fn fn
) Nil
94 _func_meta fn meta
= Func
(Fn fn
) meta
96 _malfunc ast env params fn
= MalFunc
{fn
=(Fn fn
), ast
=ast
,
97 env
=env
, params
=params
,
98 macro
=False, meta
=Nil
}
99 _malfunc_meta ast env params fn meta
= MalFunc
{fn
=(Fn fn
), ast
=ast
,
100 env
=env
, params
=params
,
101 macro
=False, meta
=meta
}
107 _true_Q MalTrue
= MalTrue
110 _false_Q MalFalse
= MalTrue
111 _false_Q _
= MalFalse
113 _symbol_Q
(MalSymbol _
) = MalTrue
114 _symbol_Q _
= MalFalse
116 _string_Q
(MalString
('\x029e
':_
)) = MalFalse
117 _string_Q
(MalString _
) = MalTrue
118 _string_Q _
= MalFalse
120 _keyword_Q
(MalString
('\x029e
':_
)) = MalTrue
121 _keyword_Q _
= MalFalse
125 _list_Q
(MalList _ _
) = MalTrue
130 _vector_Q
(MalVector _ _
) = MalTrue
131 _vector_Q _
= MalFalse
135 _hash_map_Q
(MalHashMap _ _
) = MalTrue
136 _hash_map_Q _
= MalFalse
140 _atom_Q
(MalAtom _ _
) = MalTrue