From 5a7fc0518f8b84bc3be1d8f3a8312296e3cfbd6d Mon Sep 17 00:00:00 2001 From: Neven Sajko Date: Mon, 8 Sep 2025 04:09:30 +0200 Subject: [PATCH 1/2] prevent adding methods to the functions `>` and `>=` As documented, the intended way to implement `>` is to add a method to `<`. Similarly with `>=`. A package should never add a method to either `>` or `>=`. --- src/dual.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dual.jl b/src/dual.jl index 179c48d3..a7881064 100644 --- a/src/dual.jl +++ b/src/dual.jl @@ -383,7 +383,7 @@ end # Before PR#481 this loop ran over this list: # BINARY_PREDICATES = Symbol[:isequal, :isless, :<, :>, :(==), :(!=), :(<=), :(>=)] # Not a minimal set, as Base defines some in terms of others. -for pred in [:<, :>] +for pred in [:<] predeq = Symbol(pred, :(=)) @eval begin @define_binary_dual_op( From 15f0d803c31e1719694afdab0b26494c6e0166ca Mon Sep 17 00:00:00 2001 From: Neven Sajko Date: Mon, 8 Sep 2025 18:45:14 +0200 Subject: [PATCH 2/2] remove `eval` and `for` --- src/dual.jl | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/src/dual.jl b/src/dual.jl index a7881064..69a36760 100644 --- a/src/dual.jl +++ b/src/dual.jl @@ -383,23 +383,18 @@ end # Before PR#481 this loop ran over this list: # BINARY_PREDICATES = Symbol[:isequal, :isless, :<, :>, :(==), :(!=), :(<=), :(>=)] # Not a minimal set, as Base defines some in terms of others. -for pred in [:<] - predeq = Symbol(pred, :(=)) - @eval begin - @define_binary_dual_op( - Base.$(pred), - $(pred)(value(x), value(y)) || (value(x) == value(y) && $(pred)(partials(x), partials(y))), - $(pred)(value(x), y) || (value(x) == y && $(pred)(partials(x), zero(partials(x)))), - $(pred)(x, value(y)) || (x == value(y) && $(pred)(zero(partials(y)), partials(y))), - ) - @define_binary_dual_op( - Base.$(predeq), - $(pred)(value(x), value(y)) || (value(x) == value(y) && $(predeq)(partials(x), partials(y))), - $(pred)(value(x), y) || (value(x) == y && $(predeq)(partials(x), zero(partials(x)))), - $(pred)(x, value(y)) || (x == value(y) && $(predeq)(zero(partials(y)), partials(y))), - ) - end -end +@define_binary_dual_op( + Base.:(<), + (value(x) < value(y)) || (value(x) == value(y) && (partials(x) < partials(y))), + (value(x) < y) || (value(x) == y && (partials(x) < zero(partials(x)))), + (x < value(y)) || (x == value(y) && (zero(partials(y)) < partials(y))), +) +@define_binary_dual_op( + Base.:(<=), + (value(x) < value(y)) || (value(x) == value(y) && (partials(x) <= partials(y))), + (value(x) < y) || (value(x) == y && (partials(x) <= zero(partials(x)))), + (x < value(y)) || (x == value(y) && (zero(partials(y)) <= partials(y))), +) @define_binary_dual_op( Base.isless,