@@ -15,6 +15,14 @@ import Text.Megaparsec (errorBundlePretty, sourcePosPretty, SourcePos)
1515import Text.Megaparsec.Pos (sourceName , sourceLine , sourceColumn , unPos )
1616import Data.List (isInfixOf )
1717import qualified Language.FFI as FFI
18+ import Control.Concurrent.MVar
19+ import System.Mem.StableName
20+
21+ -- Global mutable reference to the global scope using MVar
22+ {-# NOINLINE globalScopeMVar #-}
23+ globalScopeMVar :: MVar (Hashtable String Value )
24+ globalScopeMVar = unsafePerformIO $ do
25+ newMVar emptyHashtable
1826
1927-- | Error type for better error messages
2028data EvalError = EvalError
@@ -107,8 +115,69 @@ interpretCommand mpos (Assign name expr) table =
107115 Right v@ (Function _) -> return (insertHashtable table name v)
108116 Right v@ (Lambda _) -> return (insertHashtable table name v)
109117 Right v@ (AlgebraicDataType _ _) -> return (insertHashtable table name v)
110- Right v@ (CBinding _ _) -> return (insertHashtable table name v)
111- Right v@ (NaN ) -> return (insertHashtable table name v)
118+
119+ interpretCommand mpos (GlobalAssign name expr) table =
120+ case evaluate expr table of
121+ Right v@ (Integer _) -> do
122+ globalScope <- takeMVar globalScopeMVar
123+ let newGlobalScope = insertHashtable globalScope name v
124+ putMVar globalScopeMVar newGlobalScope
125+ return (insertHashtable table name v)
126+ Right v@ (Double _) -> do
127+ globalScope <- takeMVar globalScopeMVar
128+ let newGlobalScope = insertHashtable globalScope name v
129+ putMVar globalScopeMVar newGlobalScope
130+ return (insertHashtable table name v)
131+ Right v@ (Boolean _) -> do
132+ globalScope <- takeMVar globalScopeMVar
133+ let newGlobalScope = insertHashtable globalScope name v
134+ putMVar globalScopeMVar newGlobalScope
135+ return (insertHashtable table name v)
136+ Right v@ (Character _) -> do
137+ globalScope <- takeMVar globalScopeMVar
138+ let newGlobalScope = insertHashtable globalScope name v
139+ putMVar globalScopeMVar newGlobalScope
140+ return (insertHashtable table name v)
141+ Right v@ (List _ _) -> do
142+ globalScope <- takeMVar globalScopeMVar
143+ let newGlobalScope = insertHashtable globalScope name v
144+ putMVar globalScopeMVar newGlobalScope
145+ return (insertHashtable table name v)
146+ Right v@ (Set _ _) -> do
147+ globalScope <- takeMVar globalScopeMVar
148+ let newGlobalScope = insertHashtable globalScope name v
149+ putMVar globalScopeMVar newGlobalScope
150+ return (insertHashtable table name v)
151+ Right v@ (Object _) -> do
152+ globalScope <- takeMVar globalScopeMVar
153+ let newGlobalScope = insertHashtable globalScope name v
154+ putMVar globalScopeMVar newGlobalScope
155+ return (insertHashtable table name v)
156+ Right v@ (Function _) -> do
157+ globalScope <- takeMVar globalScopeMVar
158+ let newGlobalScope = insertHashtable globalScope name v
159+ putMVar globalScopeMVar newGlobalScope
160+ return (insertHashtable table name v)
161+ Right v@ (Lambda _) -> do
162+ globalScope <- takeMVar globalScopeMVar
163+ let newGlobalScope = insertHashtable globalScope name v
164+ putMVar globalScopeMVar newGlobalScope
165+ return (insertHashtable table name v)
166+ Right v@ (AlgebraicDataType _ _) -> do
167+ globalScope <- takeMVar globalScopeMVar
168+ let newGlobalScope = insertHashtable globalScope name v
169+ putMVar globalScopeMVar newGlobalScope
170+ return (insertHashtable table name v)
171+ Right v@ (CBinding _ _) -> do
172+ globalScope <- takeMVar globalScopeMVar
173+ let newGlobalScope = insertHashtable globalScope name v
174+ putMVar globalScopeMVar newGlobalScope
175+ return (insertHashtable table name v)
176+ Right v@ (NaN ) -> do
177+ globalScope <- takeMVar globalScopeMVar
178+ let newGlobalScope = insertHashtable globalScope name v
179+ putMVar globalScopeMVar newGlobalScope
180+ return (insertHashtable table name v)
112181 Right v -> die (mkEvalErrorHint mpos
113182 (" cannot assign unexpected value to '" ++ name ++ " '" )
114183 (" value type: " ++ show v))
@@ -503,10 +572,17 @@ evaluate (Index expr idxExpr) table = do
503572 Nothing -> Left $ mkEvalError Nothing (" key '" ++ [c] ++ " ' not found" )
504573 _ -> Left $ mkEvalError Nothing (" cannot index " ++ getValueType collection ++ " with " ++ getValueType idx)
505574
506- evaluate (Variable name) table =
507- case lookupHashtable table name of
508- Just val -> Right val
509- Nothing -> Right Undefined
575+ evaluate (Variable name) table = unsafePerformIO $ do
576+ globalScopeNow <- readMVar globalScopeMVar
577+ case lookupHashtable globalScopeNow name of
578+ Just val -> do
579+ return (Right val)
580+ Nothing ->
581+ case lookupHashtable table name of
582+ Just val -> do
583+ return (Right val)
584+ Nothing -> do
585+ return (Right Undefined )
510586
511587evaluate (ReadFile filenameExpr) table = do
512588 pathVal <- evaluate filenameExpr table
0 commit comments