Skip to content

Commit 175b3d6

Browse files
committed
feat: allow nothing for operators
1 parent 01f01ac commit 175b3d6

File tree

5 files changed

+46
-18
lines changed

5 files changed

+46
-18
lines changed

src/Expression.jl

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ end
4141
Base.show(io::IO, x::Metadata) = print(io, "Metadata(", unpack_metadata(x), ")")
4242
@inline _copy(x) = copy(x)
4343
@inline _copy(x::NamedTuple) = copy_named_tuple(x)
44-
@inline _copy(x::Nothing) = nothing
44+
@inline _copy(::Nothing) = nothing
4545
@inline function copy_named_tuple(nt::NamedTuple)
4646
return NamedTuple{keys(nt)}(map(_copy, values(nt)))
4747
end
@@ -251,7 +251,13 @@ end
251251
function get_variable_names(
252252
ex::Expression, variable_names::Union{Nothing,AbstractVector{<:AbstractString}}=nothing
253253
)
254-
return variable_names === nothing ? ex.metadata.variable_names : variable_names
254+
return if variable_names !== nothing
255+
variable_names
256+
elseif hasproperty(ex.metadata, :variable_names)
257+
ex.metadata.variable_names
258+
else
259+
nothing
260+
end
255261
end
256262
function get_tree(ex::Expression)
257263
return ex.tree

src/ParametricExpression.jl

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,9 @@ end
8787
function ParametricExpression(
8888
tree::ParametricNode{T1};
8989
operators::Union{AbstractOperatorEnum,Nothing},
90-
variable_names,
90+
variable_names=nothing,
9191
parameters::AbstractMatrix{T2},
92-
parameter_names,
92+
parameter_names=nothing,
9393
) where {T1,T2}
9494
if !isnothing(parameter_names)
9595
@assert size(parameters, 1) == length(parameter_names)
@@ -202,18 +202,16 @@ function get_variable_names(
202202
ex::ParametricExpression,
203203
variable_names::Union{Nothing,AbstractVector{<:AbstractString}}=nothing,
204204
)
205-
return variable_names === nothing ? ex.metadata.variable_names : variable_names
205+
return if variable_names !== nothing
206+
variable_names
207+
elseif hasproperty(ex.metadata, :variable_names)
208+
ex.metadata.variable_names
209+
else
210+
nothing
211+
end
206212
end
207-
@inline _copy_with_nothing(x) = copy(x)
208-
@inline _copy_with_nothing(::Nothing) = nothing
209213
function Base.copy(ex::ParametricExpression; break_sharing::Val=Val(false))
210-
return ParametricExpression(
211-
copy(ex.tree; break_sharing=break_sharing);
212-
operators=_copy_with_nothing(ex.metadata.operators),
213-
variable_names=_copy_with_nothing(ex.metadata.variable_names),
214-
parameters=_copy_with_nothing(ex.metadata.parameters),
215-
parameter_names=_copy_with_nothing(ex.metadata.parameter_names),
216-
)
214+
return ParametricExpression(copy(ex.tree; break_sharing), copy(ex.metadata))
217215
end
218216
###############################################################################
219217

src/Strings.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ function string_tree(
139139
operators::Union{AbstractOperatorEnum,Nothing}=nothing;
140140
f_variable::F1=string_variable,
141141
f_constant::F2=string_constant,
142-
variable_names::Union{AbstractVector{<:AbstractString},Nothing}=nothing,
142+
variable_names=nothing,
143143
pretty::Union{Bool,Nothing}=nothing, # Not used, but can be used by other types
144144
# Deprecated
145145
raw::Union{Bool,Nothing}=nothing,
@@ -190,7 +190,7 @@ for io in ((), (:(io::IO),))
190190
operators::Union{AbstractOperatorEnum,Nothing}=nothing;
191191
f_variable::F1=string_variable,
192192
f_constant::F2=string_constant,
193-
variable_names::Union{AbstractVector{<:AbstractString},Nothing}=nothing,
193+
variable_names=nothing,
194194
pretty::Union{Bool,Nothing}=nothing, # Not used, but can be used by other types
195195
# Deprecated
196196
raw::Union{Bool,Nothing}=nothing,

src/StructuredExpression.jl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,13 @@ function get_variable_names(
143143
e::AbstractStructuredExpression,
144144
variable_names::Union{AbstractVector{<:AbstractString},Nothing}=nothing,
145145
)
146-
return variable_names === nothing ? get_metadata(e).variable_names : variable_names
146+
return if variable_names !== nothing
147+
variable_names
148+
elseif hasproperty(get_metadata(e), :variable_names)
149+
get_metadata(e).variable_names
150+
else
151+
nothing
152+
end
147153
end
148154
function get_scalar_constants(e::AbstractStructuredExpression)
149155
# Get constants for each inner expression

test/test_expressions.jl

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ end
269269

270270
@testitem "Miscellaneous expression calls" begin
271271
using DynamicExpressions
272-
using DynamicExpressions: get_tree, get_operators
272+
using DynamicExpressions: get_tree, get_operators, default_node_type
273273

274274
ex = @parse_expression(x1 + 1.5, binary_operators = [+], variable_names = ["x1"])
275275
@test DynamicExpressions.ExpressionModule.node_type(ex) <: Node
@@ -278,6 +278,24 @@ end
278278

279279
tree = get_tree(ex)
280280
@test_throws ArgumentError get_operators(tree, nothing)
281+
282+
# We can also define expressions without variable names, and it should work
283+
operators = OperatorEnum(; binary_operators=[+])
284+
for E in (Expression, ParametricExpression)
285+
N = default_node_type(E)
286+
kws = (; operators)
287+
if E === ParametricExpression
288+
kws = (; kws..., parameters=Matrix{Float64}(undef, 0, 0))
289+
end
290+
x1, x2 = (E(N(Float64; feature=i); kws...) for i in 1:2)
291+
x1000 = E(N(Float64; feature=1000); kws...)
292+
@test string(x1 + x2 + x1000) == "(x1 + x2) + x1000"
293+
# And also with structured expressions
294+
x1 = StructuredExpression(
295+
(; x1, x2, x1000); operators, structure=nt -> nt.x1 + nt.x2 + nt.x1000
296+
)
297+
@test string(x1) == "(x1 + x2) + x1000"
298+
end
281299
end
282300

283301
@testitem "Expression Literate examples" begin

0 commit comments

Comments
 (0)