Skip to content

Commit

Permalink
Merge pull request #20 from rhennigan/bugfix/transform-paclet-symbols
Browse files Browse the repository at this point in the history
Bugfix/transform paclet symbols
  • Loading branch information
rhennigan committed Nov 8, 2022
2 parents 1edf65a + 3b9490e commit 9f1dea7
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 22 deletions.
25 changes: 13 additions & 12 deletions Kernel/CanonicalForms/Rules.wl
Original file line number Diff line number Diff line change
Expand Up @@ -881,14 +881,15 @@ listRules = Inline[ { $assocOuter, $assocInner, $joinable }, HoldComplete[

TakeLargestBy[ expr_, fun_, i_ ] :> Take[ SortBy[ expr, fun ], -i ],

{ a: same_RandomInteger, b: same_RandomInteger .. } :>
WithHolding[
{
len = Length @ HoldComplete[ a, b ],
i = NewLocalSymbol[ ]
},
Table[ same, { i, 1, len, 1 } ]
],
{ a: same_RandomInteger, b: same_RandomInteger .. } /;
Length @ HoldComplete[ a, b ] >= 4 :>
WithHolding[
{
len = Length @ HoldComplete[ a, b ],
i = NewLocalSymbol[ ]
},
Table[ same, { i, 1, len, 1 } ]
],

Length[ { a___? inertAtomQ } ] :>
RuleCondition @ Length @ HoldComplete[ a ]
Expand Down Expand Up @@ -1023,10 +1024,10 @@ randomRules = Inline[ $intType, HoldComplete[
RandomInteger[ ] :> RandomInteger[ { 0, 1 } ],
RandomInteger[ n_? IntTypeQ ] :> RandomInteger[ { 0, n } ]
,
{ r1: RandomInteger[ n_? IntTypeQ ], r2: RandomInteger[ n_ ] .. } :>
WithHolding[ { len = Length @ HoldComplete[ r1, r2 ] },
RandomInteger[ n, len ]
]
{ r1: RandomInteger[ n_? IntTypeQ ], r2: RandomInteger[ n_ ] .. } :>
With[ { len = Length @ HoldComplete[ r1, r2 ] },
RandomInteger[ n, len ] /; len >= 4
]
,
RandomReal[ ] :> RandomReal[ 1 ],
RandomReal[ n_? HoldNumericQ ] :> RandomReal[ { 0, n } ],
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Config.wl
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ $RasterPatterns = HoldPattern @ Alternatives[
(* ::Section::Closed:: *)
(*Argument patterns*)

$$hold := Hold | HoldForm | HoldComplete | HoldPattern | $holdWrapper;
$$hold := Hold | HoldForm | HoldComplete | HoldPattern | $holdWrapper | topHold;

$$numConst = HoldPattern @ Alternatives[
Catalan,
Expand Down
21 changes: 12 additions & 9 deletions Kernel/Equivalence.wl
Original file line number Diff line number Diff line change
Expand Up @@ -327,12 +327,12 @@ iToCanonicalForm[ expr_, wrapper_, True, limit_, timeout_, post_ ] :=
Apply[
wrapper,
deleteAdjacentDuplicates @ Flatten @ {
{ HoldComplete @ expr },
{ topHold @ expr },
transformations,
{ $LastTransformation }
},
{ 1 }
]
] //. topHold[ e_ ] :> e
];

iToCanonicalForm[ expr_, wrapper_, False, limit_, timeout_, post_ ] :=
Expand All @@ -349,7 +349,7 @@ iToCanonicalForm[ expr_, wrapper_, False, limit_, timeout_, post_ ] :=
$LastTransformation
];

Replace[ res, HoldComplete[ e_ ] :> wrapper @ e ]
Replace[ res, topHold[ e_ ] :> wrapper @ e ]
];

ToCanonicalForm::cycle = "Infinite loop detected in transformations; returning early.";
Expand All @@ -359,7 +359,7 @@ cycleDetectTransform[ expr_, limit_, post_ ] :=
Module[ { next, previous, step },

markSeen @ expr;
next = previous = HoldComplete @ expr;
next = previous = expr;

step = Function[
next = postApply[ post, canonicalStepTransform @ # ];
Expand All @@ -377,7 +377,7 @@ cycleDetectTransform[ expr_, limit_, post_ ] :=
Catch[
FixedPoint[
step,
$LastTransformation = HoldComplete @ expr,
$LastTransformation = topHold @ expr,
limit
],
$tag
Expand All @@ -388,21 +388,24 @@ cycleDetectTransform[ expr_, limit_, post_ ] :=

seenQ[ ___ ] := False;

markSeen[ HoldComplete[ held_HoldComplete ] ] := markSeen @ held;
markSeen[ held_HoldComplete ] := (seenQ[ Verbatim[ held ] ] = True);
markSeen[ other_ ] := markSeen @ HoldComplete @ other;
markSeen[ topHold[ held_topHold ] ] := markSeen @ held;
markSeen[ held_topHold ] := (seenQ[ Verbatim[ held ] ] = True);
markSeen[ other_ ] := markSeen @ topHold @ other;


deleteAdjacentDuplicates[ list_ ] := First /@ Split @ list;

topHold // Attributes = { HoldAllComplete };
topHold[ e_topHold ] := e;

(* ::**********************************************************************:: *)
(* ::Subsubsection::Closed:: *)
(*preprocessCanonical*)

(* :!CodeAnalysis::Disable::SymbolVersionTooNew:: *)
preprocessCanonical[ expr_ ] := Sow[
$LastTransformation = ReplaceAll[
expr,
topHold @ expr,
{
Verbatim[ PacletSymbol ][
"Wolfram/CodeEquivalenceUtilities",
Expand Down
13 changes: 13 additions & 0 deletions Tests/TransformWrappers.wlt
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,17 @@ VerificationTest[
TestID -> "PacletSymbol-TransformHold@@Tests/TransformWrappers.wlt:44,1-48,2"
]

VerificationTest[
MakeCanonicalForm[
Range @ System`PacletSymbol[
"Wolfram/CodeEquivalenceUtilities",
"Wolfram`CodeEquivalenceUtilities`TransformHold"
][ 3 + 1 + 2 ],
Trace -> True
],
{ ___ },
SameTest -> MatchQ,
TestID -> "MakeCanonicalForm-Trace-EvaluationLeak@@Tests/TransformWrappers.wlt:50,1-61,2"
]

(* :!CodeAnalysis::EndBlock:: *)

0 comments on commit 9f1dea7

Please sign in to comment.