Day 5 – Identifiers have hyphens in them

One day on the #perl6 channel, back in 2009, I stumbled into a conversation where Larry said “it didn’t break any spectests, and that convinced me” or something like that. Maybe it broke a couple of spectests, but they apparently needed breaking anyway.

The change in question was adding hyphens and apostrophes to identifiers. Normally in languages, these are valid identifier names:

my $foo;
my $please_do;

But Perl 6 also allows these:

my $foo-with-hyphens;
my $please-don't;

As usual, I was conservative, and slow to pick up these changes. I didn’t like what it did to my vim highlighting of variables. Whatever.

These days I kind of like the hyphens in identifiers. Mostly I just decide on a project-by-project basis whether I want to use hyphens, but I notice myself deciding to use them more and more often. They just look nicer, somehow. More balanced.

Damian Conway, on the Perl 6 Language mailing list, tried to institute the convention that hyphens and underscores should be used interchangeably — hyphens where you’d use hyphens in a sentence, and underscore where you’d use a space between words. I haven’t seen anyone pick up on that practice. I suspect it is because many of us are not native speakers, but rather speakers of some nebulous Goodenuf English, and we would hesitate between what’s two words and what’s a hyphen-separated compound. Actually, I’m pretty sure native speakers hesitate too sometimes.

Anyway, there’s an obvious parser conflict which you may have spotted: the hyphen is already used for infix minus. Perl 6 disambiguates this by saying that you’re allowed to use a hyphen (or an apostrophe) if it’s then followed by an alphabetic character. Thanks to sigils, this is enough to make it clear what you mean.

my $foo-2;     # variable minus 2 
my $foo-bar;   # a single variable;

Now I want to say two things at once. The first thing is that the apostrophe is an old vestigial thing in Perl 5 identifiers, too. It means the same as the package separator ::. Which is how Acme::Don't can exist, for example. (Look at the actual package name of the module.

The second thing is that Lisp people and Haskell people seem particularly saddened that because of this rule, you’re not allowed to put an apostrophe at the end of an identifier.

my $foo';     # not allowed

Ah, well. There will be slangs. I’m surprised there isn’t already a slang for apostrophes at the end of identifiers. ☺

5 thoughts on “Day 5 – Identifiers have hyphens in them

  1. As a Lisp guy, I don’t lament the inability to have trailing apostrophes. Having an apostrophe in a symbol name is very rare in Common Lisp at least, because the standard reader parses apostrophe as a quote form: ab’cd is read as: ab (quote cd). You can get around that by inhibiting such cases with |ab’cd| but that is so annoying to type it is rarely used.

    The rules around naming do seem a bit complex for comfort, though I’m sure I’ll get used to it. The overall complexity in Perl6 is a bit of a worry, but 15 years is a long time to learn what works and what doesn’t.

  2. I never thought I’d like hyphens in variable names, but it really grows on you quickly. It holds the words in a variable together better. When I first saw someone’s comments in a repository about “kebab-case” I had no idea what they meant at first.

    $kebab-case-looks-more-connected
    $underscores_are_too_broken_up
    

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.