__compare(Foo, Bar, { True }, { False })

(__compare
  Foo
  Bar
  { True }
  { False })

( ( ( ( =>
          =>
            =>
              =>
                ( if
                  3
                  2
                  1
                  0 )
        Foo )
      Bar )
    =>
      True )
  =>
    False )

00000: LoadFn { code: 00002, fvars: 00001 }
00001:   Return
00002: LoadVar(00000)
00003: LoadVar(00001)
00004: LoadFn { code: 00000, fvars: 00000 }
00005: AppArgToFn
00006: LoadVar(00001)
00007: AppArgToFn
00008: AppArgToFn
00009:   Return
00010: LoadVar(00003)
00011: LoadVar(00002)
00012: LoadVar(00001)
00013: LoadVar(00000)
00014: Compare
00015: AppArgToFn
00016:   Return
00017: LoadFn { code: 00010, fvars: 00003 }
00018:   Return
00019: LoadFn { code: 00017, fvars: 00002 }
00020:   Return
00021: LoadFn { code: 00019, fvars: 00001 }
00022:   Return
00023: PushString("True")
00024:   Return
00025: PushString("False")
00026:   Return
00027: LoadFn { code: 00021, fvars: 00000 }
00028: PushString("Foo")
00029: AppFnToArg
00030: PushString("Bar")
00031: AppFnToArg
00032: LoadFn { code: 00023, fvars: 00000 }
00033: AppFnToArg
00034: LoadFn { code: 00025, fvars: 00000 }
00035: AppFnToArg
00036:   Return

False

---

:f = (:x => { __compare(x, Bar, { True }, { False }) }), f(Bar)

(=
  :f
  (=>
    :x
    { (__compare
        x
        Bar
        { True }
        { False }) }))
(f
  Bar)

( ( ( =>
        =>
          =>
            ( 0
              1 )
      "f" )
    ( ( =>
          =>
            0
        "x" )
      =>
        ( ( ( ( =>
                  =>
                    =>
                      =>
                        ( if
                          3
                          2
                          1
                          0 )
                0 )
              Bar )
            =>
              True )
          =>
            False ) ) )
  =>
    ( 0
      Bar ) )

00000: LoadFn { code: 00002, fvars: 00001 }
00001:   Return
00002: LoadVar(00000)
00003: LoadVar(00001)
00004: LoadFn { code: 00000, fvars: 00000 }
00005: AppArgToFn
00006: LoadVar(00001)
00007: AppArgToFn
00008: AppArgToFn
00009:   Return
00010: LoadVar(00000)
00011: LoadVar(00001)
00012: AppFnToArg
00013:   Return
00014: LoadFn { code: 00010, fvars: 00001 }
00015:   Return
00016: LoadFn { code: 00014, fvars: 00000 }
00017:   Return
00018: LoadVar(00000)
00019:   Return
00020: LoadFn { code: 00018, fvars: 00000 }
00021:   Return
00022: LoadVar(00003)
00023: LoadVar(00002)
00024: LoadVar(00001)
00025: LoadVar(00000)
00026: Compare
00027: AppArgToFn
00028:   Return
00029: LoadFn { code: 00022, fvars: 00003 }
00030:   Return
00031: LoadFn { code: 00029, fvars: 00002 }
00032:   Return
00033: LoadFn { code: 00031, fvars: 00001 }
00034:   Return
00035: PushString("True")
00036:   Return
00037: PushString("False")
00038:   Return
00039: LoadFn { code: 00033, fvars: 00000 }
00040: LoadVar(00000)
00041: AppFnToArg
00042: PushString("Bar")
00043: AppFnToArg
00044: LoadFn { code: 00035, fvars: 00000 }
00045: AppFnToArg
00046: LoadFn { code: 00037, fvars: 00000 }
00047: AppFnToArg
00048:   Return
00049: LoadVar(00000)
00050: PushString("Bar")
00051: AppFnToArg
00052:   Return
00053: LoadFn { code: 00016, fvars: 00000 }
00054: PushString(""f"")
00055: AppFnToArg
00056: LoadFn { code: 00020, fvars: 00000 }
00057: PushString(""x"")
00058: AppFnToArg
00059: LoadFn { code: 00039, fvars: 00000 }
00060: AppFnToArg
00061: AppFnToArg
00062: LoadFn { code: 00049, fvars: 00000 }
00063: AppFnToArg
00064:   Return

True

---

:f = (:x => { __compare(x, Foo, { True }, { False }) }), Pair(f(Foo), f(Bar))

(=
  :f
  (=>
    :x
    { (__compare
        x
        Foo
        { True }
        { False }) }))
(Pair
  (f
    Foo)
  (f
    Bar))

( ( ( =>
        =>
          =>
            ( 0
              1 )
      "f" )
    ( ( =>
          =>
            0
        "x" )
      =>
        ( ( ( ( =>
                  =>
                    =>
                      =>
                        ( if
                          3
                          2
                          1
                          0 )
                0 )
              Foo )
            =>
              True )
          =>
            False ) ) )
  =>
    ( ( Pair
        ( 0
          Foo ) )
      ( 0
        Bar ) ) )

00000: LoadFn { code: 00002, fvars: 00001 }
00001:   Return
00002: LoadVar(00000)
00003: LoadVar(00001)
00004: LoadFn { code: 00000, fvars: 00000 }
00005: AppArgToFn
00006: LoadVar(00001)
00007: AppArgToFn
00008: AppArgToFn
00009:   Return
00010: LoadVar(00000)
00011: LoadVar(00001)
00012: AppFnToArg
00013:   Return
00014: LoadFn { code: 00010, fvars: 00001 }
00015:   Return
00016: LoadFn { code: 00014, fvars: 00000 }
00017:   Return
00018: LoadVar(00000)
00019:   Return
00020: LoadFn { code: 00018, fvars: 00000 }
00021:   Return
00022: LoadVar(00003)
00023: LoadVar(00002)
00024: LoadVar(00001)
00025: LoadVar(00000)
00026: Compare
00027: AppArgToFn
00028:   Return
00029: LoadFn { code: 00022, fvars: 00003 }
00030:   Return
00031: LoadFn { code: 00029, fvars: 00002 }
00032:   Return
00033: LoadFn { code: 00031, fvars: 00001 }
00034:   Return
00035: PushString("True")
00036:   Return
00037: PushString("False")
00038:   Return
00039: LoadFn { code: 00033, fvars: 00000 }
00040: LoadVar(00000)
00041: AppFnToArg
00042: PushString("Foo")
00043: AppFnToArg
00044: LoadFn { code: 00035, fvars: 00000 }
00045: AppFnToArg
00046: LoadFn { code: 00037, fvars: 00000 }
00047: AppFnToArg
00048:   Return
00049: PushString("Pair")
00050: LoadVar(00000)
00051: PushString("Foo")
00052: AppFnToArg
00053: AppFnToArg
00054: LoadVar(00000)
00055: PushString("Bar")
00056: AppFnToArg
00057: AppFnToArg
00058:   Return
00059: LoadFn { code: 00016, fvars: 00000 }
00060: PushString(""f"")
00061: AppFnToArg
00062: LoadFn { code: 00020, fvars: 00000 }
00063: PushString(""x"")
00064: AppFnToArg
00065: LoadFn { code: 00039, fvars: 00000 }
00066: AppFnToArg
00067: AppFnToArg
00068: LoadFn { code: 00049, fvars: 00000 }
00069: AppFnToArg
00070:   Return

Pair(True, False)

---

__compare(foo!, foo!, { True }, { False })

(__compare
  foo!
  foo!
  { True }
  { False })

( ( ( ( =>
          =>
            =>
              =>
                ( if
                  3
                  2
                  1
                  0 )
        foo! )
      foo! )
    =>
      True )
  =>
    False )

00000: LoadFn { code: 00002, fvars: 00001 }
00001:   Return
00002: LoadVar(00000)
00003: LoadVar(00001)
00004: LoadFn { code: 00000, fvars: 00000 }
00005: AppArgToFn
00006: LoadVar(00001)
00007: AppArgToFn
00008: AppArgToFn
00009:   Return
00010: LoadVar(00003)
00011: LoadVar(00002)
00012: LoadVar(00001)
00013: LoadVar(00000)
00014: Compare
00015: AppArgToFn
00016:   Return
00017: LoadFn { code: 00010, fvars: 00003 }
00018:   Return
00019: LoadFn { code: 00017, fvars: 00002 }
00020:   Return
00021: LoadFn { code: 00019, fvars: 00001 }
00022:   Return
00023: PushString("True")
00024:   Return
00025: PushString("False")
00026:   Return
00027: LoadFn { code: 00021, fvars: 00000 }
00028: PushEffect("foo")
00029: AppFnToArg
00030: PushEffect("foo")
00031: AppFnToArg
00032: LoadFn { code: 00023, fvars: 00000 }
00033: AppFnToArg
00034: LoadFn { code: 00025, fvars: 00000 }
00035: AppFnToArg
00036:   Return

True