Random Perl 6 syntax rant

Simon Wistow simon at thegestalt.org
Tue Apr 1 18:05:16 BST 2008


On Tue, Apr 01, 2008 at 09:11:09AM +0100, Andy Wardley said:
> Here's my anti-favourite new unintuitive Perl6 syntax snippet.
> 
>   for =$*IN -> $guess {
>      ...
>   }

So the use of sigils raises interesting questions. 

Python happily (apparently) does without Sigils. So do a lot of other 
languages like C. Except when it doesn't although whether * and & are 
sigils is a matter of debate.

Charles Simonyi 'invented' a way of retconning textual sigils into BCPL

    http://en.wikipedia.org/wiki/Hungarian_Notation

which provided a verbose but expressive way of having sigils. 

Microsoft later bastardised Hungarian Notation into the camelCaps 
abortion that is MFC. 

So clearly annotating a variable with a type is useful - the question is 
where along the spectrum you want to lie - full on verbosity or minimal 
decoration.

I happen to like the level Perl5 has struck although, to be fair, I have 
no idea if that's just because it's what I'm used to. I understand the 
confusion between refs and normal variables 

        @array
        $array[0]
        $array->[0]

but actually all those make perfect sense to me. I suppose the only way 
to simplify them would be to make all subroutines pass-by-reference and 
simplify down to 

        @array
        @array[0]

but, and again maybe this is just inertia, that doesn't make sense to me 
- the $ in $array[0] tells me I'm getting a single value back. Again 
maybe this is a distinction that gets blurred when all you have is pass 
by reference since $array[0] could pass back and array itself but we'll 
leave that for now.

As an aisde I have real problems working with Python (and I've written 
some mildly large and complicated programs in it). This is not bash 
against Python but an anecdotal piece of evidence. I'm told that I have 
a very mild form of dyslexia (or similar) which manifests itself as a 
problem with pattern recognition. This normally isn't a problem but, 
when I'm tired, I can't read Python. Again, maybe it's a familiarity 
thing but I find that the lack of sigils and braces causes a problem 
trying to follow flow. As a corollary however I actually also have a 
problem reading strangely formatted English or text with no punctuation 
when I'm tired as well.

I felt the same revulsion as you when I read that Perl6/Rakudo. Again, 
possibly this is in part to the unfamilarity but I think it goes deeper 
than that. 

I'm sure that the Perl6 people will tell us that 99% of Perl6 will look 
like Perl5 and that this is just the corner cases, the golfing tools, 
the elements that will allow epxressive minimalism in the right place in 
the same way that we can do stuff like

    do_something foreach @item;

or 

	exit unless $stay_alive;

in Perl5.

Yet every example we see looks alien and unfamiliar - the edge cases 
seem to be the norm. Maybe it's just the Perl6 team stretching their 
wings but aren't the two major complaints about Perl that there are too 
many sigils and too many ways to do things - what's the advantage of 
adding more sigils and more ways to do things. Maybe we're mistaken 
and we've got the wrong idea but when *everyone* apart from the inner 
cabal (not to imply that P6 development is exclusive, it's anything but) 
is confused, even the party faithful then maybe there's some 
communication problems going on.

So, why does 

    for =$*IN -> $guess

fill me with The Fear[tm]?

Well, for a start (and this is a personal thing), no comforting brackets 
and braces to help punctuate the syntax. Does the for apply to the =$*IN 
or to both the $*IN and the $guess? I can work it out but it's not 
immediately clear. 

And is that = a sigil or an operator? Again, I can work out that it's 
actually any operator but it's not immediately obvious. To =$* looks 
like an emoticon for someone in a top hat and sunglasses giving me a 
kiss. But that's just me.

Playing the familiarity card again but 

	for =$*IN -> $guess

isn't obvious what'ts going on without any context. If that was 
presented to me cold I'd guess it meant a short hand for 

	while ($*IN != $guess) {
		...
		$*IN++;
	}

whereas 

	foreach my $guess ($*IN) {

	}

is far more 'intuitive'. I'd actually like to see something more like TT

	foreach my $guess in ($*IN) {

	}

or

	foreach in ($*IN) {

	}	

except that I can't quite get over the fact that $*IN to me looks like a 
single item

	foreach in ($*IN.lines) {

	}

or

	foreach in (@*IN) {

	}

would be better for me (the @ and $ magically switching the context of 
$*IN and the foreach forcing an implicit iterator for things that can 
support it) 

Anyway, this has been my attempt to at least rationalise why I don't 
like this syntax rather than just saying "Euuuch".

Simon




     


More information about the london.pm mailing list