aboutsummaryrefslogtreecommitdiff
path: root/haskell/Types.hs
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-12-23 22:37:43 -0700
committerJoel Martin <github@martintribe.org>2015-01-09 16:16:52 -0600
commitfa9a9758e0d15abe670fbbfd8efa1fce013b1414 (patch)
tree7ee5dceceaa79cf0269ae74d10aa297504c69da3 /haskell/Types.hs
parentb76aa73bc76a28d7c6bb3c5a43acc9afd9ec42c8 (diff)
downloadmal-fa9a9758e0d15abe670fbbfd8efa1fce013b1414.tar.gz
mal-fa9a9758e0d15abe670fbbfd8efa1fce013b1414.zip
Haskell: steps 4-6. Line editing. Simpler fn calls.
Diffstat (limited to 'haskell/Types.hs')
-rw-r--r--haskell/Types.hs82
1 files changed, 67 insertions, 15 deletions
diff --git a/haskell/Types.hs b/haskell/Types.hs
index bec26be..9a433c5 100644
--- a/haskell/Types.hs
+++ b/haskell/Types.hs
@@ -1,13 +1,15 @@
module Types
---( MalVal (Nil,MalFalse,MalTrue,MalNumber,MalString,MalSymbol,MalKeyword,MalList,MalVector,MalFunc), _obj_type )
-(MalVal (..), FuncT (..), _malfunc, catchAny)
+(MalVal (..), Fn (..), EnvData (..), Env,
+ catchAny, _pairs, _func, _malfunc, _list_Q, _vector_Q, _hash_map_Q)
where
+import Data.IORef (IORef)
import qualified Data.Map as Map
-import Control.Exception (SomeException, catch)
+import Control.Exception as CE
--- Based Mal types --
-newtype FuncT = FuncT (MalVal -> MalVal)
+
+-- Base Mal types --
+newtype Fn = Fn ([MalVal] -> IO MalVal)
data MalVal = Nil
| MalFalse
| MalTrue
@@ -18,23 +20,39 @@ data MalVal = Nil
| MalList [MalVal]
| MalVector [MalVal]
| MalHashMap (Map.Map String MalVal)
- | MalFunc FuncT
- deriving (Eq)
+ | Func Fn
+ | MalFunc {fn :: Fn,
+ ast :: MalVal,
+ env :: Env,
+ params :: MalVal}
+
+_equal_Q Nil Nil = True
+_equal_Q MalFalse MalFalse = True
+_equal_Q MalTrue MalTrue = True
+_equal_Q (MalNumber a) (MalNumber b) = a == b
+_equal_Q (MalString a) (MalString b) = a == b
+_equal_Q (MalSymbol a) (MalSymbol b) = a == b
+_equal_Q (MalKeyword a) (MalKeyword b) = a == b
+_equal_Q (MalList a) (MalList b) = a == b
+_equal_Q (MalList a) (MalVector b) = a == b
+_equal_Q (MalVector a) (MalList b) = a == b
+_equal_Q (MalHashMap a) (MalHashMap b) = a == b
+_equal_Q _ _ = False
-instance Eq FuncT where
- x == y = False
+instance Eq MalVal where
+ x == y = _equal_Q x y
-_malfunc f = MalFunc $ FuncT f
+-- Env types --
+-- Note: Env functions are in Env module
+data EnvData = EnvPair (Maybe Env, (Map.Map String MalVal))
+type Env = IORef EnvData
--- Error definitions --
-catchAny :: IO a -> (SomeException -> IO a) -> IO a
-catchAny = catch
----------------------------------------------------------
--- General type functions --
+-- General functions --
_obj_type :: MalVal -> String
_obj_type (Nil) = "nil"
@@ -46,4 +64,38 @@ _obj_type (MalSymbol _) = "symbol"
_obj_type (MalList _) = "list"
_obj_type (MalVector _) = "vector"
_obj_type (MalHashMap _) = "hashmap"
-_obj_type (MalFunc _) = "malfunc"
+_obj_type (Func _) = "function"
+
+-- TODO: propagate error properly
+_pairs [x] = error "Odd number of elements to _pairs"
+_pairs [] = []
+_pairs (MalString x:y:xs) = (x,y):_pairs xs
+_pairs (MalKeyword x:y:xs) = ("\x029e" ++ x,y):_pairs xs
+
+-- Errors
+
+catchAny :: IO a -> (CE.SomeException -> IO a) -> IO a
+catchAny = CE.catch
+
+
+-- Functions
+
+_func fn = Func $ Fn fn
+_malfunc ast env params fn = MalFunc {fn=(Fn fn), ast=ast,
+ env=env, params=params}
+
+-- Lists
+
+_list_Q (MalList _) = MalTrue
+_list_Q _ = MalFalse
+
+-- Vectors
+
+_vector_Q (MalVector _) = MalTrue
+_vector_Q _ = MalFalse
+
+-- Hash Maps
+
+_hash_map_Q (MalHashMap _) = MalTrue
+_hash_map_Q _ = MalFalse
+