APL Wiki logo: Difference between revisions

Jump to navigation Jump to search
131 bytes added ,  10:00, 5 November 2019
Links and some editing
Miraheze>Adám Brudzewsky
Miraheze>Marshall
(Links and some editing)
Line 1: Line 1:
[[File:APL Wiki Touch Square.png|thumb|right|APL Wiki logo]]
[[File:APL Wiki Touch Square.png|thumb|right|APL Wiki logo]]


The APL Wiki logo can be seen as the following numeric matrix, where each number indicates the circle size. This page will explain, step-by-step, an expression<ref>[https://codegolf.stackexchange.com/users/78410/bubbler "Bubbler"], message [https://chat.stackexchange.com/transcript/message/52389201#52389201 "52389201"] in ''The Nineteenth Byte'' chat room. Stack Exchange network, 2019-10-31 23:57</ref> for this matrix — an expression which demonstrates quite a few APL features:
The APL Wiki logo can be seen as the following [[numeric]] [[matrix]], where each number indicates the circle size. This page will explain, step-by-step, an expression<ref>[https://codegolf.stackexchange.com/users/78410/bubbler "Bubbler"], message [https://chat.stackexchange.com/transcript/message/52389201#52389201 "52389201"] in ''The Nineteenth Byte'' chat room. Stack Exchange network, 2019-10-31 23:57</ref> for this matrix — an expression which demonstrates quite a few APL features:
<source lang=apl>
<source lang=apl>
       ⎕IO←0
       ⎕IO←0
Line 12: Line 12:
</source>
</source>


We will follow APL's evaluation from right to left.
We will follow APL's evaluation from [[Evaluation order|right to left]].


== Counting ==
== Counting ==
Line 31: Line 31:


=== Generating indices ===
=== Generating indices ===
The <source lang=apl inline>⍳</source> function takes a number ''N'' and [[index generator|generates indices]] until is has made ''N'' indices. Since we set <source lang=apl inline>⎕IO</source> to 0, we count from 0 until right before ''N'':
The <source lang=apl inline>⍳</source> function takes a number ''N'' and [[index generator|generates indices]] until is has made ''N'' [[Index|indices]]. Since we set <source lang=apl inline>⎕IO</source> to 0, we count from 0 until right before ''N'':


<source lang=apl>
<source lang=apl>
Line 40: Line 40:
== How many subsets? ==
== How many subsets? ==


Consider a bag with four distinct items. If you stick your hand into the bag and pick two items out, how many different possibilities are there  for which pair you get out? <math>\{(0,1), (0,2), (0,3), (1,2), (1,3), (2,3)\}</math>. APL can tell you this with the <source lang=apl inline>!</source> function:
Consider a bag with four distinct items. If you stick your hand into the bag and pick two items out, how many different possibilities are there  for which pair you get out? <math>\{(0,1), (0,2), (0,3), (1,2), (1,3), (2,3)\}</math>. APL can tell you this with the [[Binomial]] (<source lang=apl inline>!</source>) function:
<source lang=apl>
<source lang=apl>
       2!4
       2!4
Line 46: Line 46:
</source>
</source>


Notice how APL uses traditional mathematical symbols in a generalised way. The traditional post-fix (after its argument) symbol <math>!</math> is used with a syntax similar to how you'd normally use <math>+</math> or <math>×</math>. In fact, all APL functions can be used infix, like <math>a-b</math> or prefix, like <math>-b</math>.
Notice how APL uses traditional mathematical symbols in a generalised way. The traditional post-fix (after its argument) symbol <math>!</math> is used with a syntax similar to how you'd normally use <math>+</math> or <math>×</math>. In fact, all APL functions can be used [[Dyad|infix]], like <math>a-b</math> or [[Monad|prefix]], like <math>-b</math>.


Anyway, how many sets of four could you pick? Obviously, only one; all the items:
Anyway, how many sets of four could you pick? Obviously, only one; all the items:
Line 54: Line 54:
</source>
</source>
=== Automatic mapping ===
=== Automatic mapping ===
A really nice feature of APL is its array-orientation. For computations which are defined on single elements, [[wikipedia:map (higher-order function)|map]]ping is implicit:
A really nice feature of APL is its array-orientation. For computations which are defined on single elements ([[scalar functions]]), [[wikipedia:map (higher-order function)|map]]ping is implicit:
<source lang=apl>
<source lang=apl>
       0 1 2 3 4!4
       0 1 2 3 4!4
1 4 6 4 1
1 4 6 4 1
</source>
</source>
(What's up with picking zero out of four items? Since all empty hands are equal, there is exactly one such set — the empty set.)
(What's up with picking zero out of four items? Since all [[empty]] hands are equal, there is exactly one such set — the empty set.)


== Order of evaluation ==
== Order of evaluation ==
We want to generate the indices using <source lang=apl inline>⍳</source>…
We want to generate the indices using [[Iota]] (<source lang=apl inline>⍳</source>)
<source lang=apl>      ⍳5!4
<source lang=apl>      ⍳5!4


Line 73: Line 73:


== Swapping arguments ==
== Swapping arguments ==
If the arguments of <source lang=apl inline>!</source> were swapped, we didn't need that parenthesis. Enter the [[operator]] (higher-order function) [[swap]] (<source lang=apl inline>⍨</source>) which takes a [[dyadic]] function on its left and creates a new [[derived function]] which is identical to the original, but has swapped arguments:
If the arguments of <source lang=apl inline>!</source> were swapped, we wouldn't need that parenthesis. Enter the [[operator]] (higher-order function) [[swap]] (<source lang=apl inline>⍨</source>) which takes a [[dyadic]] function on its left and creates a new [[derived function]] which is identical to the original, but has swapped arguments:
<source lang=apl>
<source lang=apl>
       4!⍨⍳5
       4!⍨⍳5
Line 85: Line 85:
0.5 2 3 2 0.5
0.5 2 3 2 0.5
</source>
</source>
Notice how we were dealing with integers until now, but then we multiply by a float (non-integer). In APL, you don't need to worry about numeric data type conversions. All numeric types get automatically promoted and demoted as needed. APL will usually use the most compact internal representation.
Notice how we were dealing with integers until now, but then we [[multiply]] by a float (non-integer). In APL, you don't need to worry about numeric data type conversions. All numeric types get automatically promoted and demoted as needed. APL implementations will usually use the most compact internal representation.
=== Traditional mathematical symbols ===
=== Traditional mathematical symbols ===
Also notice that we use a proper multiplication symbol, <math>×</math>, for multiplication. If traditional mathematics has a symbol for a concept APL includes then APL will use that symbol. Another example is <math>÷</math> for division.
Also notice that we use a proper multiplication symbol, <math>×</math>, for multiplication. If traditional mathematics has a symbol for a concept APL includes then APL will use that symbol. Another example is <math>÷</math> for [[division]].


== Tables ==
== Tables ==
Remember the multiplication table from school?
Remember the multiplication table from school?
Let's pause for a moment by giving our numbers a name:
<source lang=apl>
<source lang=apl>
       1 2 3 4 5∘.×1 2 3 4 5
       1 2 3 4 5∘.×1 2 3 4 5
Line 100: Line 99:
5 10 15 20 25
5 10 15 20 25
</source>
</source>
In fact, any function will do:
Any function can be made into a table with the [[Outer Product]]:
<source lang=apl>
<source lang=apl>
       1 2 3 4 5∘.+1 2 3 4 5
       1 2 3 4 5∘.+1 2 3 4 5
Line 110: Line 109:
</source>
</source>
=== Using an argument twice ===
=== Using an argument twice ===
It gets tedious to type the same argument twice. Enter the [[self]]ie operator which shares its symbol with the above-mentioned [[swap]] operator. There's no ambiguity here. ''Swap'' swaps the two arguments, while ''selfie'' uses a single argument twice:
It gets tedious to type the same argument twice. Enter the [[self]]ie operator which shares its [[Glyph|symbol]] with the above-mentioned [[swap]] operator. There's no ambiguity here. ''Swap'' swaps the two arguments, while ''selfie'' uses a single argument twice:
<source lang=apl>
<source lang=apl>
       ∘.+⍨1 2 3 4 5
       ∘.+⍨1 2 3 4 5
Line 129: Line 128:
</source>
</source>
== Rounding ==
== Rounding ==
The last step is to round these numbers down. Traditional mathematics writes ''floor'' as <math>⌊x⌋</math> but APL is regular, so no function is denoted by two separated symbols. If the function takes a single argument, then the symbol will be on the left, so we write floor as <source lang=apl inline>⌊x</source>:
The last step is to round these numbers down. Traditional mathematics writes ''floor'' as <math>⌊x⌋</math> but APL is regular, so no function is denoted by two separated symbols. If the function takes a single argument, then the symbol will be on the left, so we write [[floor]] as <source lang=apl inline>⌊x</source>:
<source lang=apl>
<source lang=apl>
       ⌊∘.+⍨.5×4!⍨⍳5
       ⌊∘.+⍨.5×4!⍨⍳5
Anonymous user

Navigation menu