# equal predicate

## Ocie Mitchell — 2001-11-26 19:58:03

    I have a question about the operation of the equal

    predicate.  It seems to treat symbols and strings of

    the same name as equal:

    "+" dup intern equal .

    I.E. the operator + is equal to the string "+".  Is

    this the intended behavior?  Is there some sort of

    type coercion going on here?

    Ocie Mitchell

    __________________________________________________

    Do You Yahoo!?

    Yahoo! GeoCities - quick and easy web site hosting, just $8.95/month.

    http://geocities.yahoo.com/ps/info1

## Manfred von Thun — 2001-11-28 04:21:29

    On Mon, 26 Nov 2001, Ocie Mitchell wrote:

     > I have a question about the operation of the equal

    > predicate.  It seems to treat symbols and strings of

    > the same name as equal:

    >

    > "+" dup intern equal .

     Alternatively:

      "+" [+] first equal .

      "+" [+] first = .

     > I.E. the operator + is equal to the string "+".  Is

    > this the intended behavior?  Is there some sort of

    > type coercion going on here?

     The behaviour is not due to the equal predicate but

    the = predicate. It comes about as follows:

    To sort a list of items using (implicitly) the < ordering

    predicate, that predicate has to be defined for all kinds

    of items: numbers, strings and symbols.

      [ 5       3      7    ] qsort	 =>  [ 3      5      7     ]

      ["peter" "paul" "mary"] qsort  =>  ["mary" "paul" "peter"]

      [ peter   paul   mary ] qsort  =>  [ mary   paul   peter ]

    That is fine for homogeneous lists, but what about

      [ peter  "paul"  mary ] qsort  =>  [ mary  "paul"  peter ]

    Seems reasonable, too.

    Now what about repetitions?

    Solution 1 (the current one, string = symbol):

      ["peter"  paul  peter ] qsort  =>  [ paul  "peter"  peter ]

      [ peter   paul "peter"] qsort  =>  [ paul   peter  "peter"]

    Solution 2 (any string < any symbol):

      ["peter" "paul"  mary ] qsort  =>  ["paul" "peter"  mary ]

    Solution 3 (any symbol < any string):

      [ peter   paul  "mary"] qsort  =>  [ paul   peter  "mary"]

    Solution 4 (string < symbol):

      [ peter "peter" peter ] qsort  =>  [ "peter" peter  peter]

    Solution 5 (symbol < string):

      ["peter" peter "peter"] qsort  =>  [ peter "peter" "peter"]

    Maybe one of solutions 2..5 is better than solution 1, but

    I don't know which. Any opinions?

    Until this is settled, we can't really say how < and > should

    behave in these circumstances. And clearly, whatever answer we

    give, it also affects the <= and >= predicates, then the =

    predicate and hence indirectly the equal predicate.

    But thank you for pointing it out.

    I have already seen your proposed patch, but I'll wait for

    some discussion first.

      - Manfred