Readability: Difference between revisions

From APL Wiki
Jump to navigation Jump to search
Line 20: Line 20:
ns(⍎container.⎕NS)←⍬
ns(⍎container.⎕NS)←⍬
</source>
</source>
Avoiding the unusual [[modified assignment]] (using as function the 2-[[train]] <source lang=apl inline>⍎⎕NS</source>) makes for a much more readable version would be:
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>
This makes it clearer that the name <source lang=apl inline>ns</source> is reassigned to a new [[namespace]] inside the <source lang=apl inline>container</source> namespace, with the new namespace taking the original value of <source lang=apl inline>ns</source> as name.
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.