openAPL employs 1-origin indexing this help file uses UTF-8 encoding with the KAPL font but openAPL uses ISO-8859-1 encoding when editing these notes be sure to: export LC_ALL=en_US.UTF-8 apl executes apl script and sets fonts and keymappings necessary for openapl under KDE 3.5.10 the compose key is set to right windows key this invokes: setxkbmap -option keypad:oss,compose:rwin which is necessary to get the keyboard to work for openapl issuing a xmodmap command like 'xmodmap usapl.txt' will mess up the keymap necessary for openapl to work. One must exercise care when working with other versions of apl. if apl is executed from another shell such as konsole it will be necessary to export LC_ALL=ISO-8859-1 to make sure the keys work as expected type locale at the bash prompt to be sure LC_ALL is set correctly setup notes ----------- openapl needs rxvt4apl and elvis to run elvis needs /etc/elvis/elvis.ini to contain: set! nonascii=all .inputrc must also be patched $if openapl set editing-mode emacs set convert-meta off set input-meta on set output-meta on $endif the file .aplrc must also be present in the $HOME directory and be corrected configured )clear clear out all functions and variables )license displays software license )lib list all files in current directory )vars list all variables )fns returns all functon names )load test load workspace test )save test save workspace test )shell executes bash shell )prws print contents of workspace in readable form )code test display compiled internal code for function test )edit test edit function test (text file) )write test write function test )erase test erase function test )read test read function test )list test list function test )drop test deletes any file called test )sic clear the state indictator )trace turn on function trace )untrace turn off function trace )debug toggles debug mode on and off )memory report on dynamic memory allocation for following key sequences alt is right-alt -------------------------------------------- alt shift s generates reversal ÷ along last axis alt shift c generates comment ã alt shift d generates reversal á along first axis alt shift a generates transposition ô alt shift h generates the ascending sort è alt shift g generates the descending sort ç alt shift o generates the natural log ð alt shift b gives execute â alt shift n gives format î alt shift - gives matrix inverse ⌹­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ alt shift ' gives quotequad ì alt \ gives diamond þ (different from aplus) alt / gives reduce ¯ (first axis) alt = gives multiply « (different from aplus) alt - gives divide ß (different from aplus) alt 2 generates high minus ¢ alt 4 generates less than or equal to ¤ alt 6 generates greater than or equal to ¦ alt 8 generates not equal ¨ alt 9 generates logical or © or monadic type alt shift 9 generates logical nor ¹ alt 0 generates logical and ^ alt shift 0 generates logical nand ° alt shift 5 generates depth ½ alt [ gives û operator alt shift [ gives ý operator alt e gives member Å alt g gives del Ç alt shift g gives delstile ç alt j gives jot Ê alt i gives interval É alt shift i gives ibeam à alt s gives ceiling Ó alt d gives floor Ä alt l gives box Ì alt r gives reshape Ò alt u gives drop Õ alt y gives take Ù alt m gives magnitude Í alt n gives encode Î alt b gives decode  alt v gives dot Ö for the following key sequences alt is left-alt ----------------------------------------------- alt = similar to )lib but in alphabetical order alt t transpose words alt u change word under cursor to uppercase shift 1 gives ! or factorial shift 8 gives * or exponent shift 9 gives ( shift 0 gives ) shift = gives + shift , gives < shift . gives > control codes ------------- ctrl-a beginning of line ctrl-e end of line ctrl-p fetch previous line ctrl-n fetch next line ctrl-c interrupt process ctrl-d logs off ctrl-u erases entire line ctrl-w erases word ctrl-i generates tab (or tab completion) ctrl-l clears screen tab generates tab ctrl-j carriage return ctrl-m carriage return escape codes ------------ \b backspace \n newline \t horizontal tab \nnn 8-bit chacter of octal value nnn cursor keys do not work as expected backspace does not work as expected (use ctrl backspace instead) delete does not work as expected note that cursor keys, delete and backspace now work as expected once readline is included variables are case sensitive, e.g. r and R represent two different variables (É50)+50 returns the numbers 50 to 100 1 ^ 1 1 and 1 returns 1 ?3 returns a random number from 1 to 3 ?5 5 5 5 5 returns five random numbers from 1 to 5 !5 returns factorial of 5 which is 120 !.5 note that fractional or generalized factorials are possible, this returns 0.88622692 «/ ((É3) + 4) returns rising factorial of 5, e.g. 5«6«7) 3!5 returns the binomial (!B) divided by (!A) times !(B-A) which is 10 in this example (i.e. choose 3 from 5) 2!3 choose 2 from 3, which occurs in 3 ways 2 ! 2 3 4 5 choose 2 from 2, 3, 4 and 5, returns 1 3 6 10 1.3 ! 8.9 fractional binomials are also possible, this example returns 14.3692786 Ï1 returns pi or 3.14159265 *1 returns euler's constant or 2.71828183 ð2 returns natural log of 2 or 0.693147181 «1 returns signum, ¢1 for negative, 0 for zero and 1 for positive m û 3 3 Ò É9 returns 1 2 3 4 5 6 7 8 9 «/Ò m returns the number of elements of m m[2;2] returns 5 +/[1]m add up all the columns (reduce last axis) +/[2]m add up all the rows (reduce first axis) +¯m add up all the rows, i.e. 6 15 24 (rows are the first axis) m < 0 returns which elements are less than zero m û 'gerbie power' 3 ÷ m returns bie powerger (rotates 3 characters to the left) a û 3 « n û 2 an example of multi-assignment, a becomes 6 and n becomes 2 a û 1 + b û 3 another example of multi-assignment, a becomes 4 and b is 3 2 3 Ò 'abcdef' returns abc def 4 Ò '*' returns **** 12 Ò v û 1 2 3 stores 1 2 3 1 2 3 1 2 3 1 2 3 in v 'abcd' É 'b' returns the index of b in abcd, i.e. 2 'abcd' É 'e' if there is no match then 5 is returned 8 9 7 É 5 9 6 8 returns 4 2 4 1 2 * 2.5 fractional exponents are allowed, returns 5.65685425 a û 'apple' b û 'pear' c û a,b stores applepear in c 1 0 1 0 1 /'abcde' returns ace 1 1 1 1 1 / 4 returns 4 4 4 4 4 0 1 1 0 1 / 1 2 3 4 5 compress (left arguments must be 1 or 0) returns 2 3 5 u û 1 0 1 0 u / 'abcd' returns ac 0 1 0 / 3 3 Ò É9 returns 2 5 8 u û 1 0 1 0 1 u \ 6 3 2 returns an expansion or 6 0 3 0 2 v û 1 0 0 1 v \ 2 2 Ò É4 returns 1 0 0 2 3 0 0 4 a û 6 7 8 9 10 a[É3] returns the first 3 elements of a, i.e. 6 7 8 ' ' ¨ 'this is it' returns 1 1 1 1 0 1 1 0 1 1 'it''s' returns it's 'hello the number is'; 45 returns hello the number is 45 'abc' = 'abd' returns 1 1 0 cû'3 4' +/âc returns character 7 c û 'abcdef' 3Ùc returns abc v û 1 2 3 4 5 v > 4 returns 0 0 0 0 1 v[1 2 5] returns 1 2 5 Ó/v returns largest element of v, i.e. 5 -v returns ­­¢1 ­¢2 ­¢3 ­¢4 ­¢5 (negates v) +/v returns the sum of all the elements of v, i.e. 15 +/v > 3 returns 2 (number of elements greater than 3) -/v returns 3 (this is the alternating sum) i.e 1+3+5-(2+4) = 3 vÉ3 returns index of 3 in v which is 3 b û 'power of the gerbil' ­Ò b returns 19 (b = 'o') / ÉÒ b (returns positions of o) returns 2 7 (b Å 'aeiouy') / ÉÒ b returns 2 4 7 12 15 18 (returns positions of all vowels) v û 1 2 3 4 5 6 7 8 9 10 v Ê.« v returns ten times table tt û v Ê.« v +/ ,tt sum all the elements of the ten times table (here the monadic operator , unravels the two dimensional array so we can sum all it's elements) nÊ.+n û 1 2 3 4 combining assignment with outer product 10Ê.ßÉ5 returns 10 divided by 1 through 5 1 2 3 4 +.= 1 3 3 5 counts matches in corresponding positions, i.e. 2 1 2 3 4 +.> 2 1 4 5 counts values on left which are greater than right, i.e. 1 table û 3 4 ­Ò É12 table ^.= 5 6 7 8 returns which rows match, i.e. 0 1 0 (É3) Ê.= É3 returns identity matrix­­ 8 8 8  1 2 3 convert octal number 123 to decimal (returns 83) 8 8 8 Î 83 convert decimal number 83 to octal (returns 1 2 3) x û 5 'the value of x is ',îx returns the value of x is 5 v û 1 2 3 4 5 10 2 î v example of formating numbers with decimal points returns 1.00 2.00 3.00 4.00 5.00 a û 4 5 6 a [3 2 1] û a reorders a tab û Ìav[10] assign tab character to variable k û 16 16 Ò 32Õ Ìav store all printable characters as a 16x16 matrix in k v û 1 2 2 3 3 3 4 4 4 4 u û ((vÉv)=ÉÒv)/v u is assigned unique elements of v m û 3 4 ­Ò É12 m[2; ] returns 5 6 7 8 or 2nd row m[;3] returns all rows, column 3 i.e. 3 7 11 ß/1 2 3 4 5 finds alternating product, i.e. 1«3«5ß(2«4) = 1.875 Ìûxû5*3 assign 5*3 to x and display x xû 1 2 3 x[2]û 5 x is 1 5 3 cube û 6 3 3 ­Ò 0 initialize a 3 dimensional array cube[1;;] û 1 set every element of the first 3x3 to 1 b û 1 2 3 4 c û 5 6 7 8 d û b,[.5]c d is assigned combined arrays, i.e. d is set to 1 2 3 4 5 6 7 8 a û 2 2 ­Ò É4 b û ���a b is assigned the matrix inverse of a then a +.« b gives the identity matrix x û 3 + Ì prompts user to enter data with Ì: prompt, expression is evaluated after user hits enter v û 1 2 3 , Ì assign array plus input to v ý2 goto line 2 of a function aû1 ; bû2 assign a the value of 1 and assign b the value of 2 (note that this is implementation specific, other apl versions use þ as a separator) Ìai account information, displays user id Ìav atomic vector which displays all symbols Ìcr 'test' display canonical representation of function test Ìct displays the comparison tolerance Ìio display origin Ìioû1 set origin to 1 Ìlx latent expression executed on activation of workspace Ìnc 'v' returns 2 (symbol is a label or variable) Ìnl 2 returns all variables Ìnl 3 returns all functions Ìpp printing precision, number of digits of precision Ìpw printing width, default is 72 Ìts time stamp, displays year, month, day, hour, minutes, seconds and milliseconds Ìchdir '..' change to parent directory Ìrun 'ps -efw' run any unix command ibeams ------ à1 toggles state of code trace flag à2 toggles state of stack trace flag à3 toggles state of memory trace flag à4 toggles state of variable trace flag 5 à35 sleep for 5 seconds workspaces ---------- userfunc.ws ulam.ws primer.ws workspace containing functions primer1 and isprime functions --------- boxit 1 7 Ò 'wowzers' prints wowzers horizontally boxed by asterisks fib 12 prints the first 12 numbers of the fibonacci series +/ fib 12 sum the first 12 numbers of the fibonacci series prime 100 prints prime numbers less than or equal to 100 (rather slow) prime1 100 prints prime numbers less than or equal to 100 uses sieve of eratosthene (much faster than prime) +/ prime1 100 sum all the primes less than or equal to 100 +/ (3 take prime1 100) sum the first 3 primes ­Ò prime1 100 number of primes less than or equal to 100 71 Å prime1 71 is 71 prime? returns 1 Combinations ------------ outer product Ê. combined with + - ß « = ¨ Ä Ó Í > ¦ ¤ ! inner product combines any two operators, e.g. v û 1 2 3 4 5 v +.+ v returns 30 5 +.«’ 3 2 1 this is equivalent to dot product, normally the vectors are the same length but having only one element seems ok returns 30 1 2 3 +.«’1 2 3 returns 14 (1 + 4 + 9) file IO ------- 0 Ìopen 'test.txt' open file test.txt for reading and returns file descriptor Ìclose fd close file by referencing file descriptor Ìrd fd read one line from file referenced by fd Ìseek (fd, 0, 0) seek to beginning of file referenced by fd differences, missing or problematic ----------------------------------- openapl does not support nested arrays or complex numbers )wsid missing )grps missing )out missing )help some versions of apl actually have help )origin replaced by Ìio )width replaced by Ìpw 'a b c' ~ ' ' does not work in openapl (works in aplx) 'abcd' Ê.¨ 'aefg' does not work in openapl, Domain Error: not numeric data this works in APL\360 typing Ì on a line by itself and entering test crashes openapl Ìcr 'test' will crash if function test does not exist )load prime will crash if prime is a function, use )read for functions ½ the depth operator is not supported Ú the disclose operator is not supported ⌹2 in other apl versions the reciprocal is returned if the right argument to matrix inverse is a number, but in openapl this gives a rank error nested variables are not supported assignments such as: product û +/ are not permitted observations ------------ function names can be placed inside variables and executed commands such as )vars can not be placed in variables and executed between any two constants, variables, or quads (ignoring parentheses) there must be one, and only one, dyadic function openapl does not use italicized letters )erase will erase functions or variables from a workspace, e.g. )erase prime prime1 v will erase functions prime and prime1 and variable v note that 5 factorial which is normally written as 5! is typed !5 instead this is true for all versions of APL