@@ -179,50 +179,65 @@ type TDict a = Map a Term
179
179
type TransM a = StateT (TDict a ) ORefM
180
180
type TransT a = StateT (TDict a )
181
181
182
+ {-
182
183
addPredefs :: MonadTG m => TDict A.Expr -> m (TDict A.Expr)
183
184
addPredefs dict = do
184
185
ty <- predefType
185
186
return $ Map.insert A.Typ ty dict
186
187
188
+
187
189
trans :: (Signature Term sig, MonadReader sig m, MonadTG m) =>
188
190
Env -> A.Expr -> m Term
189
191
trans rho e = -- trace ("translating " ++ show e) $ do
190
192
evalStateT (transT e) =<< addPredefs
191
193
(Map.mapKeysMonotonic (A.Ident . A.Var) rho)
194
+ -}
195
+
196
+ addPredefs :: MonadTG m => TDict BTm -> m (TDict BTm )
197
+ addPredefs dict = do
198
+ ty <- predefType
199
+ return $ Map. insert (BSort Type ) ty dict
200
+
201
+ trans :: (Signature Term sig , MonadReader sig m , MonadTG m ) =>
202
+ Env -> A. Expr -> m Term
203
+ trans rho e = -- trace ("translating " ++ show e) $ do
204
+ evalStateT (transB (toLocallyNameless e)) =<< addPredefs
205
+ (Map. mapKeysMonotonic BVar rho)
206
+
192
207
193
- {-
194
208
-- | From locally nameless to Term.
195
209
transB :: (Signature Term sig , MonadReader sig m , MonadTG m ) =>
196
210
BTm -> TransT BTm m Term
197
211
transB = transG transB'
198
212
199
213
transB' :: (Signature Term sig , MonadReader sig m , MonadTG m ) =>
200
- BTm -> TransT BTm m Term'
214
+ BTm -> TransT BTm m ( Either Term Term' )
201
215
transB' e = do
202
216
let (f, sp) = appView e
203
217
if null sp then
204
218
case f of
205
- B (DBIndex
206
- BCon x -> con x . symbType . sigLookup' (A.uid x) <$> ask
219
+ B (DBIndex i n) -> Left <$> transB ( BVar n)
220
+ BCon x -> Right <$> ( con x . symbType . sigLookup' (A. uid x) <$> ask)
207
221
BDef x -> do
208
222
SigDef t v <- sigLookup' (A. uid x) <$> ask
209
- return $ def x t v
223
+ Right <$> ( return $ def x t v)
210
224
BVar n -> -- free variable
211
225
-- fail ("transB': unbound variable " ++ A.suggestion n)
212
226
-- trace ("transB': unbound variable " ++ A.suggestion n)
213
- return $ Var n -- only for binding in Lam and Pi
214
- -- A.Typ -> predefType -- impossible case
215
- BLam n e -> Abs <$> transB (A.Ident $ A.Var n) <*> transB e
216
- BConstLam e -> K <$> transB e
217
- BPi a b -> Fun <$> transB a <*> transB b
227
+ Right <$> (return $ Var n) -- only for binding in Lam and Pi
228
+ BLam n e -> do
229
+ x <- transAddBind BVar n
230
+ Right . Abs x <$> transB e
231
+ BConstLam e -> Right . K <$> transB e
232
+ BPi a b -> Right <$> (Fun <$> transB a <*> transB b)
218
233
else do
219
234
r <- transB f
220
- App r <$> (mapM transB sp)
221
- -}
235
+ Right . App r <$> (mapM transB sp)
236
+
222
237
223
238
-- | Generic to Term translator.
224
239
transG :: (Signature Term sig , MonadReader sig m , MonadTG m , Ord a , Show a ) =>
225
- (a -> TransT a m Term' ) -> a -> TransT a m Term
240
+ (a -> TransT a m ( Either Term Term' ) ) -> a -> TransT a m Term
226
241
transG transT' e = do
227
242
dict <- get
228
243
case Map. lookup e dict of -- TODO compare upto alpha!
@@ -231,10 +246,14 @@ transG transT' e = do
231
246
traceM $ return (" ==> found translation for " ++ show e)
232
247
return r
233
248
Nothing -> do
234
- r <- newORef =<< transT' e
235
- -- traceM $ return ("adding translation for " ++ show e)
236
- put $ Map. insert e r dict
237
- return r
249
+ rt <- transT' e
250
+ case rt of
251
+ Left r -> return r
252
+ Right t -> do
253
+ r <- newORef t
254
+ -- traceM $ return ("adding translation for " ++ show e)
255
+ put $ Map. insert e r dict
256
+ return r
238
257
239
258
transAddBind :: (Signature Term sig , MonadReader sig m , MonadTG m , Ord a ) =>
240
259
(A. Name -> a ) -> A. Name -> TransT a m Term
@@ -266,7 +285,7 @@ def x t v = Def x t v []
266
285
267
286
transT :: (Signature Term sig , MonadReader sig m , MonadTG m ) =>
268
287
A. Expr -> TransT A. Expr m Term
269
- transT = transG transT'
288
+ transT = transG ( Right <.> transT')
270
289
271
290
transT' :: (Signature Term sig , MonadReader sig m , MonadTG m ) =>
272
291
A. Expr -> TransT A. Expr m Term'
0 commit comments