11num_or_var (ex:: Number ) = true
22num_or_var (ex:: Symbol ) = true
3- num_or_var (ex:: Any ) = false
3+ num_or_var (ex:: Num ) = true
4+ num_or_var (ex:: typeof (+ )) = true
5+ num_or_var (ex:: typeof (* )) = true
6+ num_or_var (ex:: Any ) = checkop (op (ex))
7+ checkop (op:: Symbol ) = true
8+ checkop (op:: Any ) = false
9+
410function num_or_var (ex:: Vector )
511 for i in ex
612 if ~ num_or_var (i)
@@ -16,12 +22,40 @@ function is_factor(ex::Expr)
1622 num_or_var (ex. args[2 : end ])
1723end
1824
19- factor! (ex:: Number ; assignments:: Vector{Assignment} ) = assignments
20- factor! (ex:: Symbol ; assignments:: Vector{Assignment} ) = assignments
25+ # factor!(ex::Number; assignments::Vector{Assignment}) = assignments
26+ # factor!(ex::Symbol; assignments::Vector{Assignment}) = assignments
2127factor! (ex:: NTuple ; assignments:: Vector{Assignment} ) = factor! (Expr (:($ ([i for i in ex]. .. ))), assignments= assignments)
2228factor! (ex:: Tuple ; assignments:: Vector{Assignment} ) = factor! (Expr (:($ ([i for i in ex]. .. ))), assignments= assignments)
2329
30+ function factor! (ex:: Number ; assignments = Assignment[])
31+ new = Assignment (gensym (:aux ), ex)
32+ index = findall (x -> x. rhs== new. rhs, assignments)
33+ if isempty (index)
34+ push! (assignments, new)
35+ else
36+ p = collect (1 : length (assignments))
37+ deleteat! (p, index[1 ])
38+ push! (p, index[1 ])
39+ assignments[:] = assignments[p]
40+ end
41+ return assignments
42+ end
43+ function factor! (ex:: Symbol ; assignments = Assignment[])
44+ new = Assignment (gensym (:aux ), ex)
45+ index = findall (x -> x. rhs== new. rhs, assignments)
46+ if isempty (index)
47+ push! (assignments, new)
48+ else
49+ p = collect (1 : length (assignments))
50+ deleteat! (p, index[1 ])
51+ push! (p, index[1 ])
52+ assignments[:] = assignments[p]
53+ end
54+ return assignments
55+ end
56+
2457function factor! (ex:: Expr ; assignments = Assignment[])
58+ binarize! (ex)
2559 if is_factor (ex)
2660 new = Assignment (gensym (:aux ), ex)
2761 index = findall (x -> x. rhs== new. rhs, assignments)
@@ -31,7 +65,7 @@ function factor!(ex::Expr; assignments = Assignment[])
3165 p = collect (1 : length (assignments))
3266 deleteat! (p, index[1 ])
3367 push! (p, index[1 ])
34- assignments = assignments[p]
68+ assignments[:] = assignments[p]
3569 end
3670 return assignments
3771 end
@@ -40,12 +74,12 @@ function factor!(ex::Expr; assignments = Assignment[])
4074 if num_or_var (arg)
4175 push! (new_expr, arg)
4276 else
43- assignments = factor! (arg, assignments= assignments)
77+ factor! (arg, assignments= assignments)
4478 push! (new_expr, assignments[end ]. lhs)
4579 end
4680 end
4781 pushfirst! (new_expr, :call )
48- assignments = factor! (Expr (:($ ([i for i in new_expr]. .. ))), assignments= assignments)
82+ factor! (Expr (:($ ([i for i in new_expr]. .. ))), assignments= assignments)
4983 return assignments
5084end
5185
0 commit comments