diff --git a/equality/main.pony b/equality/main.pony new file mode 100644 index 0000000..8e07943 --- /dev/null +++ b/equality/main.pony @@ -0,0 +1,54 @@ +actor Main + new create(env: Env) => + // identity equality: there is only one None + // so None `is` None + if None is None then + env.out.print("None is None") + end + + let a = Foo("hi") + let b = Foo("hi") + + // a and b are different objects + if a is b then + env.out.print("a is b") + else + env.out.print("a is not b") + end + + let c = a + + // c is a reference to the same object to which + // a is a reference + // I assume? I don't actually know how the memory + // management works lol + if a is c then + env.out.print("a is c") + else + env.out.print("a is not c") + end + + // structural equality: see fun eq() below + if a == b then + env.out.print("a is equal to b") + end + if a == c then + env.out.print("a is equal to c") + end + +class Foo + let field: String + + new create(field': String) => + field = field' + + // the value returned by this function implements + // structural equality + fun eq(that: box->Foo): Bool => + this.field == that.field + + +// Extra note about primitives: since all primitives have no fields and there +// is only one instance of each user-defined primitive, all primitives of a +// given type are equal by identity and structurally equal. (I'm not sure +// about builtin primitives.)