Equation doesn't work as boolean in patterns

Hello everyone,

I’ve been struggling to understand why bigger than smaller than works perfectly in the below example:

(
p = Pbind(
	\degree, Pif(Pseq((0.0,0.1..1.1), inf).trace < 0.6, Pwhite(-7, 0, inf), Pwhite(7, 14, inf)),
    \dur, 0.25
).play;
)

p.stop;

but equation just wouldn’t return true ever:

(
p = Pbind(
	\degree, Pif(Pseq((0.0,0.1..1.1), inf).trace == 0.6, Pwhite(-7, 0, inf), Pwhite(7, 14, inf)),
    \dur, 0.25
).play;
)

p.stop;

I tried to test whether it’s an equality vs. identity problem, but I don’t understand why <,>,<=,>= does not return the same result as ==

Any advice, pointers, guide on why this is the case would be much appreciated!

TL;DR: use the |==| operator.


That’s indeed a subtle issue. Here’s the relevant passage in the AbstractFunction help file:

NOTE: The comparison operators <, <=, > and >= automatically perform function composition, as does * in the example above.

Equality comparisons have two possible meanings: to compare the objects as they exist right now, or a composite operator that will evaluate the operands in the future and check the equality of those results. Both are needed at different times, and are supported by different operators: == for an immediate equality check (which always returns a Boolean result), or |==| for a “lazy” equality operator to be performed later.

https://doc.sccode.org/Classes/AbstractFunction.html#Function%20Composition