Readability: Difference between revisions
(→IBM) |
|||
Line 20: | Line 20: | ||
ns(⍎container.⎕NS)←⍬ | ns(⍎container.⎕NS)←⍬ | ||
</source> | </source> | ||
Avoiding the unusual [[modified assignment]] (using | Avoiding the unusual [[modified assignment]] (using the 2-[[train]] <source lang=apl inline>⍎⎕NS</source> as modifying function) helps: | ||
:<source lang=apl inline> | |||
ns←ns container.(⍎⎕NS) ⍬ | |||
</source> | |||
Finally, splitting the 2-train apart makes it even clearer: | |||
:<source lang=apl inline> | :<source lang=apl inline> | ||
ns←⍎ns container.⎕NS ⍬ | ns←⍎ns container.⎕NS ⍬ | ||
</source> | </source> | ||
A new [[namespace]], with the original value of <source lang=apl inline>ns</source> as name, is created inside <source lang=apl inline>container</source> and the character representation <source lang=apl inline>'#.container.ns'</source> is returned from <source lang=apl inline>⎕NS</source> to <source lang=apl inline>⍎</source> which evaluates the name to a reference, that in turn replaces the previous value of <source lang=apl inline>ns</source>. |
Revision as of 05:53, 25 September 2020
Maintaining readability of APL can take a special effort. It is easy to write very dense code, and the mathematical look of APL can encourage usage of single-letter names. Traditionally, APLers use the term pornography to describe code that is hard to read, or uses unusual constructs. Code golf often results in pornographic code.
Examples
Gilman & Rose
In APL – an Interactive Approach, the authors the authors describe the following code, which computes the correlation coefficient, as “almost pornographic”:
r←(+/x×y)÷((+/(x←x-(+/x)÷⍴x)*2)×+/(y←y-(+/y)÷⍴y)*2)×.5
IBM
The APL2 Idiom list includes the following entry:
X←'line1',0⍴Y←'line2'
⍝ Pornography. Combining two lines into one.
This was a common technique before Left was added to the language:
X←'line1' ⊣ Y←'line2'
The Diamond statement separator (⋄
) provides an alternative means of inlining multiple statements:
Y←'line2' ⋄ X←'line1'
Note that in all these cases, Y
is assigned first.
Morten Kromberg
Morten Kromberg asked one of his colleagues to “Please avoid this kind of pornography:”
ns(⍎container.⎕NS)←⍬
Avoiding the unusual modified assignment (using the 2-train ⍎⎕NS
as modifying function) helps:
ns←ns container.(⍎⎕NS) ⍬
Finally, splitting the 2-train apart makes it even clearer:
ns←⍎ns container.⎕NS ⍬
A new namespace, with the original value of ns
as name, is created inside container
and the character representation '#.container.ns'
is returned from ⎕NS
to ⍎
which evaluates the name to a reference, that in turn replaces the previous value of ns
.