@@ -10,11 +10,11 @@ Examples of use can be found in TestSymbolic.jl
1010"""
1111module Symbolic
1212
13- export removeBlock, makeDerVar, append, prepend, Incidence, findIncidence!, linearFactor, solveEquation,
13+ export removeBlock, removeQuoteNode, makeDerVar, append, prepend, Incidence, findIncidence!, linearFactor, solveEquation,
1414 isLinear, getCoefficients, substitute, removeUnits, resetEventCounters, getEventCounters, substituteForEvents
1515
1616using Base. Meta: isexpr
17- # using OrderedCollections
17+ using OrderedCollections
1818using ModiaBase. Simplify
1919using Unitful
2020using Measurements
@@ -29,16 +29,33 @@ Remove :block with LineNumberNode from expressions
2929* `return `e`: ex with :block removed
3030"""
3131removeBlock (ex) = ex
32- # removeBlock(arr::Array{Any,1}) = [removeBlock(a) for a in arr]
32+ removeBlock (arr:: Array{Any,1} ) = [removeBlock (a) for a in arr]
3333removeBlock (arr:: Array{Expr,1} ) = [removeBlock (a) for a in arr]
34+ removeBlock (q:: QuoteNode ) = q
35+ # if typeof(q.value) == Symbol; q.value else q end # begin print("QuoteNode: "); dump(q); q; end # q.value
36+ removeBlock (d:: OrderedDict ) = OrderedDict {Symbol, Any} ([(k,removeBlock (v)) for (k,v) in d])
37+
3438function removeBlock (ex:: Expr )
35- if isexpr (ex, :block ) && typeof (ex. args[ 1 ] ) == LineNumberNode && length (ex. args) == 2
39+ if isexpr (ex, :block ) && length (ex. args) == 2 && typeof (ex. args[ 1 ] ) == LineNumberNode
3640 ex. args[2 ]
41+ elseif isexpr (ex, :block ) && length (ex. args) == 3 && typeof (ex. args[1 ]) == LineNumberNode && typeof (ex. args[2 ]) == LineNumberNode
42+ ex. args[3 ]
3743 else
3844 Expr (ex. head, [removeBlock (arg) for arg in ex. args]. .. )
3945 end
4046end
4147
48+ removeQuoteNode (ex) = ex
49+ removeQuoteNode (arr:: Array{Any,1} ) = [removeQuoteNode (a) for a in arr]
50+ removeQuoteNode (arr:: Array{Expr,1} ) = [removeQuoteNode (a) for a in arr]
51+ removeQuoteNode (q:: QuoteNode ) = q. value
52+ # if typeof(q.value) == Symbol; q.value else q end # begin print("QuoteNode: "); dump(q); q; end # q.value
53+ removeQuoteNode (d:: OrderedDict ) = OrderedDict {Symbol, Any} ([(k,removeQuoteNode (v)) for (k,v) in d])
54+
55+ function removeQuoteNode (ex:: Expr )
56+ Expr (ex. head, [removeQuoteNode (arg) for arg in ex. args]. .. )
57+ end
58+
4259prependPar (ex, prefix, parameters= [], inputs= []) = ex
4360
4461function prependPar (ex:: Symbol , prefix, parameters= [], inputs= [])
@@ -237,7 +254,7 @@ Traverses an expression and finds incidences of Symbols and der(...)
237254* `incidence`: array of incidences. New incidences of `ex` are pushed.
238255"""
239256findIncidence! (ex, incidence:: Array{Incidence,1} ) = nothing
240- findIncidence! (s:: Symbol , incidence:: Array{Incidence,1} ) = begin if s != :(:); push! (incidence, s) end end
257+ findIncidence! (s:: Symbol , incidence:: Array{Incidence,1} ) = begin if ! (s in [ :(:), :end ] ); push! (incidence, s) end end
241258findIncidence! (arr:: Array{Any,1} , incidence:: Array{Incidence,1} ) = [findIncidence! (a, incidence) for a in arr]
242259findIncidence! (arr:: Array{Expr,1} , incidence:: Array{Incidence,1} ) = [findIncidence! (a, incidence) for a in arr]
243260function findIncidence! (ex:: Expr , incidence:: Array{Incidence,1} )
0 commit comments