intertwingly

It’s just data

Hobgoblin of Little Minds


While exploring Python on Parrot, I was curious to see how Parrot handled Dealing with Diversity.  Running pie-thon against print '1' + '2' produced the following PIR code:

         $P1 = new PerlInt
         $P1 = "1"
         $P3 = new PerlInt
         $P3 = "2"
         $P2 = new PerlInt               # BINARY_ADD
         $P2 = $P1 + $P3
         print_item $P2          # PRINT_ITEM
         print_newline           # PRINT_NEWLINE

Running Parrot without any options against that code produces 3 as the result.  You might think that that is because "1" and "2" are coerced into integers before the addition, but in fact the reverse is true.  Assigning a string to a PerlInt results in a morphing of the target:

     void set_string_native (STRING* value) {
         DYNSELF.morph(enum_class_PerlString);
         DYNSELF.set_string_native(value);
     }

It turns out that the addition itself will evaluate the strings prior to doing the addition — or will, but only if the --python option is not specified.  If it is specified, string addition is defined as concatenation.

Varying runtime behavior in this manner seems like an extraordinary bad idea.  A better solution would be a separate PythonString class.

The morphing behavior of assignment isn't consistent either.  If you define a ResizablePMCArray, assigning an integer to it seems to be the way you set the length.

In any case, here is a patch to Pirate to take advantage of this behavior.  This caused the range test to fail due to a latent bug in Pirate that was masked by another set of unexpected behavior — in this case how negative fractional numbers are rounded to integers also seems to depend indirectly on whether Parrot is run in --python mode or not.

Finally, running in --python mode changes the behavior of generators in Pirate.  Mind you, it doesn't make them work just yet, just behave differently.