Skip to content

Commit 5278b55

Browse files
GulinSSspcfox
andcommitted
[ refactor ] Refactor and optimize CaseBuilder (#16)
* [ refactor ] Replace `rev` with `reverse` and make `LengthMatch` arguments erased * [ refactor ] Move `embed'` definition into `FreelyEmbeddable` implementation * [ refactor ] Optimize `mkPatClause.mkNames` in `CaseBuilder` * [ refactor ] Swap parameters of `NamedPats` * [ refactor ] Remove `snoc` for `NamedPats` * [ refactor ] Use `List` for forward order in `CaseBuilder.idr` * [ refactor ] Swap the arguments of `PatClause`, `Group` and `ScoredPats` like `NamedPats` * [ refactor ] Merge simillar cases in `nextNames'` and `mkNames` * [ cleanup ] Remove redudant functions Cherry-picked from GulinSS#16 Fully authored by Viktor Yudov <[email protected]> Co-authored-by: Viktor Yudov <[email protected]>
1 parent 89b8ee2 commit 5278b55

File tree

7 files changed

+392
-431
lines changed

7 files changed

+392
-431
lines changed

src/Core/Case/CaseBuilder.idr

Lines changed: 292 additions & 363 deletions
Large diffs are not rendered by default.

src/Core/Name/Scoped.idr

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,16 @@ interface GenWeaken (0 tm : Scoped) where
188188

189189
export
190190
genWeaken : GenWeaken tm =>
191-
SizeOf outer -> tm (Scope.addInner local outer) -> tm (Scope.addInner local (Scope.addInner [<n] outer))
192-
genWeaken l = genWeakenNs l (suc zero)
191+
SizeOf outer -> tm (Scope.addInner local outer) -> tm (Scope.addInner (Scope.bind local n) outer)
192+
genWeaken l = rewrite sym $ appendAssociative local [<n] outer in genWeakenNs l (suc zero)
193+
194+
export
195+
genWeakenFishily : GenWeaken tm =>
196+
SizeOf outer -> tm (Scope.ext local outer) -> tm (Scope.ext (Scope.bind local n) outer)
197+
genWeakenFishily
198+
= rewrite fishAsSnocAppend local outer in
199+
rewrite fishAsSnocAppend (local :<n) outer in
200+
genWeaken . cast
193201

194202
export
195203
weakensN : Weaken tm =>

src/Core/Normalise.idr

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,8 +328,8 @@ normalisePrims : {auto c : Ref Ctxt Defs} -> {vs : _} ->
328328
-- list of primitives
329329
List Name ->
330330
-- view of the potential redex
331-
(n : Name) -> -- function name
332-
(args : List arg) -> -- arguments from inside out (arg1, ..., argk)
331+
(n : Name) -> -- function name
332+
(args : SnocList arg) -> -- arguments in reversed order [<arg1, ..., argk]
333333
-- actual term to evaluate if needed
334334
(tm : Term vs) -> -- original term (n arg1 ... argk)
335335
Env Term vs -> -- evaluation environment
@@ -338,7 +338,7 @@ normalisePrims : {auto c : Ref Ctxt Defs} -> {vs : _} ->
338338
normalisePrims boundSafe viewConstant all prims n args tm env
339339
= do let True = isPrimName prims !(getFullName n) -- is a primitive
340340
| _ => pure Nothing
341-
let (mc :: _) = args -- with at least one argument
341+
let (_ :< mc) = args -- with at least one argument
342342
| _ => pure Nothing
343343
let (Just c) = viewConstant mc -- that is a constant
344344
| _ => pure Nothing

src/Core/TT/Var.idr

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,18 @@ data IsVar : a -> Nat -> SnocList a -> Type where
3838

3939
%name IsVar idx
4040

41+
namespace List
42+
||| IsVar n k ns is a proof that
43+
||| the name n
44+
||| is a position k
45+
||| in the list ns
46+
public export
47+
data IsVarL : a -> Nat -> List a -> Type where
48+
First : IsVarL n Z (n :: ns)
49+
Later : IsVarL n i ns -> IsVarL n (S i) (m :: ns)
50+
51+
%name IsVarL idx
52+
4153
export
4254
finIdx : {idx : _} -> (0 prf : IsVar x idx vars) ->
4355
Fin (length vars)
@@ -83,12 +95,19 @@ dropIsVar :
8395
dropIsVar (xs :< _) First = xs
8496
dropIsVar (xs :< n) (Later p) = dropIsVar xs p :< n
8597

98+
||| Compute the remaining scope once the target variable has been removed
99+
public export
100+
dropIsVarL : (ns : List a) -> {idx : Nat} -> (0 _ : IsVarL nm idx ns) -> List a
101+
dropIsVarL (_ :: xs) First = xs
102+
dropIsVarL (n :: xs) (Later p) = n :: dropIsVarL xs p
103+
86104
||| Throw in extra variables on the outer side of the context
87105
||| This is essentially the identity function
88106
||| This is slow so we ensure it's only used in a runtime irrelevant manner
89107
export
90108
0 embedIsVar : IsVar x idx vars -> IsVar x idx (more ++ vars)
91-
embedIsVar tm = believe_me tm
109+
embedIsVar First = First
110+
embedIsVar (Later p) = Later (embedIsVar p)
92111

93112
||| Throw in extra variables on the local end of the context.
94113
||| This is slow so we ensure it's only used in a runtime irrelevant manner
@@ -97,6 +116,13 @@ export
97116
weakenIsVar (MkSizeOf Z Z) p = p
98117
weakenIsVar (MkSizeOf (S k) (S l)) p = Later (weakenIsVar (MkSizeOf k l) p)
99118

119+
||| Throw in extra variables on the local end of the context.
120+
||| This is slow so we ensure it's only used in a runtime irrelevant manner
121+
export
122+
0 weakenIsVarL : (s : SizeOf ns) -> IsVarL x idx xs -> IsVarL x (size s + idx) (ns ++ xs)
123+
weakenIsVarL (MkSizeOf Z Z) p = p
124+
weakenIsVarL (MkSizeOf (S k) (S l)) p = Later (weakenIsVarL (MkSizeOf k l) p)
125+
100126
0 locateIsVarLT :
101127
(s : SizeOf local) ->
102128
So (idx < size s) ->
@@ -203,6 +229,13 @@ record NVar {0 a : Type} (nm : a) (vars : SnocList a) where
203229
{nvarIdx : Nat}
204230
0 nvarPrf : IsVar nm nvarIdx vars
205231

232+
namespace List
233+
public export
234+
record NVarL {0 a : Type} (nm : a) (vars : List a) where
235+
constructor MkNVarL
236+
{nvarIdx : Nat}
237+
0 nvarPrf : IsVarL nm nvarIdx vars
238+
206239
namespace NVar
207240
export
208241
later : NVar nm ns -> NVar nm (ns :< n)
@@ -268,8 +301,11 @@ locateVar s v = bimap forgetName forgetName
268301

269302
export
270303
weakenNVar : SizeOf ns -> NVar name inner -> NVar name (inner ++ ns)
271-
weakenNVar s (MkNVar {nvarIdx} p)
272-
= MkNVar {nvarIdx = plus (size s) nvarIdx} (weakenIsVar s p)
304+
weakenNVar s (MkNVar p) = MkNVar (weakenIsVar s p)
305+
306+
export
307+
weakenNVarL : SizeOf ns -> NVarL nm inner -> NVarL nm (ns ++ inner)
308+
weakenNVarL s (MkNVarL p) = MkNVarL (weakenIsVarL s p)
273309

274310
export
275311
embedNVar : NVar name vars -> NVar name (more ++ vars)

src/Libraries/Data/SnocList/Extra.idr

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,6 @@ revOnto xs (vs :< v)
3333
rewrite Extra.revOnto [<v] vs in
3434
rewrite appendAssociative xs [<v] (reverse vs) in Refl
3535

36-
export
37-
lookup : Eq a => a -> SnocList (a, b) -> Maybe b
38-
lookup n [<] = Nothing
39-
lookup n (ns :< (x, n')) = if x == n then Just n' else lookup n ns
40-
41-
lengthDistributesOverAppend
42-
: (xs, ys : SnocList a)
43-
-> length (ys ++ xs) = length xs + length ys
44-
lengthDistributesOverAppend [<] ys = Refl
45-
lengthDistributesOverAppend (xs :< x) ys =
46-
cong S $ lengthDistributesOverAppend xs ys
47-
4836
export
4937
lengthDistributesOverFish : (sx : SnocList a) -> (ys : List a) ->
5038
length (sx <>< ys) === length sx + length ys

src/TTImp/Elab/App.idr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,7 @@ checkApp rig elabinfo nest env fc (IVar fc' n) expargs autoargs namedargs exp
855855
= do tm <- Normalise.normalisePrims (`boundSafe` elabMode elabinfo)
856856
isIPrimVal
857857
(onLHS (elabMode elabinfo))
858-
prims n expargs (fst res) env
858+
prims n (cast {to=SnocList RawImp} expargs) (fst res) env
859859
pure (fromMaybe (fst res) tm, snd res)
860860

861861
where

tests/refc/callingConvention/expected

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ Value *Main_main_10
194194
, Value * var_1
195195
)
196196
{
197-
Value * var_2 = idris2_getPredefinedInteger(0); // Main:10:30--10:36
197+
Value * var_2 = idris2_getPredefinedInteger(0); // Main:14:25--14:31
198198
Value * var_3 = idris2_trampoline(Main_last(var_0, var_2));
199199
// Prelude.Show:110:1--112:50
200200
Value * var_4 = idris2_trampoline(Prelude_Show_show_Show_Integer(var_3));
@@ -205,9 +205,9 @@ Value *Main_main_10
205205
Value * var_6 = primVar_50; // Prelude.IO:98:22--98:34
206206
Value *closure_51 = (Value *)idris2_mkClosure((Value *(*)())Prelude_IO_prim__putStr, 2, 2);
207207
// Prelude.IO:98:22--98:34
208-
((Value_Closure*)closure_48)->args[0] = var_6;
209-
((Value_Closure*)closure_48)->args[1] = var_1;
210-
return closure_48;
208+
((Value_Closure*)closure_51)->args[0] = var_6;
209+
((Value_Closure*)closure_51)->args[1] = var_1;
210+
return closure_51;
211211
}
212212
Value *Main_main_9
213213
(
@@ -243,20 +243,20 @@ Value *Main_main_9
243243
// constructor Prelude.Interfaces.MkFoldable // Prelude.Types:656:1--669:59
244244
Value_Constructor* constructor_62 = idris2_newConstructor(6, 0);
245245
// Prelude.Types:656:1--669:59
246-
constructor_59->args[0] = var_5;
247-
constructor_59->args[1] = var_6;
248-
constructor_59->args[2] = var_7;
249-
constructor_59->args[3] = var_8;
250-
constructor_59->args[4] = var_9;
251-
constructor_59->args[5] = var_10;
252-
Value * var_12 = (Value*)constructor_59; // Main:10:13--10:17
253-
Value *closure_60 = (Value *)idris2_mkClosure((Value *(*)())Prelude_Interfaces_for_, 4, 4);
254-
// Main:10:13--10:17
255-
((Value_Closure*)closure_60)->args[0] = var_11;
256-
((Value_Closure*)closure_60)->args[1] = var_12;
257-
((Value_Closure*)closure_60)->args[2] = var_0;
258-
((Value_Closure*)closure_60)->args[3] = var_1;
259-
return closure_60;
246+
constructor_62->args[0] = var_5;
247+
constructor_62->args[1] = var_6;
248+
constructor_62->args[2] = var_7;
249+
constructor_62->args[3] = var_8;
250+
constructor_62->args[4] = var_9;
251+
constructor_62->args[5] = var_10;
252+
Value * var_12 = (Value*)constructor_62; // Main:14:8--14:12
253+
Value *closure_63 = (Value *)idris2_mkClosure((Value *(*)())Prelude_Interfaces_for_, 4, 4);
254+
// Main:14:8--14:12
255+
((Value_Closure*)closure_63)->args[0] = var_11;
256+
((Value_Closure*)closure_63)->args[1] = var_12;
257+
((Value_Closure*)closure_63)->args[2] = var_0;
258+
((Value_Closure*)closure_63)->args[3] = var_1;
259+
return closure_63;
260260
}
261261
Value *Main_main_8
262262
(
@@ -269,12 +269,12 @@ Value *Main_main_8
269269
{
270270
idris2_removeReference(var_0);
271271
idris2_removeReference(var_1);
272-
Value *closure_61 = (Value *)idris2_mkClosure((Value *(*)())Prelude_Types_foldMap_Foldable_List, 3, 3);
272+
Value *closure_64 = (Value *)idris2_mkClosure((Value *(*)())Prelude_Types_foldMap_Foldable_List, 3, 3);
273273
// Prelude.Types:656:1--669:59
274-
((Value_Closure*)closure_61)->args[0] = var_2;
275-
((Value_Closure*)closure_61)->args[1] = var_3;
276-
((Value_Closure*)closure_61)->args[2] = var_4;
277-
return closure_61;
274+
((Value_Closure*)closure_64)->args[0] = var_2;
275+
((Value_Closure*)closure_64)->args[1] = var_3;
276+
((Value_Closure*)closure_64)->args[2] = var_4;
277+
return closure_64;
278278
}
279279
Value *Main_main_7
280280
(
@@ -299,13 +299,13 @@ Value *Main_main_6
299299
idris2_removeReference(var_0);
300300
idris2_removeReference(var_1);
301301
idris2_removeReference(var_2);
302-
Value *closure_62 = (Value *)idris2_mkClosure((Value *(*)())Prelude_Types_foldlM_Foldable_List, 4, 4);
302+
Value *closure_65 = (Value *)idris2_mkClosure((Value *(*)())Prelude_Types_foldlM_Foldable_List, 4, 4);
303303
// Prelude.Types:656:1--669:59
304-
((Value_Closure*)closure_62)->args[0] = var_3;
305-
((Value_Closure*)closure_62)->args[1] = var_4;
306-
((Value_Closure*)closure_62)->args[2] = var_5;
307-
((Value_Closure*)closure_62)->args[3] = var_6;
308-
return closure_62;
304+
((Value_Closure*)closure_65)->args[0] = var_3;
305+
((Value_Closure*)closure_65)->args[1] = var_4;
306+
((Value_Closure*)closure_65)->args[2] = var_5;
307+
((Value_Closure*)closure_65)->args[3] = var_6;
308+
return closure_65;
309309
}
310310
Value *Main_main_5
311311
(
@@ -314,10 +314,10 @@ Value *Main_main_5
314314
)
315315
{
316316
idris2_removeReference(var_0);
317-
Value *closure_63 = (Value *)idris2_mkClosure((Value *(*)())Prelude_Types_null_Foldable_List, 1, 1);
317+
Value *closure_66 = (Value *)idris2_mkClosure((Value *(*)())Prelude_Types_null_Foldable_List, 1, 1);
318318
// Prelude.Types:656:1--669:59
319-
((Value_Closure*)closure_63)->args[0] = var_1;
320-
return closure_63;
319+
((Value_Closure*)closure_66)->args[0] = var_1;
320+
return closure_66;
321321
}
322322
Value *Main_main_4
323323
(
@@ -330,12 +330,12 @@ Value *Main_main_4
330330
{
331331
idris2_removeReference(var_0);
332332
idris2_removeReference(var_1);
333-
Value *closure_64 = (Value *)idris2_mkClosure((Value *(*)())Prelude_Types_foldl_Foldable_List, 3, 3);
333+
Value *closure_67 = (Value *)idris2_mkClosure((Value *(*)())Prelude_Types_foldl_Foldable_List, 3, 3);
334334
// Prelude.Types:656:1--669:59
335-
((Value_Closure*)closure_64)->args[0] = var_2;
336-
((Value_Closure*)closure_64)->args[1] = var_3;
337-
((Value_Closure*)closure_64)->args[2] = var_4;
338-
return closure_64;
335+
((Value_Closure*)closure_67)->args[0] = var_2;
336+
((Value_Closure*)closure_67)->args[1] = var_3;
337+
((Value_Closure*)closure_67)->args[2] = var_4;
338+
return closure_67;
339339
}
340340
Value *Main_main_3
341341
(
@@ -348,12 +348,12 @@ Value *Main_main_3
348348
{
349349
idris2_removeReference(var_0);
350350
idris2_removeReference(var_1);
351-
Value *closure_65 = (Value *)idris2_mkClosure((Value *(*)())Prelude_Types_foldr_Foldable_List, 3, 3);
351+
Value *closure_68 = (Value *)idris2_mkClosure((Value *(*)())Prelude_Types_foldr_Foldable_List, 3, 3);
352352
// Prelude.Types:656:1--669:59
353-
((Value_Closure*)closure_65)->args[0] = var_2;
354-
((Value_Closure*)closure_65)->args[1] = var_3;
355-
((Value_Closure*)closure_65)->args[2] = var_4;
356-
return closure_65;
353+
((Value_Closure*)closure_68)->args[0] = var_2;
354+
((Value_Closure*)closure_68)->args[1] = var_3;
355+
((Value_Closure*)closure_68)->args[2] = var_4;
356+
return closure_68;
357357
}
358358
Value *Main_main_2
359359
(
@@ -393,10 +393,10 @@ Value *Main_main_0
393393
{
394394
idris2_removeReference(var_0);
395395
idris2_removeReference(var_1);
396-
Value *closure_66 = (Value *)idris2_mkClosure((Value *(*)())Prelude_IO_map_Functor_IO, 3, 3);
396+
Value *closure_69 = (Value *)idris2_mkClosure((Value *(*)())Prelude_IO_map_Functor_IO, 3, 3);
397397
// Prelude.IO:15:1--17:38
398-
((Value_Closure*)closure_66)->args[0] = var_2;
399-
((Value_Closure*)closure_66)->args[1] = var_3;
400-
((Value_Closure*)closure_66)->args[2] = var_4;
401-
return closure_66;
398+
((Value_Closure*)closure_69)->args[0] = var_2;
399+
((Value_Closure*)closure_69)->args[1] = var_3;
400+
((Value_Closure*)closure_69)->args[2] = var_4;
401+
return closure_69;
402402
}

0 commit comments

Comments
 (0)