http://qs321.pair.com?node_id=414790


in reply to strong typing
in thread (Completely OT) - Hero(i)n programming language on Slashdot

print $a+@b; #coerce array into number

This is exactly the same as array.length() in Java. It's not a type conversion.

print $a+$ref_b; #coerce reference into number

Those are both scalars. Not a type conversion.

my $d=eval %c; #coerce hash into string

This one is tricky. What the eval actually gets is certain internal information concerning the hash, which happens to be output as a valid perl expression (a division operation). You've lost all real information about the hash, and therefore is not a type conversion.

my @e=%c;print "@e"; #hashes and arrays are different types. Oh wait

My own view on this is that hashes and arrays are both subtypes of lists. So it's not so much a conversion between different types than between different subtypes. There are those that disagree, though.

my @t=12; #coerce number into array

This simply makes a scalar containing 12 that is placed as the first element of the list, and the list is then assigned to an array. The scalar is still there, so it's not a type conversion.

I think I've established a pattern here. None of these are really type conversions.

"There is no shame in being self-taught, only in not trying to learn in the first place." -- Atrus, Myst: The Book of D'ni.

Replies are listed 'Best First'.
Re^2: strong typing
by gmpassos (Priest) on Dec 14, 2004 at 23:21 UTC
    print $a+$ref_b; #coerce reference into number Those are both scalars. Not a type conversion.
    Humm, no! To make any arithmetic operation we need to convert the string (that are just a sequence of bytes), into numbers, where we use 4 bytes (32 bits processor) to make the calculation. (this is standart calculation ok!)

    The wonderful job that Perl does for us, with speed, is to convert automatically all the boolean, integer, floating and string types with a single type, SCALAR.

    Graciliano M. P.
    "Creativity is the expression of liberty".

      I said they're both scalars. Perl's type system has no concept of "integer", "boolean", etc.--it only knows about scalars, arrays, etc. Since the orginal code presented only deals with scalars, there is only one type involved: scalars.

      "There is no shame in being self-taught, only in not trying to learn in the first place." -- Atrus, Myst: The Book of D'ni.

        Perl's type system has no concept of "integer", "boolean", etc.--it only knows about scalars...
        But that isn't entirely true:
        print 5 == "foo"; Argument "foo" isn't numeric in numeric eq (==)

        The fact that these types are checked/enforced at run time rather than compile time doesn't mean they aren't types. It's called dynamic typing.

        In the high level you are right, Perl makes a good abstraction, where we don't need to think about numeric types and booleans. But internally it have to do this convertions to integer to make the arithmetic operation, and than it converts again to string. SCALAR is the group of all this types!

        Graciliano M. P.
        "Creativity is the expression of liberty".