On Fri, Sep 01, 2000 at 10:46:50AM +0100, Piers Cawley wrote:
> Are you wilfully misunderstanding me?

I would appreciate you giving me the benefit of the doubt that I'm not
intentially misunderstanding you. 


> Let's try another possible example to see if you get the point:
> 
>     print "What sort of dog do you want? ";
>     my $dog_type = ucfirst(<STDIN>); chomp $dog_type;
> 
>     try {
>         my Dog $puppy = "Dog::${dog_type}"->new(name => $dog_name);
>     }
>     catch Exception::BadType {
>         croak "Dog::${dog_type} is not a valid breed\";
>     }
>     catch {
>         croak $!;
>     }
> 
> I want 'my Dog $spot' to enforce the condition that:
> 
>     (!defined($spot) || $spot->isa('Dog'))

Yes, I had gathered this.  I tried to tell you that's not what I'm
proposing.

 
> And that is all. I *really* don't the idea of implicit object
> creation. Consider other OO languages; C++ has implicit object
> construction, but has added the explicit and implicit keywords to
> enable the programmer to turn the behaviour off. Not having actually
> programmed in C++ I don't know how often you want to do this, but the
> fact that the functionality is informative. In Java, on the other
> hand, the designers looked at C++ and decided *not* to do implicit
> construction. 

This is not how I understand C++.  Granted, I've only done a few programs in
it, but there is no implicit keyword (at least, not mentioned in the /C++
Primer/ second edition), and the explicit keyword has to do with implicit
type conversions.

In C++ the code:

    string foo;

makes foo a string object right then and there, calling the constructor
string::string().  explicit will not affect this.  Taking an example from my
book, given the class definition:

    class Number {
    public:
        explicit Number(const SmallInt &);
    };


The code:

    void func(Number);

    SmallInt si(47);

    func(si);

will cause an error at compile-time, because si cannot be successfully
converted to a Number; the explicit keyword prevents the appropriate
constructor from participating in an implicit conversion.

my string $foo is the C++ equivalent of string foo; it instantiates a
string object in $foo.


> But $spot could easily be a Dalmation object that you are using like a
> Dog in the current context. Maybe I should just write a counter
> proposal along the lines of:
> 
> =head1 TITLE
> 
> C<my Dog $spot> should simply assert that
> C<(!defined($spot) || $spot-E<gt>isa('Dog'))>
> 
> And let them duke it out.

By all means, please do so.

Declaring $spot is a Dog (without turning it into a Dog object) and the
changes I propose are not mutually exclusive unless you want to use the same
syntax.  We could use something like:

    my $spot isa(Foo);

But, whatever.


Michael
--
Administrator                      www.shoebox.net
Programmer, System Administrator   www.gallanttech.com
--

Reply via email to