home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / proglang / isetl.arj / SUPPLEME.LPR < prev    next >
Text File  |  1989-10-03  |  26KB  |  768 lines

  1.  
  2.  
  3.  
  4.  
  5.                   A Gentle Guide to Using ISETL
  6.                     A supplement to the Intro
  7.                            Version 2.0
  8.  
  9.                          Gary Marc Levin
  10.             Dept of CS and Math \ Clarkson University
  11.                         Potsdam, NY 13676
  12.                          (315) 268--2384
  13.     Bitnet:  gary@clutx \ Internet:  gary@clutx.clarkson.edu
  14.                          October 3, 1989
  15.  
  16.  
  17. 1 Why read this report?
  18.  
  19. This is a supplement to An Introduction to ISETL, the
  20. documentation that is sent with all ISETL disks and tapes.  That
  21. document, now referred to as simply the Intro, is a complete
  22. language description.  As such it tends to be extremely dense.
  23. It is also merely concerned with ISETL the language, ignoring
  24. questions about how ISETL works on your computer and how one
  25. makes use of ISETL.
  26. The first topic --- how ISETL works on your computer --- is
  27. addressed in section 2.  The second topic --- how to make use of
  28. ISETL --- is addressed in section 3.  A third topic ---
  29. Miscellania about the language --- is addressed in section 4 and
  30. covers material that appears in the Intro, but with examples and
  31. a little more description.
  32. This report was originally written in response to questions
  33. forwarded to me by Ladnor Geissinger of the University of North
  34. Carolina.  As more questions reach me, I will add those of
  35. general interest to the list.  Sending them electronically is
  36. probably fastest, but I'll take any feedback that I can get.
  37.  
  38. 2 Running ISETL on your computer
  39.  
  40. It is difficult to cover all the possibilities here, because
  41. ISETL has been written so that it will run on many machines.
  42. This means that I have no way of knowing things like memory size,
  43. number of disks, or available software.  I will try to cover
  44. general possibilities, and leave it to you to check with local
  45. machine experts --- usually called gurus --- for more details.       <==
  46. I'll put a mark in the margin like the one near the word guru to
  47. point out these system dependent points.  Instructors may wish to
  48. check these points before the semester begins.
  49.  
  50. 2.1 Creating files
  51.  
  52. If you want to do more than use ISETL as a calculator, you will
  53. eventually want to create files that ISETL can read.  These files
  54. may be used as input to programs you have written, or they may be
  55. programs to be !included.
  56.  
  57.  
  58.  
  59.                                 1
  60.  
  61.  
  62. The files should be simple text files, also called ascii files or
  63. unformatted files.  Lines may end with CR, LF, or CR-LF, although
  64. the last case may result in blank lines on some systems.
  65. The problem arises of how to create such a file.
  66.  
  67.    ? Preferably, don't use a word processor.
  68.      Word processors put lots of extra information into files, so
  69.      that the file can be printed in an attractive format.
  70.      Unfortunately, each word processor has its own way of hiding
  71.      that extra information, and there is no way that ISETL can
  72.      ignore it.  More unfortunately, I have no way of knowing
  73.      what needs to be done to just save the text.  This is a job
  74.      for your local guru.                                            <==
  75.  
  76.      For instance, on the Mac, MacWrite has an option when you
  77.      are saving to save text only.  If you save text only, it
  78.      tries to protect you by asking you if you want to save the
  79.      file when you exit.  If you say yes, it saves a formatted
  80.      file.  Arrgh!
  81.    ? On Unix and VMS, just use the standard editors --- vi,
  82.      emacs, edt.
  83.  
  84.    ? On the Mac and MS-DOS, use an editor if you have one.
  85.      Both the Mac and MSDOS now contain built-in editors.  These
  86.      can be used to create files.  See the section on Editors in
  87.      the Intro.
  88.  
  89. See 3.3 for hints as to how to use an editor while you are using
  90. ISETL.
  91.  
  92. 2.2 Size of files
  93.  
  94. There is no important limit to the length of a file, but if you
  95. want to see your input as you !include a file, you should take
  96. note of the width of your screen.  Each line is indented one tab.
  97. This means that if you have 80 columns, you should limit lines to
  98. 72 columns.  The Macintosh has a smaller screen.
  99. See 3.1 for an explanation of how to watch as input is read from
  100. files.
  101.  
  102. 2.3 Standard input and output
  103. Standard input and output (stdin and stdout, respectively) are
  104. concepts that come from Unix.  stdin is usually the keyboard, and
  105. stdout is usually the screen.  If this were all there was to it,
  106. I would just say keyboard and screen and be done with it, but
  107. there is more.  This extra ability is useful when you want to
  108. collect a terminal session, say to turn in as homework.  (See 3.1
  109. for information about how to do this in detail.)
  110. On Unix and MS-DOS, you can re-direct stdin and/or stdout for any
  111. program.  What follows does not apply to VMS or the Mac.  See
  112. your guru for suggestions as to how you can get the same effect.     <==
  113. On the command line where you type isetl, you can also type
  114. ``< afile''.  This means that instead of reading from the
  115. keyboard, stdin is read from afile.  Any filename may be used in
  116.  
  117.  
  118.                                 2
  119.  
  120.  
  121. place of afile.  Similarly, you can type ``> bfile'' and stdout
  122. will go to bfile instead of the screen.  There will be no visible
  123. output to the screen in this case.
  124. The characters ``<'' and ``>'' may be thought of as ``out of''
  125. and ``in to'', respectively.
  126.  
  127.  
  128. 2.4 Command line arguments --- VMS
  129. Command line arguments and flags may be passed in all versions of
  130. ISETL, except the Mac.  In the case of VMS, you need to do a
  131. little work first.
  132. Define isetl :== $your$disk:[your.dir]isetl.exe in your login.com
  133. and you will be able to use command line arguments.  The leading
  134. $ makes this a foreign command (a VMS term, I am told).  The rest
  135. is the complete path to the executable version of ISETL.
  136.  
  137. 3 Using ISETL
  138.  
  139. 3.1 How to generate a terminal session
  140.  
  141. The directive ``!record xyz'' begins appending everything that
  142. you type to the file xyz.  This is a good idea when you are
  143. developing new work, or if you want to be able to show your work
  144. to someone.  It includes everything that you typed, except for
  145. commands to edit past lines (see 3.6.2).
  146. When you are finished in ISETL, you can edit xyz using your
  147. favorite editor (see 2.1), deleting errors and dead-ends.  In
  148. particular, remove the errors that precede !edit and the line
  149. with !edit.  This will give you a clean script of what you did.
  150. To create a terminal session where your input and ISETL's
  151. response are interleaved, as you would see at the terminal, use
  152. file redirection to read from xyz and save it.  You need to
  153. insert !echo on at the beginning of your file to tell ISETL that
  154. it should print your input.
  155. Example:
  156. xyz: !echo on
  157.      x:= 3;
  158.      y:= 4;
  159.      x+y;
  160.      x*y;
  161.  
  162. Command: isetl -s -d <xyz >abc
  163.  
  164. abc: > x:= 3;
  165.      > y:= 4;
  166.      > x+y;
  167.      7;
  168.  
  169.      > x*y;
  170.      12;
  171. The ``-s'' on the command line suppresses the header information
  172. that tells you about ISETL.  The ``-d'' tells ISETL that it is
  173. receiving direct input and should not use the interactive line
  174. editor.
  175.  
  176.  
  177.                                 3
  178.  
  179.  
  180. 3.2 Indenting rules and multiple ends
  181.  
  182. The presentation of programs is a matter that often seems to stir
  183. emotions usually reserved for religious questions.  The most
  184. important point to consider is readability.  If you find that you
  185. are often confusing where statements begin and end, you are
  186. probably are using an inappropriate style.
  187. I recommend that you match the beginnings and endings of
  188. statements, and that you use the optional keywords after end when
  189. the program gets long.  See figure 1.
  190.  
  191. program nothing;
  192.     i:= 0;
  193.     while i < 10 do
  194.         if i mod 3 = 5
  195.         then print i;
  196.         else
  197.             print 2*i;
  198.             print 3*i;
  199.         end if;
  200.         i:= i+1;
  201.     end while;
  202. end program;
  203.  
  204.  
  205.                    Figure 1:  A simple example
  206.  
  207.  
  208. 3.3 Doing two things at once -- ISETL and Editing
  209.  
  210. Time for the guru again.  This is very system dependent, even to     <==
  211. the point of how much memory is available.
  212. On Unix, there is usually a key to type that temporarily stops
  213. one program, and lets you start a second (ctrl-Z is the usual
  214. choice).  ^ Z also works within ISETL on MSDOS.
  215. On VMS, the best chance is !system.  This is also available under
  216. Unix and MSDOS. The !system directive can be used to execute a
  217. command without leaving ISETL.  ``!system dir'' lists your
  218. directories.  Generally, ``!system xyz'' is the same as executing
  219. xyz at the system prompt, except that ISETL does not lose its
  220. variables in the meanwhile.  See the Intro for details on how to
  221. save memory in small systems to provide enough room to use
  222. !system.
  223.  
  224. 3.4 Printing output
  225. The simplest solution is to write to a file and then print the
  226. file from outside of ISETL.  Other possibilities exist.  See 3.1
  227. and 2.3.
  228.  
  229.  
  230. 3.5 Formatting output
  231. This is covered in 4--(Q7).
  232.  
  233.  
  234.  
  235.  
  236.                                 4
  237.  
  238.  
  239. 3.6 ISETL for beginners
  240.  
  241. I will consider beginners to be those who are generally writing
  242. one-liners, simple expressions for evaluation.
  243.  
  244. 3.6.1 !record
  245.  
  246. When you begin, it is probably best to have !record history in
  247. your isetl.ini file.  This will keep a copy of what you type in
  248. the file history.  This is useful for showing to others when
  249. something doesn't work.  There is little more frustrating than to
  250. say, ``This is what I did, and it didn't work.''  only to have
  251. the other person try the same thing and have it succeed.  If you
  252. !record everything, you can find out exactly what you did do
  253. (probably not as you remembered it).
  254.  
  255. 3.6.2 !edit
  256. Most systems no longer have or need !edit, it having been
  257. replaced by the interactive line editor.  If your system does not
  258. have ILE, read on (the header announces the presence of ILE). If
  259. you prefer !edit, you can use it by including the -e switch.
  260. When you are typing one-liners, and even three- and four-liners,
  261. you will often get a character wrong and not feel like typing the
  262. whole thing again.  Until the next > prompt appears, you have a
  263. chance to correct your input with !edit.  You will be offered the
  264. input as it is and given the choice of accepting it or modifying
  265. it.
  266.  
  267.    ? To accept it, just type RETURN, entering a blank line as
  268.      requested.  (The message is !Enter string to replace (blank
  269.      line to execute), which we have shortened in the example.)
  270.  
  271.    ? To modify it takes two steps.
  272.      (1) Enter a string to be replaced.
  273.  
  274.      (2) Enter the string to be used as the replacement.
  275. See figure 2.  In the first case, we made an error and corrected
  276. it.  In the second case, we changed our mind and changed the
  277. input to match.  Try typing this to ISETL to see exactly which
  278. parts are your input and which parts are printed by ISETL.
  279.  
  280. 3.6.3 !verbose
  281.  
  282. I'd recommend turning ``!verbose on''.  This will give more
  283. information in the error messages, at the possible cost of
  284. printing large sets or tuples.  As a beginner, you need all the
  285. information ISETL can give you.
  286.  
  287. 3.7 ISETL for intermediates
  288.  
  289. An intermediate is someone who is now writing small programs, too
  290. much to type each time you start again.
  291.  
  292.  
  293.  
  294.  
  295.                                 5
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310. >       1+2+3+;
  311. Syntax error, line 1.
  312. Error at or before end of:
  313. 1+2+3+;
  314.  
  315. Enter '!clear' or '!edit'
  316. >>      !edit
  317. 1+2+3+;
  318. !Enter string to replace (blank line...)
  319. +;
  320. !Enter replacement
  321. +4;
  322. 1+2+3+4;
  323. !Enter string to replace (blank line...)
  324.  
  325. 10;
  326. >       1+2
  327. >>      !edit
  328. 1+2
  329. !Enter string to replace (blank line...)
  330. 1
  331. !Enter replacement
  332. 5
  333. 5+2
  334. !Enter string to replace (blank line...)
  335.  
  336. >>      ;
  337. 7;
  338.  
  339.  
  340.                       Figure 2:  Using !edit
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.                                 6
  355.  
  356.  
  357.  
  358. >       f := func(x);
  359. >>               return x+3;
  360. >>           end func;
  361. >       !watch i f
  362. !'i' watched
  363. !'f' watched
  364. >       i := f(5);
  365. ! Evaluate: f(5);
  366. ! f returns: 8;
  367. ! i := 8;
  368.  
  369.  
  370.                      Figure 3:  Using !watch
  371.  
  372. 3.7.1 !include
  373.  
  374. Put your programs into files using an editor (see 2.1).  You can
  375. then use ``!include file.x'' to insert file.x as if you had typed
  376. it at the keyboard, but without the strain on the fingers.
  377.  
  378. 3.7.2 !verbose
  379.  
  380. I'd recommend turning ``!verbose off''.  Most of the time, you
  381. will have enough of an idea what is wrong just from the operation
  382. that got the error.  You can always turn it back on and repeat
  383. the error if needed.
  384.  
  385. 3.7.3 !watch
  386. With big programs can come big errors.  !watch can provide a
  387. trace of important changes that occur in your program:
  388. assignments and function evaluations.
  389. At the top level (as in figure 3), this is not very helpful, but
  390. inside a larger program, this will let you see each time f is
  391. called, what its arguments were, and what it returned.  You also
  392. see whenever i is assigned a value.
  393.  
  394. 3.7.4 Misspelled identifiers
  395.  
  396. As programs get larger, there are more chances for things to go
  397. wrong.  A common mistake that makes you appreciate Pascal's
  398. pickiness is misspelling an identifier.  Any identifier is legal,
  399. so there are no syntax errors here.  The problem is that if you
  400. misspell the name on the left of an assignment, the variable of
  401. interest is undefined and if you misspell the name in an
  402. expression, the misspelling is undefined.  (Let's not think about
  403. the problems when half the time you spell it one way and half the
  404. time the other.)
  405. The directive !ids lists identifiers that you have used that are
  406. defined.  !oms lists those identifiers that you have used that
  407. are undefined (have the value om).  From these lists, you can
  408. often find a name that you didn't expect and thereby track down
  409. the problem.
  410.  
  411.  
  412.  
  413.                                 7
  414.  
  415.  
  416. 3.7.5 Debugging
  417.  
  418. Debugging is described in detail in the Intro.
  419.  
  420. 3.8 ISETL for experts
  421.  
  422. Experts tend to find their own way of working.  Much of the
  423. decision depends on what tools are available and how comfortable
  424. you are with your computer, separate from ISETL.
  425. I find that I tend to use ISETL more in the style of a compiler,
  426. editing files and having ISETL read them in using the command
  427. line form or !include, only typing short expressions at the
  428. keyboard for testing or evaluating functions.
  429. Being on Unix, I use the Unix means of stopping ISETL, rather
  430. than !system.
  431. It will be interesting to have others report how they make use of
  432. ISETL.
  433. Another option that I am finding useful under Unix is to run
  434. emacs and run ISETL under the emacs shell.  This gives me a full
  435. editor.  If you are an emacs user, just remember to run isetl -d,
  436. so that the ILE is not active also.  The availability of programs
  437. like emacs is the reason I resisted introducing an editor into
  438. ISETL; it really does not belong there.
  439.  
  440. 3.8.1 Garbage collection
  441. If your program seems to run very slowly, getting slower as the
  442. program continues to run, it may be using most of its available
  443. memory.  The directive !gc on will print information about the
  444. available memory and how it is being collected each time ISETL
  445. runs out of space.  If it collects frequently, or the amount of
  446. space reclaimed is small, increase the allocated memory with
  447. !allocate.  If you are at the ISETL memory limit, you can
  448. increase it with !memory, up to the system limits.
  449. On the Mac, under MultiFinder, you may need to adjust the memory
  450. usage information in the Info window.  See a Mac guru.               <==
  451.  
  452.  
  453. 4 Questions about the language
  454. Q1:   Exactly when does one need to put in ``;'' and what is it
  455.      telling ISETL?
  456.  
  457. A1:   This is probably the most commonly asked question about any
  458.      programming language that I know of, with the exceptions of
  459.      Lisp and Fortran which don't use semicolons.
  460.      Fortunately, the answer is easy for ISETL; semicolons go
  461.      after every statement.  The semicolon tells ISETL that you
  462.      are finished with the statement.  At the prompt, where you
  463.      can simply type expressions, the importance of the semicolon
  464.      can be easily seen.  If statements and expressions ended at
  465.      the end of the line, like Fortran, the following would not
  466.      work, instead printing 6 after the first line.
  467.  
  468.  
  469.  
  470.  
  471.  
  472.                                 8
  473.  
  474.  
  475.          >       1+2+3
  476.          >>      +4;
  477.          10;
  478.  
  479.  
  480.      Bowing to popular pressure, I have made the final semicolon
  481.      in a list of statements optional.  This means that Pascal
  482.      programmers will find that their intuition works fine.  All
  483.      previously correct programs still work.
  484.  
  485. Q2:   How is x+y; different from print x+y; ?
  486.  
  487. A2:   This depends on where you write them.
  488.        ? At the prompt, an input that is just an expression
  489.          implies that you want the value printed.  Therefore, at
  490.          the top level, there is no difference.
  491.  
  492.        ? Inside functions or programs, x+y; simply evaluates x+y,
  493.          producing no output.  Only print x+y; would let you see
  494.          the result.
  495.  
  496. Q3:   If I assign an expression to B, does ISETL evaluate the
  497.      expression immediately and just store the calculated value
  498.      in B, or does it wait to evaluate the expression until we
  499.      enter B; ?
  500.  
  501. A3:   ISETL is a value-oriented language and as such you should
  502.      think of expressions as being evaluated when they are used.
  503.      Therefore, the expression assigned to B is evaluated and the
  504.      value stored.
  505. Q4:   What is the difference between program and func?
  506.  
  507. A4:   A program is a collection of statements to be executed.  It
  508.      has no name, takes no arguments, executes once.  Moreover,
  509.      there is no object in ISETL that corresponds to a program
  510.      --- that is, you can't store a program in a variable or as
  511.      an element of a set.
  512.      A func is an ISETL object, and as such can be used in many
  513.      more ways.
  514.  
  515.      The program is somewhat like the human appendix, a feature
  516.      left over from the evolutionary predecessor, SETL.  It does
  517.      serve a purpose until such time as you are ready to deal
  518.      with funcs.  Consider the difference between the following
  519.      two sequences of input.
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.                                 9
  532.  
  533.  
  534.          >       program example;
  535.          >>          read x;
  536.          >>          read y;
  537.          >>          print [x,y];
  538.          >>      end program;
  539.          ?       5; 6;
  540.          [5, 6];
  541.  
  542.          >
  543.          >       read x; 5;
  544.          >       read y; 6;
  545.          >       print [x,y];
  546.          [5, 6];
  547.  
  548.      With a program, the input follows the program.  With
  549.      separate statements, the input must follow the read.
  550.  
  551. Q5:   What is pretty-printing?
  552.  
  553. A5:   When you print using print, the output is generally in the
  554.      form of constant expressions, terminated by semicolons.
  555.      (Generally, because some objects don't have a constant form:
  556.      atoms, files, funcs.)
  557.      The large structured objects, like sets and tuples, are
  558.      printed so that the indentation and line breaks respect the
  559.      structure of the object.  Consider:
  560.  
  561.          >       [ [i,i**2]: i in [100..104] ];
  562.          [[100, 10000], [101, 10201],
  563.           [102, 10404], [103, 10609],
  564.           [104, 10816]];
  565.      Breaking the line in the middle of a pair would make it
  566.      harder to read, so we try to format automatically.  In
  567.      contrast, see (Q7).  The function max_line(x) sets the
  568.      maximum number of columns of output in prettyprinting to x.
  569.      Here I have set it to 40, to keep lines short.
  570.  
  571. Q6:   What is the ``backslash convention''?
  572.  
  573. A6:   Not all characters in the ascii character set have a
  574.      printed image, and some are awkward to type.  When you type
  575.      a character string, you can use the backslash convention to
  576.      enter these special characters.  When prettyprinting (Q5),
  577.      strings are printed in the same fashion.  See (Q7) for uses
  578.      of these special characters.
  579.      Here is a table describing these special characters:
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.                                 10
  591.  
  592.  
  593.              \b      backspace
  594.              \f      formfeed (new page)
  595.              \n      newline (prints as CR-LF)
  596.              \q      double quote
  597.              \r      carriage return (CR)
  598.              \t      tab
  599.              \octal  character represented by octal
  600.                       Refer to an ASCII chart for meaning.
  601.              \other  other --- may be any character
  602.                       not listed above.
  603.  
  604.      In particular, "\\" is a single backslash.  You may type,
  605.      "\"" for double quote, but the pretty printer will print as
  606.      "\q".  ASCII values are limited to '\001' to '\377'.
  607.  
  608.      >       %+ [char(i): i in [1..127]];
  609.      "\001\002\003\004\005\006\007\b\t\n\013\f"
  610.      +"\r\016\017\020\021\022\023\024\025\026"
  611.      +"\027\030\031\032\033\034\035\036\037 !"
  612.      +"\q#$%&'()*+,-./0123456789:;<=>?@ABCDEF"
  613.      +"GHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijk"
  614.      +"lmnopqrstuvwxyz{|}~\177";
  615.  
  616.  
  617. Q7:   How do you keep from printing ``;''?  How do you put
  618.      several things on a line with appropriate spacing?
  619.  
  620. A7:   Two questions with a common answer.  First, why the
  621.      semicolon in the output, then how to get rid of it and
  622.      produce pretty results.
  623.      The semicolon is included in the output so that ISETL output
  624.      may be used as ISETL input.  Where it makes sense, the
  625.      output of print is a constant followed by a semicolon,
  626.      suitable for read.
  627.      You can get output that is more like that of other languages
  628.      by using write.  Use write in place of print (or print...
  629.      to..).  It prints:
  630.  
  631.        ? numbers without the semicolon
  632.        ? strings without the quotes, semicolon, and the backslash
  633.          convention (see (Q6)).
  634.  
  635.        ? the elements of tuples and sets, but without any
  636.          punctuation --- no semicolons, no braces or brackets, no
  637.          commas.
  638.      As in Pascal, writeln is like write with a newline written
  639.      at the end.
  640.  
  641.      Example:
  642.  
  643.      >       print 12, "ab\ncd",
  644.      >>                 [1,2];
  645.      12;
  646.      "ab\ncd";
  647.      [1, 2];
  648.  
  649.                                 11
  650.  
  651.  
  652.  
  653.      >       write 12, "ab\ncd"; write [1,2];
  654.              12ab
  655.      cd         1         2
  656.      >
  657.  
  658.      Notice that "\ n" produced a newline and that the second
  659.      write began on the same line as the first ended.  Once you
  660.      go to write it is your responsibility to handle lines.  One
  661.      solution is defining ``newline:= "\ n";'' in your isetl.ini
  662.      file, and then you can print newline as needed.  The other
  663.      solution is to use writeln.
  664.  
  665.      Each of the types has a default number of columns that it
  666.      uses for output.  You can override the default by putting
  667.      ``:d'' where d is an integer expression that is the minimum
  668.      number of columns to be used.
  669.                        -------------------------
  670.                         Float               20
  671.                         Integer             10
  672.                         String               0
  673.                         Anything else       10
  674.  
  675.          >       newline := "\n";
  676.          >       write 1,2,3,newline;
  677.  
  678.          ?????????1?????????2?????????3
  679.          >       writeln 1:3, 2:3, 3:3;
  680.  
  681.          ??1??2??3
  682.  
  683.      There are more possibilities for the format, to handle
  684.      floating point numbers and structured data.  See the Intro
  685.      for the complete story.
  686. Q8:   How can I read inputs without needing the semicolon?
  687.  
  688. A8:   Just as there is printf1, we provide readf.  You can check
  689.      the Intro for the additional possibilities, but the two
  690.      important ones are:
  691.  
  692.        ? readf x; --- This reads the next sequence of non-white
  693.          characters (skipping blanks, newlines, tabs, etc.).  If
  694.          the sequence can be interpreted as a number, that is
  695.          what is read.  If it cannot be interpreted as a number,
  696.          it is treated as a string.
  697.        ? readf x:-1; --- This reads one character and assigns x
  698.          that one character string.
  699.  
  700.      Examples:
  701.          >       readf x,y,z,a:-1,b:-1,c:-1;
  702.          123 xyz 123; 12
  703.          >       print [x,y,z,a,b,c];
  704.          [123, "xyz", "123;", " ", "1", "2"];
  705. ---------------------------
  706.  1printf is a synonym for write.
  707.  
  708.                                 12
  709.  
  710.  
  711.      Notice:
  712.  
  713.        ? There is no prompt for readf.  You should print your
  714.          own.
  715.        ? 123; was read as a string.
  716.  
  717.        ? a was assigned " ", the character immediately following
  718.          ``123;''.
  719.  
  720. Q9:   How can I write a program which, when I choose a specific
  721.      integer n, would make an assignment such as Zn:=0..n-1, that
  722.      is, part of the identifier name depends on my choice of n?
  723.      For example, when I enter MAKEZN(137); it assigns to Z137
  724.      the correct set and also constructs the addition and
  725.      multiplication mod 137 with appropriately chosen identifiers
  726.      (a and m?).
  727. A9:   You can't do this.  You can of course have Z(137):=
  728.      0..137-1; and similarly for a(137) and m(137).  Identifiers
  729.      aren't ISETL objects, so you can't perform operations on
  730.      them.
  731.  
  732.      I'd recommend that makeZn return a 3-tuple and you assign
  733.      the results as you wish.  It is not a good idea to assign to
  734.      global variables, although it is legal.
  735.  
  736.          [Z(137),a(137),m(137)] := makeZn(137);
  737.  
  738. Q10:   What is the purpose of having tuples start at origins
  739.      other than 1?
  740. A10:   A good example is polynomials, where
  741.  
  742.                                    Xk
  743.                              p(x)=    aixi
  744.                                    i=0
  745.      Here, the tuple a naturally begins at 0, so that the indices
  746.      and exponents correspond.
  747.  
  748.      You can now define
  749.      p := 0@[1,2,4];
  750.      $ Represents 1 + 2*x + 4*x*x
  751.      eval := :  x,p ?>  %+[ai*x**i :  ai=p(i)] :;
  752.  
  753.      The definition of eval isn't quite right, because eval(p,0)
  754.      will compute 0**0.  The correct form is left as an exercise
  755.      to the reader.  Also left to the reader is the question why
  756.      one sees the summation in some texts and not others.
  757.  
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.                                 13
  768.