@@ -545,11 +545,10 @@ evalExpr env (IoExpr expr) = do
545
545
Tuple [_, val'] -> return $ Value val'
546
546
_ -> throwError $ TypeMismatch " io" io
547
547
548
- evalExpr env (MatchAllExpr target matcher ( pattern , expr) ) = do
548
+ evalExpr env (MatchAllExpr target matcher clauses ) = do
549
549
target <- evalExpr env target
550
550
matcher <- evalExpr env matcher >>= evalMatcherWHNF
551
- result <- patternMatch env pattern target matcher
552
- mmap (flip evalExpr expr . extendEnv env) result >>= fromMList
551
+ f matcher target >>= fromMList
553
552
where
554
553
fromMList :: MList EgisonM WHNFData -> EgisonM WHNFData
555
554
fromMList MNil = return . Value $ Collection Sq. empty
@@ -558,6 +557,11 @@ evalExpr env (MatchAllExpr target matcher (pattern, expr)) = do
558
557
tail <- ISubCollection <$> (liftIO . newIORef . Thunk $ m >>= fromMList)
559
558
seqRef <- liftIO . newIORef $ Sq. fromList [head , tail ]
560
559
return . Intermediate $ ICollection $ seqRef
560
+ f matcher target = do
561
+ let tryMatchClause (pattern , expr) results = do
562
+ result <- patternMatch env pattern target matcher
563
+ mmap (flip evalExpr expr . extendEnv env) result >>= flip mappend results
564
+ mfoldr tryMatchClause (return MNil ) (fromList clauses)
561
565
562
566
evalExpr env (MatchExpr target matcher clauses) = do
563
567
target <- evalExpr env target
0 commit comments