home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 13 / MA_Cover_13.bin / source / c / apl / manual < prev    next >
Encoding:
Text File  |  1999-11-23  |  73.3 KB  |  1,765 lines

  1.  
  2.  
  3.  
  4.  
  5.                                      APL\11
  6.                           An APL Interpreter for UNIX*
  7.           
  8.                                   Michael Cain
  9.                                November 12, 1992
  10.           
  11.           
  12.           
  13.           
  14.           111.000  IIInnntttrrroooddduuuccctttiiiooonnn
  15.           
  16.           This manual describes APL\11, an APL interpreter that runs 
  17.           under the UNIX operating system.  The interpreter is written
  18.           in C and the source code is freely available.  I currently 
  19.           check a single set of source code on all of 
  20.                
  21.              o SunOS 4.1 on a Sun3 using the bundled cc, 
  22.              o SunOS 4.1 on a SPARC using the bundled cc, 
  23.              o SunOS 4.1 on a SPARC using GNU gcc 1.40, and 
  24.              o LINUX on a 386sx using GNU gcc 2.2.2.  
  25.           
  26.           The code is reasonably portable, subject to several restric-
  27.           tions including interchangeable pointers and ints.  Porta-
  28.           bility is discussed in more detail in another section.  
  29.           
  30.           APL\11 has a relatively long history.  The original program 
  31.           was written by Ken Thompson at Bell Laboratories, apparently
  32.           in the days before Version 6 UNIX.  This version of the 
  33.           interpreter was extensively modified at Purdue University.  
  34.           Other versions have been included on the Berkeley distribu-
  35.           tion tapes.  I got the Purdue version in 1981 while I was 
  36.           working at Bell Labs, then carried it with me to Bellcore 
  37.           and U S WEST.  
  38.           
  39.           Early in '92, I acquired a 386sx, a copy of Linus Torvalds' 
  40.           linux, and a copy of Bellcore's MGR windowing software.  And
  41.           a little voice in the back of my head that said "This mul-
  42.           titasking virtual-memory windowed system is nice, and if it 
  43.           had APL it would be just about perfect!"  There's no 
  44.           accounting for taste.  After asking USENET, it was apparent 
  45.           that no other source-code available UNIX-based APL inter-
  46.           preters had been written.  Which eventually led to the cur-
  47.           rent situation.  AT&T has given permission to distribute the
  48.           source code, and I've cleaned it up, fixed several errors, 
  49.           written some new documentation and formatted a lot of the 
  50.           old Purdue documentation, added a little additional func-
  51.           tionality.  It's available for general use.  Subject to the 
  52.           various lawyer-type restrictions in the next section.  
  53.           
  54.           It's important to acknowledge the contributions of others: 
  55.           Ken Thompson, for starting it; John Bruner, the graduate 
  56.           student at Purdue from whom I got my copy and, based on the 
  57.  
  58.           __________
  59.  
  60.            *   UNIX is a registered trademark.  
  61.  
  62.  
  63.  
  64.  
  65.                                       - 2 -                           
  66.  
  67.  
  68.           comments in the code, did a lot of work on making the inter-
  69.           preter more robust; Anthony Reeves, then of the EE faculty 
  70.           at Purdue, whose name appears on much of the documentation; 
  71.           Marty Glopta at Bell Labs who did a lot of the initial leg-
  72.           work involved in getting approval to distribute the source; 
  73.           and Lee Dickey for allowing me to use watserv1 as a 
  74.           distribution medium.  
  75.           
  76.           I plan to provide support for the interpreter as my personal
  77.           time and interests permit.  The normal distribution channel 
  78.           will be the ftp archive at watserv1.waterloo.edu.  If you 
  79.           are actively using APL\11, drop me a line.  Mail should be 
  80.           sent to mcain@advtech.uswest.com.  Bug reports are welcome, 
  81.           although I can't promise how soon they'll get fixed.  
  82.           Patches that fix bugs are even more welcome.  I would like 
  83.           to extend the interpreter to include more modern APL fea-
  84.           tures like nested arrays.  
  85.           
  86.           Enjoy!  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.                                       - 3 -                           
  129.  
  130.  
  131.           222.000  LLLeeegggaaalll SSStttuuuffffff
  132.                
  133.             1. Definitions: "Licensor" is U S WEST Advanced Tech-
  134.                nologies, Inc., a Colorado corporation, whose principal
  135.                place of business is located at 4001 Discovery Drive, 
  136.                Boulder, Colorado, 80303.  "Software" means the source 
  137.                code computer programs known as APL\11 and all related 
  138.                materials, documentation, and information received by 
  139.                Licensee from Licensor.  
  140.                
  141.             2. Rights in Software: Licensor has obtained license 
  142.                rights under a quit claim license from AT&T which 
  143.                allows the free distribution of the Software to third 
  144.                persons.  
  145.                
  146.             3. License Grant: In accordance with the terms herein, 
  147.                Licensor grants to Licensee and Licensee accepts from 
  148.                Licensor a royalty free, perpetual, non-exclusive and 
  149.                non-transferable license to use, copy, modify and 
  150.                sublicense the Software to third persons.  
  151.                
  152.             4. Warranty Disclaimer: THIS SOFTWARE IS LICENSED "AS IS,"
  153.                AND LICENSOR DISCLAIMS ANY AND ALL WARRANTIES, WHETHER 
  154.                EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) ANY 
  155.                IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A 
  156.                PARTICULAR PURPOSE.  
  157.                
  158.             5. Indemnity: Licensee hereby indemnifies Licensor and 
  159.                holds Licensor harmless from and against any and all 
  160.                claims, including claims of infringement, which arise 
  161.                out of Licensee's use or sublicense of the Software as 
  162.                licensed hereunder.  
  163.                
  164.             6. Limitation of Liability: In no event shall Licensor be 
  165.                liable for any indirect, incidental, consequential, 
  166.                special, or exemplary damages or lost profits, even if 
  167.                Licensor has been advised of the possibility of such 
  168.                damages.  SOME STATES DO NOT ALLOW THE LIMITATION OR 
  169.                EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL 
  170.                DAMAGES, SO THE ABOVE LIMITATION OR EXCLUSION MAY NOT 
  171.                APPLY TO YOU.  
  172.                
  173.             7. General Provisions: 
  174.                     
  175.                  A. This License shall be governed by the laws of the 
  176.                     State of Colorado.  
  177.                     
  178.                  B. Licensee also agrees not to use any trade name, 
  179.                     service mark, or trademark of Licensor or refer to
  180.                     Licensor in any promotional activity or material 
  181.                     without first obtaining the prior written consent 
  182.                     of Licensor.  
  183.                     
  184.                  C. No action, regardless of form, arising  out of the
  185.                     License may be brought by Licensee more than one 
  186.                     year after the cause of action has arisen.  
  187.  
  188.  
  189.  
  190.  
  191.                                       - 4 -                           
  192.  
  193.  
  194.                  D. If any provision of this License is invalid under 
  195.                     any applicable statute or rule of law, it is to 
  196.                     that extent to be deemed omitted.  
  197.                     
  198.                  E. The waiver or failure of Licensor to exercise in 
  199.                     any respect any right provided for herein shall 
  200.                     not be deemed a waiver of any further right 
  201.                     hereunder.  
  202.                     
  203.                  F. Each party acknowledges that it has read this 
  204.                     License, it understands it, and agrees to be bound
  205.                     by its terms, and further agrees that this is the 
  206.                     complete and exclusive statement of the License 
  207.                     betweeen the two parties, which supersedes all 
  208.                     prior proposals, understandings, whether oral or 
  209.                     written, between the parties relating to this 
  210.                     License.  This License may not be modified or 
  211.                     amended except by written instrument duly executed
  212.                     by both parties.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.                                       - 5 -                           
  255.  
  256.  
  257.           333.000  BBBuuuiiillldddiiinnnggg ttthhheee IIInnnttteeerrrppprrreeettteeerrr -- SSSiiimmmpppllleee CCCaaassseee
  258.           
  259.           This section describes the steps needed to build the APL\11 
  260.           interpreter from source, assuming that nothing goes wrong.  
  261.           Building the interpreter requires yacc and a K&R-compatible 
  262.           C compiler.  A simple makefile is included with the source.
  263.           The command 
  264.           
  265.           $ make 
  266.           
  267.           with no arguments should produce an executable file named 
  268.           "apl".  
  269.           
  270.           If make is not available, the interpreter can be built by 
  271.           hand almost as easily.  The sequence of commands 
  272.           
  273.           $ yacc apl.y
  274.           $ cc -o apl *.c -lm
  275.               [compiler diagnostics]
  276.           $
  277.           
  278.           should produce the same executable file.  A relatively large
  279.           number of warnings will be issued by modern C compilers.  
  280.           The reasons are discussed in more detail in the next sec-
  281.           tion.  
  282.           
  283.           A quick test of the interpreter can be run with the command 
  284.           
  285.           $ ./apl <quick 
  286.           
  287.           which should get the following results 
  288.           
  289.           $ ./apl <quick
  290.           a p l  1 1
  291.           12 nov 1992
  292.           
  293.           clear ws
  294.                   a{1 2 3
  295.                   b{3 4 5
  296.                   a+b
  297.            4 6 8
  298.                   aXb
  299.             3  8 15
  300.                   a%b
  301.            .333333333 .500000000 .600000000
  302.                   aJ.*b
  303.              1   1   1
  304.              8  16  32
  305.             27  81 243
  306.                   )off
  307.           $
  308.           
  309.           If so, you can skip the next section.  If not, getting APL 
  310.           running on your machine will be somewhat more complicated.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.                                       - 6 -                           
  318.  
  319.  
  320.           444.000  BBBuuuiiillldddiiinnnggg ttthhheee IIInnnttteeerrrppprrreeettteeerrr -- HHHaaarrrddd CCCaaassseee
  321.           
  322.           Portability is a relative thing.  Successfully moving a 
  323.           piece of code from one machine to another involves many dif-
  324.           ferent factors.  This section discusses some of the assump-
  325.           tions made by the APL\11 source code.  Moving the inter-
  326.           preter to a machine on which some of those assumptions are 
  327.           no longer true will probably be quite painful.  This 
  328.           material is intended to help you decide if you are in that 
  329.           situation, or if there's still some hope of an "easy" fix.  
  330.           
  331.           The APL\11 source shows its age in several ways.  First, 
  332.           it's K&R rather than ANSI C.  Secoond, it predates the void 
  333.           data type, so is full of functions of type int that should 
  334.           be type void.  Third, it goes back to the bad old days when 
  335.           pointers and ints were treated as though they were 
  336.           interchangeable.  Because of these things, running the code 
  337.           through a modern C compiler results in a lot of warnings.  
  338.           
  339.           The assumption that pointers (all types of pointers) and 
  340.           ints are interchangeable is critical.  I seriously doubt 
  341.           that the code could ever be ported to an environment where 
  342.           this is not true.  Some of the MS-DOS compiler models do not
  343.           satisfy this condition.  The code also does a lot of pointer
  344.           arithmetic and comparisons.  If pointers can't be treated as
  345.           ints, these are apt to be a source of problems.  Again, 
  346.           situations like the MS-DOS segmented models should be 
  347.           avoided.  
  348.           
  349.           While the code doesn't use very many different types of 
  350.           structures, it does some fairly ugly things with the ones 
  351.           that are defined.  I believe that the following is the worst
  352.           case.  If your compiler doesn't mess this up, it probably 
  353.           won't mess up the other structures.  
  354.           
  355.           struct item
  356.           {
  357.               int   rank;
  358.               int   type;
  359.               int   size;
  360.               int   index;
  361.               data *datap;
  362.               int   dim[MRANK];
  363.           };
  364.           
  365.           Item structures are not directly allocated.  Instead, when a
  366.           new item is being created, the code computes the amount of 
  367.           storage actually needed to hold the item and information 
  368.           about it.  This is space for the four ints rank, type, size 
  369.           and index, space for as many ints as the value in rank, and 
  370.           space for as many datas as the value in size.  Data is 
  371.           usually defined as a double.  Assuming that p points to the 
  372.           allocated space, p->datap is set to &(p->dim[p->rank]).  
  373.           Clearly, inserting padding for alignment or some rearrange-
  374.           ments of the elements of the structure will break the code.
  375.  
  376.  
  377.  
  378.  
  379.  
  380.                                       - 7 -                           
  381.  
  382.  
  383.           Another assumption made by the code is that doubles (or 
  384.           floats in the case of a single-precision version) do not 
  385.           have any alignment requirements.  Some machines, for exam-
  386.           ple, require that a double begin at an address that is a 
  387.           multiple of eight.  Compilation of constant numeric expres-
  388.           sions into byte code will be broken if the machine has 
  389.           alignment requirements.  Fortunately, starting a double at 
  390.           an arbitrary location is okay with most contemporary proces-
  391.           sors.  However, some optimizing compilers may force align-
  392.           ment in order to improve execution speed.  
  393.           
  394.           As previously mentioned, exceptions are an area where it is 
  395.           hard to write portable code.  I have attempted to make the 
  396.           source code portable in the compiler sense by #ifdef'ing 
  397.           each use of an exception name (or signal name, if you 
  398.           prefer).  For example, 
  399.           
  400.           #ifdef SIGPIPE
  401.               signal(SIGPIPE, panic);
  402.           #endif
  403.           
  404.           This makes the compiler happy, but is not enough to 
  405.           guarantee that the interpreter will do the expected thing in
  406.           all exception cases.  
  407.  
  408.  
  409.  
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420.  
  421.  
  422.  
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.                                       - 8 -                           
  444.  
  445.  
  446.           555.000  RRRuuunnnnnniiinnnggg ttthhheee IIInnnttteeerrrppprrreeettteeerrr
  447.           
  448.           The APL\11 interpreter is invoked with the simple command 
  449.           "apl".  APL (from here on I'll generally use APL and APL\11 
  450.           interchangeably; if I mean some other APL, it should be 
  451.           clear from context) responds with a header message.  A work-
  452.           space name may be provided as a command-line argument.  If 
  453.           the named workspace can be found, it is loaded.  If it is 
  454.           not found, APL looks for a workspace named "continue" and 
  455.           loads that instead.  If a workspace is loaded and contains a
  456.           latent expression, the latent expression is executed.  
  457.           
  458.           Workspaces are simply UNIX data files.  The name of the wor-
  459.           kspace is the same as the file name.  Workspaces can be 
  460.           saved in either native or portable form.  Save and load in 
  461.           the native form is much quicker than the portable form.  The
  462.           portable format used by APL\11 does not, unfortunately, con-
  463.           form to the standard workspace interchange format.  So while
  464.           it allows APL11 workspaces to be moved from one machine 
  465.           running APL11 to another, workspaces can't be moved to other
  466.           APLs.  
  467.           
  468.           Once entered, the main command loop prompts the user for 
  469.           input.  The user types an APL system command or expression.
  470.           APL attempts to execute the expression.  The set of system 
  471.           commands is described in detail in a later section.  Many, 
  472.           such as ")off" and ")clear" are much the same as the system 
  473.           commands of other APLs.  Some, such as ")editf" and ")read",
  474.           are unique (in my experience) to APL\11.  
  475.           
  476.           
  477.           555.111  CCChhhaaarrraaacccttteeerrr SSSeeettt
  478.           
  479.           APL uses the ASCII character set to represent APL charac-
  480.           ters.  The particular mapping takes some getting used to.  
  481.           The complete allowed character set is described in detail in
  482.           Appendix A.  A quick description is provided here.  
  483.                
  484.              o Names, such as used for variables and functins, use 
  485.                lower-case alphanumerics.  A second character set, cor-
  486.                responding to the traditional understruck characters, 
  487.                is also available and is generated by overstriking the 
  488.                lower-case characters with an upper-case "F".  
  489.                
  490.              o Where a particular non-alphanumeric APL character has a
  491.                look-alike in the ASCII set, the look-alike is used.  
  492.                This covers plus, minus, equal, square brackets, etc.  
  493.                
  494.              o Where there are no true look-alikes, one of two rules 
  495.                is followed.  If there is an ASCII character that 
  496.                resembles the APL character, it is used.  This leads to
  497.                "%" for divide, "X" for multiplication, etc.  
  498.                
  499.              o The other way of handling characters is to use the 
  500.                upper-case ASCII character at the corresponding 
  501.                keyboard position.  This rule yields "A" for alpha, "R"
  502.  
  503.  
  504.  
  505.  
  506.                                       - 9 -                           
  507.  
  508.  
  509.                for rho, "E" for epsilon, "Y" for the up-arrow (take), 
  510.                "U" for the down-arrow (drop), etc.  
  511.                
  512.              o Overstruck characters are typed using backspace.  The 
  513.                order in which the component characters are typed does 
  514.                not matter.  One common problem occurs when backspace 
  515.                is also used as the erase character.  In that case, the
  516.                backspace must be "escaped" in some fashion so that it 
  517.                actually reaches APL.  Or the user may find it more 
  518.                convenient to change the erase character to something 
  519.                else that is used by neither the interpreter or the tty
  520.                driver (something like control-F).  
  521.           
  522.           The internal character set is such that it should be a 
  523.           straightforward matter to write input and output filters for
  524.           interacting with the interpreter.  These filters would be 
  525.           specific to particular display devices.  Unfortunately, 
  526.           display editors will generally not work gracefully with such
  527.           filters.  At some point in the future, I would like to add 
  528.           some simple function editing capabilities to the interpreter
  529.           itself in order to get around that problem.  
  530.           
  531.           Literal character strings have been extended somewhat in 
  532.           order to be more UNIX-like.  The backslash character is used
  533.           to indicate some special characters.  \n is newline, \b is 
  534.           backspace, \t is tab, \r is carriage return, and \\ is a 
  535.           backslash.  The backslash can also be used to specify three-
  536.           digit octal values.  Using an octal value, the ASCII ESC 
  537.           character would be \033.  This extension makes it easier to 
  538.           handle things like escape sequences for terminal control.  
  539.           
  540.           By way of some summary, here is a transcript of a short APL 
  541.           session.  I have always liked APL\11's )script capability 
  542.           for recording a session.  Notice that since function editing
  543.           is done by an external editor, none of the editing portion 
  544.           of the session appears in the record.  Also, the plot func-
  545.           tion is my own, and isn't very good.  
  546.           
  547.           
  548.           linux> apl
  549.           a p l \ 1 1
  550.           12 nov 1992
  551.           
  552.           clear ws
  553.                   )script log
  554.           [new file]
  555.                   )load utility.ws
  556.             18.52.14 08/25/92 utility.ws
  557.                   )fns
  558.           plot   and  vs  space
  559.                   )editf and
  560.                   a{100 1RI100     C a is one column, 1-100
  561.                   a{a-1            C subtract 1 from everything
  562.                   a{aX0.0628       C map to 0 to two-pi
  563.                   a{a,(1Oa),2Oa    C add sine and cosine columns
  564.                   20 60 plot a     C plot
  565.  
  566.  
  567.  
  568.  
  569.                                      - 10 -                           
  570.  
  571.  
  572.            
  573.                 1.00 XXXXX     OOOOOOOOO                                XXXX      
  574.                      |    XX  OO       OO                             XX          
  575.                      |     XXO           O                           X            
  576.                      |     OXX            O                         X             
  577.                      |    OO  X            OO                      X              
  578.                  .50 |   OO    X            OO                    X               
  579.                      |  OO      X            OO                  X                
  580.                      |  O        X            O                 X                 
  581.                      | O         XX            O               X                  
  582.                      |O           XX            O             X                   
  583.                  .00 O             X             O           XX            O      
  584.                      |              XX           OO         XX            O       
  585.                      |               X             O        X            O        
  586.                      |                X            OO      X            OO        
  587.                      |                 X            OO    X            OO         
  588.                 -.50 |                  X            OO XX            O           
  589.                      |                   X            OXX            O            
  590.                      |                    X           XXO           O             
  591.                      |                     XX        XX OOO       OO              
  592.                      |                       XXXXXXXX     OOOOOOOOO               
  593.                -1.00 |         |         |         |         |         |         |
  594.                    .00      1.17      2.33      3.50      4.67      5.83      7.00
  595.            
  596.                   )script off
  597.           
  598.           
  599.           555.222  SSSaaavvviiinnnggg aaannnddd LLLoooaaadddiiinnnggg
  600.           
  601.           Workspaces are explicitly loaded by the command ")load 
  602.           wsname".  The current workspace can be explicitly saved by 
  603.           the command ")save wsname".  The workspace name must always 
  604.           be provided.  Additional information about the )load and 
  605.           )save system commands, as well as the other system commands 
  606.           supported by APL\11, is provided in Appendix B.  
  607.           
  608.           A saved workspace includes function definitions and 
  609.           variables.  If there are suspended functions, all of the 
  610.           local variables for those functions are also saved.  
  611.           However, the APL state indicator is not saved, so that those
  612.           variables become global in scope when the saved workspace is
  613.           loaded.  Trying to save the state indicator is very hard in 
  614.           the current version of the interpreter because of the way 
  615.           the main program loop is implemented.  Someone should fix 
  616.           this sometime.  
  617.           
  618.           )save and )load write and read native-mode workspaces.  The 
  619.           commands )psave and )pload write and read workspaces in a 
  620.           more portable format.  This format should be portable from 
  621.           one machine to another, so long as they both use the ASCII 
  622.           character set.  When examined manually, the format can be 
  623.           seen to be somewhat human readable.  Editing a saved work-
  624.           space is not safe.  Function definitions are terminated by a
  625.           null character, which most editors will simply drop while 
  626.           reading.  The image saved by the editor would not be accept-
  627.           able when read by APL.  
  628.  
  629.  
  630.  
  631.  
  632.                                      - 11 -                           
  633.  
  634.  
  635.           )psave and )pload are slower than their native-mode 
  636.           equivalents, especially if the workspace contains large 
  637.           amounts of data.  Saving a workspace in portable format can 
  638.           result in some loss of precision for floating point values.
  639.           This is a result of the portable workspace format, which 
  640.           represents numbers using decimal digits and ASCII characters
  641.           (that is, "1.23456e-78").  
  642.           
  643.           
  644.           555.333  FFFuuunnnccctttiiiooonnn EEEdddiiitttiiinnnggg
  645.           
  646.           APL\11 does not include a built-in editing capability.  All 
  647.           functions are edited by dumping the source code into a tem-
  648.           porary file and then invoking the user's editor-of-choice on
  649.           that temporary file.  The temporary file is created in 
  650.           /tmp.  Which editor is invoked is determined by the value of
  651.           the shell variable EDITOR.  If EDITOR is not defined, the 
  652.           name of the editor defaults to "vile", a clone of Berkeley 
  653.           vi.  I thought about defaulting to "ed", but decided that 
  654.           only us old-timers remember how to use line-oriented non-
  655.           display editing.  
  656.           
  657.           The new function definition is read back in when the editing
  658.           process terminates.  The source code is not compiled into 
  659.           byte codes until the "executable" is actually needed.  
  660.           Syntax errors in the source code will not be detected until 
  661.           compilation occurs.  As described previously, overstruck 
  662.           characters must have the form a-backspace-b.  In order to 
  663.           use these characters in a function, the editor must be cap-
  664.           able of putting real backspaces into the source file.  Most 
  665.           editors are capable of displaying and inserting backspaces, 
  666.           but may vary in the details of how it's actually done.  
  667.           
  668.           APL will not allow the user to edit suspended functions.  If
  669.           the user attempts to do so, APL responds with the message 
  670.           "si damage -- type ')reset'".  There isn't any actual damage
  671.           to the state indicator, although the message might be inter-
  672.           preted that way.  Another reason for adding simple function 
  673.           editing capabilities to APL\11 itself (see also the preced-
  674.           ing section on "Function Editing") is to allow the user to 
  675.           modify suspended functions when such changes do not create 
  676.           any problems.  
  677.           
  678.           
  679.           555.444  EEExxxccceeeppptttiiiooonnnsss
  680.           
  681.           Proper handling of exception conditions is one of the 
  682.           hardest areas to make truly portable.  Different machines 
  683.           and operating systems allow different kinds of exceptions to
  684.           occur.  Some are pretty much the same on all machines; divi-
  685.           sion by zero is an error on most computers*.  Bad pointers, 
  686.  
  687.           __________
  688.  
  689.            *   One exception that I know about is old CDC hardware.  
  690.                There, division by zero results in a special bit pat-
  691.  
  692.  
  693.  
  694.  
  695.                                      - 12 -                           
  696.  
  697.  
  698.           on the other hand, can result in a variety of different 
  699.           errors on different machines: segmentation violations, bus 
  700.           errors, etc.  
  701.           
  702.           I have attempted to make the source code portable in the 
  703.           compiler sense by #ifdef'ing each use of an exception name 
  704.           (or signal name, if you prefer).  For example, 
  705.           
  706.           #ifdef SIGPIPE
  707.               signal(SIGPIPE, panic);
  708.           #endif
  709.           
  710.           This keeps the compiler happy because the code doesn't 
  711.           reference signals that don't exist.  However, on any partic-
  712.           ular machine there may be signals which exist but are not 
  713.           properly trapped.  When the corresponding exceptions occur, 
  714.           the system default action (often a core dump) will be taken 
  715.           rather than the interpreter's recovery actions.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742.  
  743.  
  744.  
  745.  
  746.           __________
  747.  
  748.                tern representing an indefinite or undefined value, but
  749.                is not an error.  However, attempting to use the 
  750.                indefinite value in a subsequent calculation is an 
  751.                error.  The subsequent calculation always seemed to be 
  752.                in a different subroutine several pages away in the 
  753.                source listing.  This made debugging more difficult.  
  754.  
  755.  
  756.  
  757.  
  758.                                      - 13 -                           
  759.  
  760.  
  761.           666.000  IIInnnttteeerrrnnnaaalllsss
  762.           
  763.           Someday, this section will describe the internal workings of
  764.           the APL\11 interpreter.  It is intended as a starting point 
  765.           for a programmer attempting to modify the interpreter 
  766.           itself.  It will contain a lot of information that I wish I 
  767.           had had before I started working on the code.  However, that
  768.           day has not yet arrived, and these couple of paragraphs are 
  769.           placeholders only.  
  770.           
  771.           For the brave of heart who jump in anyway, some housekeeping
  772.           hints.  I edit C language source code in a fairly big text 
  773.           window (40 rows of 90 columns) with tab stops set at every 
  774.           fourth column.  I've been through the entire body of code 
  775.           and brought it pretty much into alignment with my own per-
  776.           sonal preferences for things like indenting, grouping, and 
  777.           brace placement.  Looking at the code using other arrange-
  778.           ments such as eight-column tab stops or a "normal" 24 by 80 
  779.           screen will probably make things look uglier than they 
  780.           actually are.  
  781.           
  782.           
  783.           666.111  PPPrrriiinnnccciiipppllleee DDDaaatttaaa SSStttrrruuuccctttuuurrreeesss
  784.           
  785.           
  786.           666.222  MMMaaaiiinnn PPPrrrooogggrrraaammm LLLooooooppp
  787.           
  788.           
  789.           666.333  CCCooommmpppiiillliiinnnggg
  790.           
  791.           
  792.           666.444  EEExxxeeecccuuutttiiiooonnn
  793.  
  794.  
  795.  
  796.  
  797.  
  798.  
  799.  
  800.  
  801.  
  802.  
  803.  
  804.  
  805.  
  806.  
  807.  
  808.  
  809.  
  810.  
  811.  
  812.  
  813.  
  814.  
  815.  
  816.  
  817.  
  818.  
  819.  
  820.  
  821.                                      - 14 -                           
  822.  
  823.  
  824.           AAAppppppeeennndddiiixxx AAA
  825.           TTThhheee AAAPPPLLL\111111 CCChhhaaarrraaacccttteeerrr SSSeeettt
  826.           
  827.           This section provides a quick reference for the character 
  828.           set used by the APL\11 interpreter.  Note that both upper- 
  829.           and lower-case characters are used.  <bs> denotes backspace.
  830.           
  831.                 a-z             letter
  832.                 0-9             digit
  833.                 `               negative sign
  834.                 '--'            string
  835.                 C <bs> J  C     comment
  836.                 ( )
  837.                 [ ; ]           indexing
  838.                 L               quad
  839.                 L <bs> '        quote quad
  840.                 
  841.                                 dyadic          monadic
  842.                                 ------          -------
  843.                 +               add             plus
  844.                 -               sub             negate
  845.                 X               mult            sign
  846.                 %               div             reciprical
  847.                 |               mod             absolute value
  848.                 D               min             floor
  849.                 S               max             ceiling
  850.                 *               pwr             exp
  851.                 O <bs> *        log             ln (log base e)
  852.                 O               circle funct    pi times
  853.                 ' <bs> .        combinatorial   factorial
  854.                 !               combinatorial   factorial
  855.                 ^               and
  856.                 V               or
  857.                 ^ <bs>          nand
  858.                 V <bs>          nor
  859.                 <               lt
  860.                 >               gt
  861.                 $               le
  862.                 &               ge
  863.                 =               eq
  864.                 #               ne
  865.                                                 not
  866.                 ?               deal            random number
  867.                 R               rho             rho
  868.                 I               iota            iota
  869.                 E               epsilon
  870.                 N               encode
  871.                 B               decode
  872.                 \ <bs> O        transpose       transpose
  873.                 ,               catenate        ravel           *
  874.                 Y               take
  875.                 U               drop
  876.                 {               assign
  877.                 }                               goto
  878.                 B <bs> N        i-beam          i-beam
  879.                 L <bs> %        matrix div      matrix inverse
  880.  
  881.  
  882.  
  883.  
  884.                                      - 15 -                           
  885.  
  886.  
  887.                 | <bs> H        grade up                        *
  888.                 G <bs> |        grade down                      *
  889.                 B <bs> J                        execute
  890.                 N <bs> J                        format
  891.                 /               compress                        *
  892.                 / <bs> -        compress
  893.                 \               expand                          *
  894.                 \ <bs> -        expand
  895.                 O <bs> |        rotate          reverse         *
  896.                 O <bs> -        rotate          reverse
  897.                 op /                            reduce          *
  898.                 op / <bs> -                     reduce
  899.                 J.op            outer product
  900.                 op.op           inner product
  901.                 
  902.                 * may be subscripted with a scalar
  903.  
  904.  
  905.  
  906.  
  907.  
  908.  
  909.  
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926.  
  927.  
  928.  
  929.  
  930.  
  931.  
  932.  
  933.  
  934.  
  935.  
  936.  
  937.  
  938.  
  939.  
  940.  
  941.  
  942.  
  943.  
  944.  
  945.  
  946.  
  947.                                      - 16 -                           
  948.  
  949.  
  950.           AAAppppppeeennndddiiixxx BBB
  951.           SSSyyysssttteeemmm CCCooommmmmmaaannndddsss
  952.           
  953.           The following is a complete list of APL system commands.  
  954.                         
  955.           )clear        This command is used to completely initialize 
  956.                         an APL workspace.  Usually when APL is 
  957.                         started, it will print: "clear ws".  This 
  958.                         means that no internal variables or functions 
  959.                         are defined.  Sometimes, it is desirable to 
  960.                         completely erase everything, and this command 
  961.                         serves that purpose.  To let you know that 
  962.                         everything has been erased, APL will output 
  963.                         the message "clear ws".  
  964.                         
  965.           )erase list   This command is handy when it is desirable to 
  966.                         get rid of parts of a workspace without using 
  967.                         ")clear" to eliminate all of it.  A list of 
  968.                         function and variable names (separated by 
  969.                         spaces or tabs) may be specified.  The named 
  970.                         functions and variables will be deleted from 
  971.                         the internal workspace.  The remainder of the 
  972.                         workspace will not be affected.  
  973.                         
  974.           )save xxx     This command causes APL to write its internal 
  975.                         workspace into a UNIX file.  This allows the 
  976.                         current session to be resumed at a later time.
  977.                         If the save is successful, APL will output the
  978.                         date and time.  
  979.                         
  980.           )vsave xxx    This command allows parts of a workspace to be
  981.                         saved.  The functions and variables which are 
  982.                         specified will be saved in a UNIX file in the 
  983.                         same format as produced by ")save".  APL will 
  984.                         prompt for the names of the functions and 
  985.                         variables to be saved.  When you have entered 
  986.                         the last name, type a blank line to end the 
  987.                         save operation.  The workspace you have 
  988.                         created with ")vsave" may be loaded with 
  989.                         ")load" at some later time.  ")vsave" does not
  990.                         affect variables in the internal workspace.  
  991.                         
  992.           )load xxx     This command is used to tell APL to load the 
  993.                         UNIX file "xxx" into APL as a workspace.  
  994.                         After the file is loaded, APL's internal work-
  995.                         space will be the same as it was when the wor-
  996.                         kspace file was saved with ")save", and that 
  997.                         previous APL session may be resumed.  If the 
  998.                         workspace file exists and is successfully 
  999.                         loaded, APL will print the time and date that 
  1000.                         the workspace was last saved.  
  1001.                         
  1002.           )copy xxx     This command instructs APL to locate the UNIX 
  1003.                         file "xxx" and load it into its internal work-
  1004.                         space, similar to the ")load" command.  The 
  1005.                         difference between ")load" and ")copy" is that
  1006.  
  1007.  
  1008.  
  1009.  
  1010.                                      - 17 -                           
  1011.  
  1012.  
  1013.                         ")load" will replace the current internal wor-
  1014.                         kspace with the one being read in, while 
  1015.                         ")copy" merges the current internal workspace 
  1016.                         with the one being read in.  Functions and 
  1017.                         variables which are loaded from the file take 
  1018.                         precedence over functions and variables of the
  1019.                         same name existing already in the internal 
  1020.                         workspace.  
  1021.                         
  1022.           )digits n     This command is used to specify to APL how 
  1023.                         many digits are to be displayed when a number 
  1024.                         is printed in floating-point or exponential 
  1025.                         format.  By default, APL will print 9 digits.
  1026.                         You may specify any number between 1 and 19 
  1027.                         for the number of digits (n).  APL will answer
  1028.                         with the number of digits it was using.  
  1029.                         
  1030.           )origin n     This command is used to change the "origin".  
  1031.                         By default, the origin is 1.  The "origin" is 
  1032.                         the starting index for arrays.  For example, 
  1033.                         if the origin is 0, then the first element of 
  1034.                         a 3-element array A is A[0].  If the origin is
  1035.                         5, the first element will be A[5].  Although 
  1036.                         standard APL permits only 0 or 1 for the 
  1037.                         origin, APL\11 allows any integer value.  APL 
  1038.                         will answer with the origin it was using.  
  1039.                         
  1040.           )width n      This command tells APL to print n characters 
  1041.                         per line.  This is useful to keep output from 
  1042.                         being printed outside of the physical terminal
  1043.                         width.  Lines longer than this length will be 
  1044.                         "wrapped-around".  APL answers this command 
  1045.                         with the previous terminal width.  
  1046.                         
  1047.           )off          This command does the same thing that a 
  1048.                         control-D does -- it terminates the APL ses-
  1049.                         sion.  
  1050.                         
  1051.           )continue     ")continue" is a combination of the ")save" 
  1052.                         and ")off" commands.  The internal workspace 
  1053.                         is saved in a file named "continue", and then 
  1054.                         APL is terminated.  Since APL will by default 
  1055.                         look for the file "continue" in the current 
  1056.                         directory when it is next run, this provides a
  1057.                         convenient method of suspending and resuming 
  1058.                         an APL session.  
  1059.                         
  1060.           )fns          This command causes APL to list the names of 
  1061.                         all of the functions which are defined in its 
  1062.                         internal workspace.  
  1063.                         
  1064.           )vars         This command causes APL to list the names of 
  1065.                         all of the variables which are defined in its 
  1066.                         internal workspace.  
  1067.  
  1068.  
  1069.  
  1070.  
  1071.  
  1072.  
  1073.                                      - 18 -                           
  1074.  
  1075.  
  1076.           )lib          This command is similar to the UNIX "ls".  It 
  1077.                         causes APL to list the names of all of the 
  1078.                         UNIX files in the current directory.  Long 
  1079.                         file names tend to result in ugly output; I 
  1080.                         modified the existing code to use more contem-
  1081.                         porary (read file system independent) methods 
  1082.                         to get the names, but didn't change it in any 
  1083.                         other ways.  Names are truncated to 14 charac-
  1084.                         ters and don't always line up nicely in 
  1085.                         columns.  
  1086.                         
  1087.           )editf xxx    This command is used to create and edit func-
  1088.                         tions.  If the function named "xxx" exists in 
  1089.                         the workspace, APL will write it into a tem-
  1090.                         porary file in /tmp and then will invoke the 
  1091.                         editor defined by the shell variable EDITOR to
  1092.                         edit that file.  If EDITOR is not defined, the
  1093.                         default value "vile" is used.  When you have 
  1094.                         finished editing the file, and you exit the 
  1095.                         editor, APL will come back and will read the 
  1096.                         function in from the temporary file.  
  1097.                         
  1098.           )edit xxx     This command is similar to ")editf" except 
  1099.                         that "xxx" is a UNIX filename.  APL will exe-
  1100.                         cute the editor to edit the file named "xxx", 
  1101.                         and when the editing is complete, APL will 
  1102.                         read that file into the workspace.  The dif-
  1103.                         ference between ")edit" and ")editf" is that 
  1104.                         ")editf" essentially edits functions directly 
  1105.                         from the workspace, while ")edit" gets the 
  1106.                         functions from a named file.  
  1107.                         
  1108.           )read xxx     At times it is desirable to read a function 
  1109.                         which is stored in an ASCII file into the 
  1110.                         internal workspace without editing it.  The 
  1111.                         ")read" command causes APL to read the file 
  1112.                         named "xxx" into the workspace as a function.
  1113.                         Note that ")read" and ")load" are _n_o_t the same
  1114.                         thing.  ")load" reads a complete new workspace
  1115.                         into APL from a workspace-format file, while 
  1116.                         ")read" reads a function from an ASCII file 
  1117.                         and adds it to the current workspace.  
  1118.                         
  1119.           )write xxx    This command is the complement of ")read".  It
  1120.                         takes the function "xxx" from the current wor-
  1121.                         kspace and writes it to an ASCII file named 
  1122.                         "xxx".  This is useful for writing functions 
  1123.                         which will be ")read" later into other work-
  1124.                         spaces or which will be printed on the line-
  1125.                         printer.  Note ")write" and ")vsave" are not 
  1126.                         the same thing, for ")write" is used to write 
  1127.                         a function into an ASCII file and ")vsave" 
  1128.                         saves a selected subset of the internal work-
  1129.                         space in a workspace-format file.  
  1130.  
  1131.  
  1132.  
  1133.  
  1134.  
  1135.  
  1136.                                      - 19 -                           
  1137.  
  1138.  
  1139.           )drop list    This command performs the same function as 
  1140.                         UNIX "rm".  The names of the files to be 
  1141.                         deleted should be separated by spaces or tabs.
  1142.                         The files may be APL workspaces, ASCII files, 
  1143.                         or any other type of file.  
  1144.                         
  1145.           )script xxx   This command places APL into a "protocol" 
  1146.                         mode.  Following this command, APL will copy 
  1147.                         all input from the terminal and output to the 
  1148.                         terminal to the file "xxx".  Thus, "xxx" is a 
  1149.                         complete transcript of the APL session.  To 
  1150.                         turn off the script file, type ")script off".
  1151.                         The protocol file which is produced will 
  1152.                         contain all of the output produced by APL 
  1153.                         itself, but will, unfortunately, not contain 
  1154.                         any output produced by another process (such 
  1155.                         as the editor).  
  1156.                         
  1157.           )trace        This command turns on APL's internal "trace" 
  1158.                         mode.  When tracing is turned on, APL will 
  1159.                         report the function name and line number of 
  1160.                         each line in every function executed.  Thus, 
  1161.                         the flow of execution from the start to the 
  1162.                         end of a run can be followed.  
  1163.                         
  1164.           )untrace      This command turns off "trace" mode.  
  1165.                         
  1166.           )si           This command is useful when something goes 
  1167.                         wrong.  When an error occurs, the function 
  1168.                         that was executing is "suspended".  The ")si" 
  1169.                         command causes APL to print a traceback of the
  1170.                         suspended functions.  Each function is listed,
  1171.                         in the reverse order that it was called.  The 
  1172.                         current line number for each function is also 
  1173.                         printed.  Functions followed by an asterisk 
  1174.                         ("*") were suspended due to an error; these 
  1175.                         were called by functions listed on the follow-
  1176.                         ing lines whose names are not followed by an 
  1177.                         asterisk.  
  1178.                         
  1179.           )reset        This command is used to reset the state 
  1180.                         indicator.  All suspended functions are reset;
  1181.                         the state indicator will be cleared.  APL 
  1182.                         returns to the global level.  
  1183.                         
  1184.           )shell        This command is useful when it is desired to 
  1185.                         escape from the APL environment temporarily 
  1186.                         without having to save the current internal 
  1187.                         workspace, exit APL, and later re-enter APL 
  1188.                         and reload the workspace.  ")shell" invokes 
  1189.                         the UNIX shell indicated by the SHELL environ-
  1190.                         ment variable.  If SHELL is not defined, the 
  1191.                         shell defaults to "/bin/sh".  When you exit 
  1192.                         the shell, you return to APL.  
  1193.  
  1194.  
  1195.  
  1196.  
  1197.  
  1198.  
  1199.                                      - 20 -                           
  1200.  
  1201.  
  1202.           )list xxx     This command causes APL to print out the func-
  1203.                         tion named "xxxx".  This is very handy for 
  1204.                         looking at a function without having to use 
  1205.                         the editor -- especially when an error has 
  1206.                         occurred and you want to look at a function 
  1207.                         without disturbing the state indicator.  
  1208.                         
  1209.           )prws         This command causes APL to print the contents 
  1210.                         of the workspace in a readable format.  Non-
  1211.                         scalar variables are displayed along with 
  1212.                         their dimensions; functions are displayed as 
  1213.                         via the ")list" system command.  While a work-
  1214.                         space listing can be placed into a file by use
  1215.                         of a script file, a more efficient means of 
  1216.                         generating a workspace listing is to use the 
  1217.                         program "prws".  
  1218.                         
  1219.           )debug        This command invokes "debug mode."  In this 
  1220.                         mode, every action which APL takes is logged 
  1221.                         on the terminal.  This mode is excellent for 
  1222.                         generating reams of hopelessly cryptic output 
  1223.                         and exists only to facilitate APL development.
  1224.                         It is not intended for general use.  Debug 
  1225.                         mode can be turned off by issuing the ")debug"
  1226.                         system command a second time.  
  1227.                         
  1228.           )code fn      This command causes APL to print the compiled 
  1229.                         internal code for the function "fn".  This is 
  1230.                         also intended for APL system development and 
  1231.                         not for general use.  
  1232.                         
  1233.           )memory       The result of this command is a report on cur-
  1234.                         rent dynamic memory usage.  The basic form is 
  1235.                         "n bytes in m blocks".  These values represent
  1236.                         memory in use rather than memory available.  
  1237.                         Available memory is not terribly meaningful 
  1238.                         when the process size can be increased on 
  1239.                         request until some system limit is reached.  
  1240.  
  1241.  
  1242.  
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258.  
  1259.  
  1260.  
  1261.  
  1262.                                      - 21 -                           
  1263.  
  1264.  
  1265.           AAAppppppeeennndddiiixxx CCC
  1266.           AAAPPPLLL\111111 QQQuuuaaaddd FFFuuunnnccctttiiiooonnnsss
  1267.           
  1268.           The following quad functions are defined under APL\11: 
  1269.                                   
  1270.           Lcr 'name'              The result of "Lcr" is a character 
  1271.                                   array containing the function whose 
  1272.                                   name is passed as an argument.  
  1273.                                   
  1274.           Lfx newfn               The contents of the character array 
  1275.                                   specified as an argument are fixed 
  1276.                                   as an APL function.  
  1277.                                   
  1278.           Lrun 'unix command'     The argument passed to "Lrun" is 
  1279.                                   executed as a UNIX shell command.  
  1280.                                   
  1281.           Lfork xx                "xx" is a dummy argument.  A "fork" 
  1282.                                   system call is performed.  This quad
  1283.                                   function should be used by 
  1284.                                   experienced UNIX users only and 
  1285.                                   probably will be followed by a 
  1286.                                   "Lexec" quad function.  The process-
  1287.                                   id of the child is returned to the 
  1288.                                   parent; a zero is returned to the 
  1289.                                   child.  
  1290.                                   
  1291.           Lexec matrix            Takes a two-dimensional character 
  1292.                                   matrix and formats it into a UNIX 
  1293.                                   "exec" system call.  The matrix 
  1294.                                   passed as an argument must be two-
  1295.                                   dimensional, the rows must be 
  1296.                                   fIzerofR terminated.  This quad 
  1297.                                   function should be used by 
  1298.                                   experienced UNIX users only.  
  1299.                                   
  1300.           Lwait xx                This quad function is used in con-
  1301.                                   junction with "Lfork" -- it returns 
  1302.                                   a 3-element vector of information 
  1303.                                   about a child process which has ter-
  1304.                                   minated.  The first element is 
  1305.                                   either the PID of a completed child 
  1306.                                   process or -1 (no children).  The 
  1307.                                   second is the status of the dead PID
  1308.                                   and the last is the completion code.
  1309.                                   This quad function should be used by
  1310.                                   experienced UNIX users only.  
  1311.                                   
  1312.           Lexit code              This quad function is used to ter-
  1313.                                   minate the execution of the current 
  1314.                                   process, with the completion code 
  1315.                                   "code".  It should be used to ter-
  1316.                                   minate child processes and can be 
  1317.                                   used to terminate an APL session; 
  1318.                                   however, it is recommended that 
  1319.                                   "Lexit" be used by experienced UNIX 
  1320.                                   users only.  
  1321.  
  1322.  
  1323.  
  1324.  
  1325.                                      - 22 -                           
  1326.  
  1327.  
  1328.           Lpipe xx                This quad function can be used to 
  1329.                                   set up a pipe (used for interprocess
  1330.                                   communication) It returns a 2-ele-
  1331.                                   ment vector containing the two 
  1332.                                   "pipe" file descriptors.  
  1333.                                   
  1334.           Lchdir 'directory'      This quad function can be used to 
  1335.                                   change APL to another directory.  
  1336.                                   Normally, APL runs in the directory 
  1337.                                   that you were in when it was started
  1338.                                   by the "apl" command.  This function
  1339.                                   changes APL to another directory.  
  1340.                                   The argument is a character vector 
  1341.                                   specifying the new directory (there 
  1342.                                   is NO way to default this).  A 0 is 
  1343.                                   returned if the "chdir" was suc-
  1344.                                   cessful; a -1 is returned if it 
  1345.                                   failed.  
  1346.                                   
  1347.           mode Lopen 'file'       This function is dyadic.  It opens a
  1348.                                   UNIX file for use by an APL function
  1349.                                   with calls via "Lread" and "Lwrite".
  1350.                                   The first argument is the mode for 
  1351.                                   the open (0=read, 1=write, 2=read/
  1352.                                   write).  The second argument is a 
  1353.                                   character vector containing the file
  1354.                                   name.  The file descriptor of the 
  1355.                                   opened file is returned (-1 for 
  1356.                                   error).  
  1357.                                   
  1358.           Lclose fd               This function complements "Lopen".  
  1359.                                   The argument is the file descriptor 
  1360.                                   of a UNIX file to be closed.  This 
  1361.                                   function returns 0 for success or -1
  1362.                                   for failure.  
  1363.                                   
  1364.           mode Lcreat 'file'      This function creates a UNIX file.  
  1365.                                   If the file already exists, it is 
  1366.                                   truncated to zero length.  The crea-
  1367.                                   tion mode is specified as the first 
  1368.                                   argument (see CHMOD(I) for mode 
  1369.                                   description).  The filename is 
  1370.                                   specified in a character vector as 
  1371.                                   the second argument.  The file 
  1372.                                   descriptor of the created file (or -
  1373.                                   1 for error) is returned.  
  1374.                                   
  1375.           fd Lread nbytes         This function reads a specified 
  1376.                                   number of bytes from a designated 
  1377.                                   file.  The first argument is the 
  1378.                                   file descriptor; the second is the 
  1379.                                   number of bytes to be read.  The 
  1380.                                   data which is read is returned.  
  1381.                                   Note that the returned vector is 
  1382.                                   always character data -- to convert 
  1383.                                   to numeric format see the function 
  1384.  
  1385.  
  1386.  
  1387.  
  1388.                                      - 23 -                           
  1389.  
  1390.  
  1391.                                   "Lfloat".  
  1392.                                   
  1393.           fd Lwrite data          This function writes data to a 
  1394.                                   specified file.  The first argument 
  1395.                                   is the file descriptor; the second 
  1396.                                   is the data to be written.  The 
  1397.                                   number of bytes written is returned 
  1398.                                   as the count.  Any type of data 
  1399.                                   (character or numeric) may be writ-
  1400.                                   ten in this manner.  
  1401.                                   
  1402.           Lseek (fd,pos,mode)     This function executes the "seek" 
  1403.                                   system call on a UNIX file.  The 
  1404.                                   argument to "Lseek" is a three-ele-
  1405.                                   ment vector containing the file 
  1406.                                   descriptor, seek offset, and mode 
  1407.                                   (see SEEK (II)).  A 0 is returned 
  1408.                                   for a successful seek; -1 is 
  1409.                                   returned if an error is detected.  
  1410.                                   
  1411.           pid Lkill signal        This function executes the "kill" 
  1412.                                   system call.  The first argument 
  1413.                                   specifies what process is to be 
  1414.                                   signalled.  The second argument 
  1415.                                   specifies what signal is to be sent.
  1416.                                   A 0 is returned for a successful 
  1417.                                   "kill"; -1 is returned if the speci-
  1418.                                   fied process could not be found or 
  1419.                                   is not owned by the current user.  
  1420.                                   For more information on signals, see
  1421.                                   KILL (II).  
  1422.                                   
  1423.           Lrd fd                  This function reads one line from 
  1424.                                   the file descriptor specified.  If 
  1425.                                   the line is completely blank, a null
  1426.                                   string is returned.  An end-of-file 
  1427.                                   will also return a null string.  
  1428.                                   Otherwise, the returned value is the
  1429.                                   character string which was read.  
  1430.                                   
  1431.           Lrm 'filename'          The specified file will be removed, 
  1432.                                   equivalent to )drop filename.  A 0 
  1433.                                   is returned for a successful remove;
  1434.                                   -1 is returned if the file could not
  1435.                                   be removed or does not exist.  
  1436.                                   
  1437.           Ldup fd                 This function executes the "dup" 
  1438.                                   system call.  It returns an integer 
  1439.                                   number which may be used as a file 
  1440.                                   descriptor on later I/O calls.  The 
  1441.                                   new file descriptor is a duplicate 
  1442.                                   of the argument "fd".  If the argu-
  1443.                                   ment file descriptor could not be 
  1444.                                   duplicated, -1 is returned.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.  
  1450.  
  1451.                                      - 24 -                           
  1452.  
  1453.  
  1454.           fd Lap 'string'         This quad function is used to append
  1455.                                   a character string onto the end of a
  1456.                                   UNIX file.  The first argument 
  1457.                                   specifies the file descriptor of the
  1458.                                   file (which should have been opened 
  1459.                                   earlier).  The second argument is a 
  1460.                                   character array which is to be 
  1461.                                   appended.  A carriage return is 
  1462.                                   automatically appended to the end of
  1463.                                   each row of the character array when
  1464.                                   it is appended to the end of the 
  1465.                                   file.  
  1466.                                   
  1467.           Lrline fd               This quad function is identical to 
  1468.                                   "Lrd", described above.  
  1469.                                   
  1470.           Lnc 'arg'               This function can be used to deter-
  1471.                                   mine what type of variable an APL 
  1472.                                   symbol is.  The apl symbol must be 
  1473.                                   specified inside quote marks, as 
  1474.                                   shown.  The returned value will be: 
  1475.                                   0 -- symbol is undefined 
  1476.                                   2 -- symbol is a label or variable 
  1477.                                   3 -- symbol is a function name 
  1478.                                   4 -- unknown type (should not occur)
  1479.                                   
  1480.           Lnl arg                 The argument should be a scalar or 
  1481.                                   vector with components 1, 2, or 3.  
  1482.                                   This function returns a two-dimen-
  1483.                                   sional character array containing 
  1484.                                   the names of all items whose types 
  1485.                                   are specified in the vector (same 
  1486.                                   type definitions as for "Lnc" 
  1487.                                   above).  The ordering of names in 
  1488.                                   the matrix is fortuitous.  
  1489.                                   
  1490.           signal Lsig action      This quad function allows signal 
  1491.                                   processing to be turned on and off 
  1492.                                   under APL function control.  The 
  1493.                                   first argument is the signal whose 
  1494.                                   processing is to be changed.  The 
  1495.                                   second argument specifies how the 
  1496.                                   signal will be processed -- if zero,
  1497.                                   the signal will cause termination of
  1498.                                   APL and a possible core dump; if 
  1499.                                   non-zero, the signal will be 
  1500.                                   ignored.  Note that the special way 
  1501.                                   in which interrupts and other 
  1502.                                   signals are processed by APL is 
  1503.                                   turned off by a call to "Lsig" and 
  1504.                                   cannot be turned back on.  A -1 is 
  1505.                                   returned on error, a positive number
  1506.                                   or zero for success.  
  1507.                                   
  1508.           Lfloat charvect         This quad function is useful in con-
  1509.                                   junction with "Lwrite" and "Lread".
  1510.  
  1511.  
  1512.  
  1513.  
  1514.                                      - 25 -                           
  1515.  
  1516.  
  1517.                                   While any type of data may be writ-
  1518.                                   ten to a UNIX file with "Lwrite", 
  1519.                                   when it is read with "Lread" it will
  1520.                                   be interpreted as character data.  
  1521.                                   This function will convert a 
  1522.                                   character array into numeric form.  
  1523.                                   The array must be a multiple of 4 
  1524.                                   elements long for apl2 and 8 for 
  1525.                                   apl.  The converted array is the 
  1526.                                   returned value.  
  1527.  
  1528.  
  1529.  
  1530.  
  1531.  
  1532.  
  1533.  
  1534.  
  1535.  
  1536.  
  1537.  
  1538.  
  1539.  
  1540.  
  1541.  
  1542.  
  1543.  
  1544.  
  1545.  
  1546.  
  1547.  
  1548.  
  1549.  
  1550.  
  1551.  
  1552.  
  1553.  
  1554.  
  1555.  
  1556.  
  1557.  
  1558.  
  1559.  
  1560.  
  1561.  
  1562.  
  1563.  
  1564.  
  1565.  
  1566.  
  1567.  
  1568.  
  1569.  
  1570.  
  1571.  
  1572.  
  1573.  
  1574.  
  1575.  
  1576.  
  1577.                                      - 26 -                           
  1578.  
  1579.  
  1580.           AAAppppppeeennndddiiixxx DDD
  1581.           III-BBBeeeaaammmsss
  1582.           
  1583.           The following monadic i-beam functions are available: 
  1584.                
  1585.           20   This i-beam returns the time-of-day as the total number
  1586.                of 1/60 seconds which have elapsed since midnight.  
  1587.                Division by 60 gives the number of seconds since mid-
  1588.                night, etc.  
  1589.                
  1590.           21   This i-beam returns the total amount of CPU time used 
  1591.                by the current APL session in 1/60 seconds.  This 
  1592.                includes the amount of time spent by the system perfor-
  1593.                ming I/O (sys time) and computational time ("user" 
  1594.                time).  
  1595.                
  1596.           22   This i-beam returns the number of 8-bit bytes which are
  1597.                left in the workspace.  However, this value is not 
  1598.                really meaningful since the in-core workspace will be 
  1599.                expanded, if possible, when full.  
  1600.                
  1601.           24   This i-beam returns the time-of-day (in 1/60 seconds) 
  1602.                when the current APL session was begun.  
  1603.                
  1604.           25   This i-beam returns the current date as a 6-digit 
  1605.                number of the form fImmddyyfR.  Thus, February 23, 1978
  1606.                would be 022378.  
  1607.                
  1608.           26   This i-beam returns the line number in the function 
  1609.                currently being executed.  Thus, if it is used in line 
  1610.                3 of a function, it will return 3.  
  1611.                
  1612.           27   This i-beam returns a vector of the line numbers in 
  1613.                pending functions (functions which called the current 
  1614.                function and are  waiting for its completion).  
  1615.                
  1616.           28   This i-beam returns the date (as a 6-digit number, 
  1617.                fImmddyyfR) when the current APL session began.  
  1618.                
  1619.           29   This i-beam returns the current origin, set by the 
  1620.                ")origin" system command.  
  1621.                
  1622.           30   This i-beam returns the current width, as set by the 
  1623.                ")width" system command.  
  1624.                
  1625.           31   This i-beam returns the current number of digits to be 
  1626.                displayed, as set by the ")digits" system command.  
  1627.                
  1628.           32   This i-beam returns the number of workspace bytes which
  1629.                are being used.  It is the complement of i-beam 22, 
  1630.                which tells how many bytes are unused.  Thus, the 
  1631.                maximum workspace size (in bytes) can be calculated by 
  1632.                adding i-beams 22 and 32.  
  1633.                
  1634.           36   This i-beam returns the second element of the vector 
  1635.                returned by i-beam 27 -- that is, it returns the line 
  1636.  
  1637.  
  1638.  
  1639.  
  1640.                                      - 27 -                           
  1641.  
  1642.  
  1643.                number of the function which called the current func-
  1644.                tion.  
  1645.                
  1646.           40   This i-beam returns the total amount of CPU time spent 
  1647.                by any child processes of APL.  Children of APL include
  1648.                the editor, the shell if ")shell" is used, anything run
  1649.                by "Lrun", and any processes executed using "Lfork".  
  1650.                
  1651.           41   This i-beam returns the total amount of "user" time 
  1652.                spent by APL and all of its children.  
  1653.                
  1654.           42   This i-beam returns the total "system" time spent by 
  1655.                APL and all of its children.  
  1656.                
  1657.           43   This i-beam returns the total amount of "user" time 
  1658.                (computational time) spent by APL.  
  1659.                
  1660.           44   This i-beam returns the total amount of "sys" (I/O and 
  1661.                other system calls) time spent by APL.  
  1662.                
  1663.           96   This i-beam causes APL to dump its stack on the ter-
  1664.                minal.  It is intended for system development of APL, 
  1665.                and is probably useful only in generating a big messy-
  1666.                looking display.  
  1667.                
  1668.           97   This i-beam returns the total number of elements on 
  1669.                APL's internal stack.  It is intended for system 
  1670.                development and debugging of APL itself.  
  1671.                
  1672.           98   This i-beam function turns off the trace of all memory 
  1673.                allocations and deallocations which i-beam 99 turns on.
  1674.                It returns a 1 if the trace was on, and a 0 if it was 
  1675.                off already.  
  1676.                
  1677.           99   This i-beam turns on the alloc/free trace mentioned 
  1678.                above, which i-beam 98 turns off.  It also returns a 1 
  1679.                if the trace was already on, or a 0 if it was off.  
  1680.           
  1681.           
  1682.           The following dyadic i-beam functions were implemented to 
  1683.           compensate for the lack of sufficient quad variables.  They 
  1684.           may be subject to future change.  The function is specified 
  1685.           by the right argument, the left argument is a parameter to 
  1686.           that function.  The available i-beams are: 
  1687.                
  1688.           29   This i-beam may be used to set the origin to any per-
  1689.                mitted value.  The left argument specifies the new 
  1690.                origin, and the previous origin is returned.  
  1691.                
  1692.           30   This i-beam may be used to set the terminal width to 
  1693.                any permitted value.  The left argument specifies the 
  1694.                new width, and the previous width is returned.  
  1695.                
  1696.           31   This i-beam may be used to set the number of digits 
  1697.                displayed to any permitted value.  The left argument 
  1698.                specifies the new number of digits, and the previous 
  1699.  
  1700.  
  1701.  
  1702.  
  1703.                                      - 28 -                           
  1704.  
  1705.  
  1706.                value is returned.  
  1707.                
  1708.           34   This i-beam implements the system "nice" function.  The
  1709.                "nice" of the APL process will be set to the value 
  1710.                specified by the left argument.  A zero will be 
  1711.                returned for success, a -1 is returned for failure.  
  1712.                This is intended for background processing, not 
  1713.                interactive use of APL.  
  1714.                
  1715.           35   This i-beam implements the system "sleep" function.  
  1716.                APL will suspend itself for the number of seconds 
  1717.                specified (by the left argument).  The value returned 
  1718.                is the value of the left argument.  
  1719.                
  1720.           63   This i-beam implements the system "empty" function.  
  1721.                The left argument specifies a file descriptor of a 
  1722.                pipe.  If the pipe is empty, a 1 will be returned, if 
  1723.                not-empty, a 0 will be returned.  A -1 will be returned
  1724.                if the file descriptor is illegal or is not a pipe.  
  1725.                
  1726.           90   Normally, APL will not exit if it reads an end-of-file 
  1727.                from a terminal.  This safety feature may be disabled 
  1728.                by using i-beam 90 with a zero left argument.  A non-
  1729.                zero right argument restores the requirement that the 
  1730.                user exit with ")off" or ")continue".  [Note: this fea-
  1731.                ture cannot be enabled if the input device is not a 
  1732.                terminal.] 
  1733.                
  1734.           99   This i-beam causes the buffered version of APL to flush
  1735.                the buffer associated with the file descriptor speci-
  1736.                fied as the left argument.  A 0 is returned for suc-
  1737.                cess, -1 for failure.  In unbuffered APL, 0 is always 
  1738.                returned and no action is taken (since the command is 
  1739.                meaningless).  Note that flushing a pipe used for input
  1740.                may cause information to be lost.  
  1741.  
  1742.  
  1743.  
  1744.  
  1745.  
  1746.  
  1747.  
  1748.  
  1749.  
  1750.  
  1751.  
  1752.  
  1753.  
  1754.  
  1755.  
  1756.  
  1757.  
  1758.  
  1759.  
  1760.  
  1761.  
  1762.  
  1763.  
  1764.  
  1765.