is_equal(obj1, obj2)
Return true if obj1 and obj2
have the same structure and contents,
otherwise return false.
Two objects are equal if each of their constituent parts are equal according to is_eqv.
The equals operator (==) have the same behavior as is_equal and the not-equals operator (<>)
have the same behavior as not(is_equal(a, b)).
Is_equal is a generic function by default and can be overridden for custom datatypes without an
explicit declare generic.
is_equal([1, 2, [3, 4]], [1, 2, [3, 4]])
// true
[1, 2, [3, 4]] == [1, 2, [3, 4]]
// true
is_equal("hello", "hello")
// true
is_equal("hello", "hEllo")
// false
not(is_equal("hello", "hEllo"))
// true
"hello" <> "hEllo"
// true
The operators == and <> will recognize custom types, if they respond
to the 'is_equal message. This is demonstrated by the next program.
function point(x, y)
^(message)
| 'get -> [x, y]
| 'is_equal -> ^(p) p.get == [x, y]
let p1 = point(10, 20)
let p2 = point(10, 20)
let p3 = point(10, 30)
p1 == p2
// true
p1 == p3
// false
p1 <> p3
// true
Is_equal cannot be used to compare two function objects. Always use is_eq
for this.