Damian Conway wrote:
> Jon Lang kept his promise:
>
>> I promised some further thoughts; here they are:
>
> Much appreciated.
You're welcome.
>> As written, declarator aliasing attaches the alias to a piece of code,
>> and draws both the name and the alias from that. What about using a
>> special case of the declarator block for this? That is:
>>
>> class Database::Handle { #=alias
>> has IO $!handle; #=alias
>> my Bool method open ($filename) {...} #=alias
>>
>> =for para
>> Note that the A<method> method of class A<class>
>> stores the resulting low-level database handle
>> in its private A<has> attribute.
>>
>> }
>>
>
> or:
>
>> class Database::Handle { #=>
>> has IO $!handle; #=>
>> my Bool method open ($filename) {...} #=>
>>
>> =for para
>> Note that the A<method> method of class A<class>
>> stores the resulting low-level database handle
>> in its private A<has> attribute.
>>
>> }
>
> Definitely interesting ideas, especially the second one. My concern
> would be that they compete
> with the #= blocks which might also be needed on such declarations.
I don't think that there will be a problem. First, #=> is easy enough
to distinguish from #=; I don't foresee any confusion. Second, your
existing rules for #= already allow for multiple such blocks to be
attached to one thing, with the rule being that you append the latter
ones to the former ones:
#= Class Foo
class Foo {
#= a sample class used to illustrate.
#= This particular class has nothing in it.
}
...results in the equivalent of:
=for pod
Class Foo
a sample class used to illustrate.
This particular class has nothing in it.
With the ability to attach multiple declarator blocks to a single
declarator, it should be trivial to replace any one of them with a
declarator alias:
#=>
class Foo {
#= Class Foo
#= a sample class used to illustrate.
#= This particular class has nothing in it.
}
There _is_ a question about when the alias becomes available:
#= Class A<class>
class Foo {
#= a sample class used to illustrate.
#= This particular class has nothing in it.
#=> X<this assigns to the 'class' declarator alias.>
Would A<class> in the first line become 'Foo', or would it be whatever
A<class> was before that line? My later suggestion of an empty A<>
mitigates this problem by making such references less frequent in
practice; but it doesn't eliminate it. My personal preference would
be for it to refer to 'Foo'; but that would involve postponing the
evaluation of Foo's WHY block until all possible relevant data has
been collected.
>> Regardless of what syntax you use for declarator aliasing, I'd also
>> recommend some sort of numbering scheme if you alias more than one
>> declarator of the same type in the same lexical scope:
>
> It's definitely an issue I hadn't considered properly. However, I
> think the correct
> solution is not numbering (which is always fraught with problems when
> subsequent
> maintenance adds an extra declarator in the middle), but rather naming. Like
> so:
I tend to agree. I only proposed numbering as a way of being able to
access different declarators without having to explicitly label them.
I can definitely understand if this option gets dropped as being too
error-prone with regard to maintenance.
> =alias
> class Database::Handle {
> =alias
> has IO $!handle;
>
> =alias open
> my Bool method open ($filename) {...}
>
> =alias close
> my Bool method close() {...}
>
> =for para
> Note that the A<open> method of class A<class>
> stores the resulting low-level database handle
> in its private A<has> attribute, while the A<close>
> method closes that handle.
> }
The problem with this example is that '=alias name' isn't a declarator
alias; it's a block alias. (I don't have a problem with the
underlying concept that you're trying to illustrate.) So A<open>
would be 'my Bool method open($filename) {...}', when what you'd be
looking for in a named declarator alias would be 'open'. (And it
might not even be that, unless you loosen the syntactic requirements
for a block alias: there are no subsequent curly braces to define how
much gets aliased.) Which brings me to:
>> If you adopt the declarator block basis for declarator aliasing, you
>> could even let the documenter choose his own names:
>>
>> class Database::Handle { #=>
>> has IO $!handle; #=>
>>
>> my Bool method open ($filename) {...} #=>m1
>> my Bool method close () {...} #=>m2
This would be a way to do a named declarator alias, for distinguishing
between multiple aliases to the same type of declarator.
Indeed, you might end up making extensive use of embedded named
declarator aliases (ENDAs? :P ), since as soon as you reach the
close-bracket, you have the rest of the line available for other uses
(such as declarator blocks):
class Database::Handle { #=>
has IO $!handle; #=>
my Bool method open ($filename) {...} #=>[m1] #= Here's a
block for A<m1>.
my Bool method close () {...} #=>m2
And given that brief names are going to be preferred, this could
result in very compact, yet still readable, combinations of declarator
aliases and blocks.
>> An unrelated possibility would be to allow empty A<> tags in a
>> declarator block, with 'A<>' being replaced with the name of the
>> declarator to which the block is attached:
>
> These are both very useful ideas.
> I'll ponder them carefully in preparation for the next revision.
>
> Thanks, Jon!
No; thank you.
--
Jonathan "Dataweaver" Lang