Overloading Shiro Kawai 25 Mar 2004 13:08 UTC

>From: soo <xxxxxx@tilde.co.kr>
Subject: Re: a preface
Date: 25 Mar 2004 21:33:24 +0900

>  * From: David Van Horn <xxxxxx@cs.uvm.edu>
> >> | Why does fmt have two very distinct behaviors?
>
> Because the required optional arguments are different according to the type.
>
> >> | Why not have two distinct
>    >> | procedures?
>
> Why must have two procedure?  Inspite of the same processing course and return
> type(string).

I can think of one reason for not overloading the function.
Suppose I like to write a procedure that takes a list of objects,
and print out each element per line, left-padded to 20 columns,
using 'write' representation.

(defun (foo list-of-objects)
  (for-each (cut fmt <> 20 write "\n") list-of-objects))

Oops, this fails if list-of-objects contains numeric values, right?
I think I suppose to write something like this:

(defun (foo list-of-objects)
  (for-each (lambda (elt)
              (if (number? elt)
                 (fmt elt 20 "\n")
                 (fmt elt 20 write "\n")))
            list-of-objects))

However, I think this is awkward.  The trouble is, only the
programmer knows how she wants to treat a given object as
a numeric value or as just "one of Scheme values"---the program
can't deduct the programmer's intention purely from the type
of the object.

Having two distinct procedures at least help a programmer
to express the intention.

--shiro