mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-10-25 08:43:17 -06:00
propagate errors in a better way
This commit is contained in:
1 parent
cf6297fbff
commit
44a7f1bf7a
1 file changed
+13
@@ -123,6 +123,7 @@ data ConstValue a
|
|||||||
= Const a
|
= Const a
|
||||||
| CSusp MetaId (Value -> ConstValue a)
|
| CSusp MetaId (Value -> ConstValue a)
|
||||||
| CFV Choice (Variants (ConstValue a))
|
| CFV Choice (Variants (ConstValue a))
|
||||||
|
| CError Doc
|
||||||
| RunTime
|
| RunTime
|
||||||
| NonExist
|
| NonExist
|
||||||
|
|
||||||
@@ -130,6 +131,7 @@ instance Functor ConstValue where
|
|||||||
fmap f (Const c) = Const (f c)
|
fmap f (Const c) = Const (f c)
|
||||||
fmap f (CFV i vs) = CFV i (fmap (fmap f) vs)
|
fmap f (CFV i vs) = CFV i (fmap (fmap f) vs)
|
||||||
fmap f (CSusp i k) = CSusp i (fmap f . k)
|
fmap f (CSusp i k) = CSusp i (fmap f . k)
|
||||||
|
fmap f (CError e) = CError e
|
||||||
fmap f RunTime = RunTime
|
fmap f RunTime = RunTime
|
||||||
fmap f NonExist = NonExist
|
fmap f NonExist = NonExist
|
||||||
|
|
||||||
@@ -141,6 +143,8 @@ instance Applicative ConstValue where
|
|||||||
v1 <*> (CFV s vs) = CFV s (fmap (v1 <*>) vs)
|
v1 <*> (CFV s vs) = CFV s (fmap (v1 <*>) vs)
|
||||||
(CSusp i k) <*> v2 = CSusp i (\v -> k v <*> v2)
|
(CSusp i k) <*> v2 = CSusp i (\v -> k v <*> v2)
|
||||||
v1 <*> (CSusp i k) = CSusp i (\v -> v1 <*> k v)
|
v1 <*> (CSusp i k) = CSusp i (\v -> v1 <*> k v)
|
||||||
|
(CError e) <*> _ = CError e
|
||||||
|
_ <*> (CError e) = CError e
|
||||||
NonExist <*> _ = NonExist
|
NonExist <*> _ = NonExist
|
||||||
_ <*> NonExist = NonExist
|
_ <*> NonExist = NonExist
|
||||||
RunTime <*> _ = RunTime
|
RunTime <*> _ = RunTime
|
||||||
@@ -335,6 +339,7 @@ evalPredef g@(Gl gr pds _) c n args =
|
|||||||
valueOf (Const res) = res
|
valueOf (Const res) = res
|
||||||
valueOf (CFV i vs) = VFV i (fmap valueOf vs)
|
valueOf (CFV i vs) = VFV i (fmap valueOf vs)
|
||||||
valueOf (CSusp i k) = VSusp i (valueOf . k) []
|
valueOf (CSusp i k) = VSusp i (valueOf . k) []
|
||||||
|
valueOf (CError e) = VError e
|
||||||
valueOf RunTime = VConst (cPredef,n) args
|
valueOf RunTime = VConst (cPredef,n) args
|
||||||
valueOf NonExist = VApp (cPredef,cNonExist) []
|
valueOf NonExist = VApp (cPredef,cNonExist) []
|
||||||
|
|
||||||
@@ -598,6 +603,7 @@ patternMatch g s v0 ((env0,ps,args0,t):eqs) = match env0 ps eqs args0
|
|||||||
in patternMatch g s v0 eqs'
|
in patternMatch g s v0 eqs'
|
||||||
match_seq (CSusp i k) = VSusp i (match_seq . k) []
|
match_seq (CSusp i k) = VSusp i (match_seq . k) []
|
||||||
match_seq (CFV c vs) = VFV c (fmap match_seq vs)
|
match_seq (CFV c vs) = VFV c (fmap match_seq vs)
|
||||||
|
match_seq (CError e) = VError e
|
||||||
match_seq RunTime = v0
|
match_seq RunTime = v0
|
||||||
match_seq NonExist = patternMatch g s v0 eqs
|
match_seq NonExist = patternMatch g s v0 eqs
|
||||||
in match_seq (value2string g v)
|
in match_seq (value2string g v)
|
||||||
@@ -607,6 +613,7 @@ patternMatch g s v0 ((env0,ps,args0,t):eqs) = match env0 ps eqs args0
|
|||||||
in patternMatch g s v0 eqs'
|
in patternMatch g s v0 eqs'
|
||||||
match_rep (CSusp i k) = VSusp i (match_rep . k) []
|
match_rep (CSusp i k) = VSusp i (match_rep . k) []
|
||||||
match_rep (CFV c vs) = VFV c (fmap match_rep vs)
|
match_rep (CFV c vs) = VFV c (fmap match_rep vs)
|
||||||
|
match_rep (CError e) = VError e
|
||||||
match_rep RunTime = v0
|
match_rep RunTime = v0
|
||||||
match_rep NonExist = patternMatch g s v0 eqs
|
match_rep NonExist = patternMatch g s v0 eqs
|
||||||
in match_rep (value2string g v)
|
in match_rep (value2string g v)
|
||||||
@@ -643,6 +650,7 @@ vtableSelect g v0 ty cs v2 vs =
|
|||||||
select (Const (i,_)) = cs !! i
|
select (Const (i,_)) = cs !! i
|
||||||
select (CSusp i k) = VSusp i (\v -> select (k v)) []
|
select (CSusp i k) = VSusp i (\v -> select (k v)) []
|
||||||
select (CFV c vs) = VFV c (fmap select vs)
|
select (CFV c vs) = VFV c (fmap select vs)
|
||||||
|
select (CError e) = VError e
|
||||||
select _ = v0
|
select _ = v0
|
||||||
|
|
||||||
value2index (VMeta i vs) vty = CSusp i (\v -> value2index (apply g v vs) vty)
|
value2index (VMeta i vs) vty = CSusp i (\v -> value2index (apply g v vs) vty)
|
||||||
@@ -683,6 +691,7 @@ vtableSelect g v0 ty cs v2 vs =
|
|||||||
value2index (VInt n) (VApp c [VInt max])
|
value2index (VInt n) (VApp c [VInt max])
|
||||||
| Q c == cnPredef cInts = Const (fromIntegral n,fromIntegral max+1)
|
| Q c == cnPredef cInts = Const (fromIntegral n,fromIntegral max+1)
|
||||||
value2index (VFV c vs) vty = CFV c (fmap (\v -> value2index v vty) vs)
|
value2index (VFV c vs) vty = CFV c (fmap (\v -> value2index v vty) vs)
|
||||||
|
value2index (VError e) _ = CError e
|
||||||
value2index v vty = RunTime
|
value2index v vty = RunTime
|
||||||
|
|
||||||
|
|
||||||
@@ -1178,6 +1187,7 @@ value2string g v = fmap (\(_,ws,_) -> unwords ws) (value2string' g v False [] []
|
|||||||
|
|
||||||
value2string' g (VMeta i vs) b ws qs = CSusp i (\v -> value2string' g (apply g v vs) b ws qs)
|
value2string' g (VMeta i vs) b ws qs = CSusp i (\v -> value2string' g (apply g v vs) b ws qs)
|
||||||
value2string' g (VSusp i k vs) b ws qs = CSusp i (\v -> value2string' g (apply g (k v) vs) b ws qs)
|
value2string' g (VSusp i k vs) b ws qs = CSusp i (\v -> value2string' g (apply g (k v) vs) b ws qs)
|
||||||
|
value2string' g (VError e) b ws qs = CError e
|
||||||
value2string' g (VStr w1) True (w2:ws) qs = Const (False,(w1++w2):ws,qs)
|
value2string' g (VStr w1) True (w2:ws) qs = Const (False,(w1++w2):ws,qs)
|
||||||
value2string' g (VStr w) _ ws qs = Const (False,w :ws,qs)
|
value2string' g (VStr w) _ ws qs = Const (False,w :ws,qs)
|
||||||
value2string' g VEmpty b ws qs = Const (b,ws,qs)
|
value2string' g VEmpty b ws qs = Const (b,ws,qs)
|
||||||
@@ -1236,12 +1246,14 @@ value2int g (VMeta i vs) = CSusp i (\v -> value2int g (apply g v vs))
|
|||||||
value2int g (VSusp i k vs) = CSusp i (\v -> value2int g (apply g (k v) vs))
|
value2int g (VSusp i k vs) = CSusp i (\v -> value2int g (apply g (k v) vs))
|
||||||
value2int g (VInt n) = Const n
|
value2int g (VInt n) = Const n
|
||||||
value2int g (VFV s vs) = CFV s (fmap (value2int g) vs)
|
value2int g (VFV s vs) = CFV s (fmap (value2int g) vs)
|
||||||
|
value2int g (VError e) = CError e
|
||||||
value2int g _ = RunTime
|
value2int g _ = RunTime
|
||||||
|
|
||||||
value2float g (VMeta i vs) = CSusp i (\v -> value2float g (apply g v vs))
|
value2float g (VMeta i vs) = CSusp i (\v -> value2float g (apply g v vs))
|
||||||
value2float g (VSusp i k vs) = CSusp i (\v -> value2float g (apply g (k v) vs))
|
value2float g (VSusp i k vs) = CSusp i (\v -> value2float g (apply g (k v) vs))
|
||||||
value2float g (VFlt f) = Const f
|
value2float g (VFlt f) = Const f
|
||||||
value2float g (VFV s vs) = CFV s (fmap (value2float g) vs)
|
value2float g (VFV s vs) = CFV s (fmap (value2float g) vs)
|
||||||
|
value2float g (VError e) = CError e
|
||||||
value2float g _ = RunTime
|
value2float g _ = RunTime
|
||||||
|
|
||||||
value2expr g xs (VApp (m,f) vs)
|
value2expr g xs (VApp (m,f) vs)
|
||||||
@@ -1256,6 +1268,7 @@ value2expr g xs (VClosure env s (Abs b x t)) =
|
|||||||
value2expr g xs (VInt n) = pure (ELit (LInt n))
|
value2expr g xs (VInt n) = pure (ELit (LInt n))
|
||||||
value2expr g xs (VFlt f) = pure (ELit (LFlt f))
|
value2expr g xs (VFlt f) = pure (ELit (LFlt f))
|
||||||
value2expr g xs (VFV s vs) = CFV s (fmap (value2expr g xs) vs)
|
value2expr g xs (VFV s vs) = CFV s (fmap (value2expr g xs) vs)
|
||||||
|
value2expr g xs (VError e) = CError e
|
||||||
value2expr g xs v = fmap (ELit . LStr) (value2string g v)
|
value2expr g xs v = fmap (ELit . LStr) (value2string g v)
|
||||||
|
|
||||||
newtype Choice = Choice { unchoice :: Integer }
|
newtype Choice = Choice { unchoice :: Integer }
|
||||||
|
|||||||
Reference in new issue
Block a user