home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk1.iso / altsrc / articles / 10648 < prev    next >
Text File  |  1994-06-19  |  62KB  |  1,652 lines

  1. Path: wupost!cs.utexas.edu!howland.reston.ans.net!xlink.net!fauern!news.th-darmstadt.de!news.uni-mainz.de!ag
  2. From: ag@MuwiInfa.Geschichte.Uni-Mainz.DE (Albert Graef)
  3. Newsgroups: alt.sources
  4. Subject: Q - applicative programming language V1.7 - part 12/19
  5. Followup-To: alt.sources.d
  6. Date: 14 Jun 1994 08:51:33 GMT
  7. Organization: Musikinformatik, JoGu-Uni Mainz
  8. Lines: 1639
  9. Distribution: world
  10. Message-ID: <2tjr2l$398@bambi.zdv.uni-mainz.de>
  11. NNTP-Posting-Host: muwiinfa.geschichte.uni-mainz.de
  12.  
  13. Archive-name: q-1.7/part12
  14. Submitted-by: ag@muwiinfa.geschichte.uni-mainz.de
  15.  
  16. #!/bin/sh
  17. # this is q-1.7.shar.12 (part 12 of a multipart archive)
  18. # do not concatenate these parts, unpack them in order with /bin/sh
  19. # file q-1.7/qdoc.info continued
  20. #
  21. if test ! -r _shar_seq_.tmp; then
  22.     echo 'Please unpack part 1 first!'
  23.     exit 1
  24. fi
  25. (read Scheck
  26.  if test "$Scheck" != 12; then
  27.     echo Please unpack part "$Scheck" next!
  28.     exit 1
  29.  else
  30.     exit 0
  31.  fi
  32. ) < _shar_seq_.tmp || exit 1
  33. if test ! -f _shar_wnt_.tmp; then
  34.     echo 'x - still skipping q-1.7/qdoc.info'
  35. else
  36. echo 'x - continuing file q-1.7/qdoc.info'
  37. sed 's/^X//' << 'SHAR_EOF' >> 'q-1.7/qdoc.info' &&
  38. X
  39. X   All kinds of exceptions listed above are "hard" error conditions in
  40. Xthe sense that they cannot be repaired by application programs.
  41. X
  42. X   In contrast, error handling in the built-in operations is implemented
  43. Xaccording to the general rule that an expression which cannot be
  44. Xevaluated is in normal form and hence stands for itself. This means
  45. Xthat "error conditions" such as argument mismatch, division by zero
  46. X(which is actually a form of argument mismatch) or attempt to open a
  47. Xnonexisting file with the built-in `fopen' function do *not* cause
  48. Xruntime errors, but are handled by returning the offending expression
  49. X"as is."
  50. X
  51. X
  52. XFile: qdoc.info,  Node: Scripts,  Next: Types,  Prev: Equations and Expression Evaluation,  Up: Top
  53. X
  54. XScripts
  55. X*******
  56. X
  57. X   In order to make a given set of definitions available for use in the
  58. Xinterpreter, you just collect the relevant declarations, variable
  59. Xdefinitions and equations in a source file, called a "script". The
  60. Xscript can then be submitted to the compiler for translation into an
  61. Xobject file which is loaded by the interpreter (see *Note Using Q::). A
  62. Xscript may also be empty, in which case it does not provide any
  63. Xadditional definitions at all.
  64. X
  65. X   If you put all definitions into a single script, that's all there is
  66. Xto it. However, you might wish to break down a larger script into
  67. Xseveral different source files which can be managed separately. For
  68. Xthis purpose, the Q language allows you to include other source files
  69. Xin a script, by means of an "include directive":
  70. X
  71. X     include                 : 'include' string ';'
  72. X
  73. X   The include directive instructs the compiler to include the given
  74. Xsource file (specified by the filename enclosed in double quotes) at
  75. Xthe given point. Escape sequences in the filename are treated as usual
  76. X(see *Note Lexical Matters::). Although `include''s are usually placed
  77. Xat the beginning of a script, they are permitted at any place where an
  78. Xequation may begin.
  79. X
  80. X   Each source file included in a script can have its own set of
  81. X"private" function and variable symbols, see *Note Declarations and
  82. XVariable Definitions::. This makes it possible to prevent name clashes
  83. Xand to hide implementation details.
  84. X
  85. X   The syntax of a script can now be stated as follows:
  86. X
  87. X     script                  : {include|declaration|definition|equation}
  88. X
  89. X   That is, a script is simply a (possibly empty) sequence of include
  90. Xdirectives, declarations, variable definitions and equations, which may
  91. Xappear in any order.
  92. X
  93. X   In the following, we describe the use of include directives and
  94. Xprivate declarations in more detail.
  95. X
  96. X* Menu:
  97. X
  98. X* Include Scripts::
  99. X* Private Symbols::
  100. X
  101. X
  102. XFile: qdoc.info,  Node: Include Scripts,  Next: Private Symbols,  Prev: Scripts,  Up: Scripts
  103. X
  104. XInclude Scripts
  105. X===============
  106. X
  107. X   The Q programming system currently does not support separate
  108. Xcompilation of scripts, in the way you can compile modules written in
  109. Xthe C programming language and link the corresponding object files
  110. Xlater. However, it is possible to process multiple source files in one
  111. Xcompilation, and you can make the dependencies between scripts explicit
  112. Xby means of the `include' directive.
  113. X
  114. X   The include directive causes inclusion of the specified file, whose
  115. Xname is enclosed in double quotes. For instance, if you have a script
  116. Xnamed `myfuns.q' and wish to include the definitions contained in that
  117. Xscript in another script, you can write:
  118. X
  119. X     include "myfuns.q";
  120. X
  121. X   Include directives may be nested; for instance, the `myfuns.q' script
  122. Xcould contain `include''s as well. The compiler keeps track of all
  123. Xincluded files, such that each file is only included *once*, at the
  124. Xtime the first `include' for a given source file is encountered. This
  125. Xmakes it possible to have a directed acyclic graph of module
  126. Xdependencies rather than a simple tree. (The compiler identifies source
  127. Xfiles by their *name*, stripping off path information and the suffix.
  128. XTherefore the names of all scripts included in a program must be
  129. Xunique, even if they are located in different directories.)
  130. X
  131. X   Unless explicit paths are specified, include files are usually
  132. Xsearched for in the current directory and system-dependent locations
  133. Xwhere "library scripts" are kept. This is also the place where the
  134. Xstandard library scripts distributed with the Q programming system are
  135. Xlocated. The directories to be searched can be specified by means of
  136. Xthe `QPATH' environment variable, see *Note Using Q::.
  137. X
  138. X   Although all definitions of included files are available for use
  139. X*anywhere* in a program, it is strongly recommended that you explicitly
  140. Xstate at the beginning of each script which other modules are used by
  141. Xthat script. The compiler then makes sure that all scripts are linked
  142. Xtogether properly. For instance, suppose your program consists of three
  143. Xmodules named `main.q', `lib.q' and `misc.q' with both `main.q' and
  144. X`misc.q' depending on the definitions in `lib.q'. Then you should
  145. Xinclude the `lib.q' script in *both* `main.q' and `misc.q'.
  146. X
  147. X   A word of caution: Since you will usually not be able to predict the
  148. Xorder in which different scripts are linked together in one program, it
  149. Xis bad style to have overlapping equations for a given expression
  150. Xpattern being scattered out over different source files. The Q compiler
  151. Xissues a warning message in such cases. Also, cyclic inclusion chains,
  152. Xwhile being allowed, warrant a corresponding message from the compiler.
  153. X(You can turn these messages off by invoking the compiler with the `-w'
  154. Xoption, cf.  *Note Running Compiler and Interpreter::.)
  155. X
  156. X
  157. XFile: qdoc.info,  Node: Private Symbols,  Prev: Include Scripts,  Up: Scripts
  158. X
  159. XPrivate Symbols
  160. X===============
  161. X
  162. X   As already noted, each script included in a program can have its own
  163. Xset of private function and variable symbols. Normally, any symbol
  164. Xoccurring in a script is treated as "public" which means that it is
  165. Xavailable for use anywhere in a program. Making all symbols public is
  166. Xthe easiest way to go, but it bears the danger that you may
  167. Xaccidentally "redefine" a symbol of another script which was actually
  168. Xreserved for use within that script. As a remedy in such situations,
  169. Xyou can declare a symbol private as follows:
  170. X
  171. X     private foo;
  172. X
  173. X   This also works with variable and type symbols. For instance:
  174. X
  175. X     private var C;
  176. X     private type Color = const red, green, blue;
  177. X
  178. X   Any constructor symbol declared in a private type declaration will
  179. Xalso be private, unless an explicit `public' scope prefix is used; see
  180. X*Note Declarations and Variable Definitions::.
  181. X
  182. X   Private symbols are kept in a separate namespace which is accessible
  183. Xonly to the script which declares the symbol. This prevents name clashes
  184. Xwith public and private symbols in other scripts. If a private symbol of
  185. Xa script happens to have the same name as a public symbol defined
  186. Xelsewhere, the public symbol is hidden in that script. To be precise,
  187. Xany occurrences of the symbol following its `private' declaration will
  188. Xrefer to the private symbol. Thus you can still gain access to the
  189. Xpublic symbol of the same name, but all its uses must precede the
  190. X`private' declaration of the symbol. For instance, you can define
  191. Xyourself a synonym for a public symbol which is later redeclared
  192. Xprivate as follows:
  193. X
  194. X     public_foo              = foo;
  195. X     private foo;
  196. X     foo X                   = public_foo (bar X);
  197. X
  198. X   You can specify private symbols in the interpreter by using the
  199. Xnotation `.NAME.SYMBOL', where NAME stands for the name of the script
  200. Xwhich declares the symbol. For instance, you denote the private symbol
  201. X`foo' declared in the script `myprog.q' as `.myprog.foo'. The same
  202. Xnotation is used when the interpreter prints a private symbol, and by
  203. Xthe built-in `str', `strq', `write' and `writeq' functions.
  204. X
  205. X
  206. XFile: qdoc.info,  Node: Types,  Next: Special Forms,  Prev: Scripts,  Up: Top
  207. X
  208. XTypes
  209. X*****
  210. X
  211. X   Q is an untyped programming language, and thus it is only possible to
  212. Xdistinguish different "types" of objects - such as search trees, queues,
  213. Xarrays and the like - by selecting an appropriate set of "constructor"
  214. Xsymbols for each type of object. This chapter discusses Q's notion of
  215. X"type guards" which allows you to make the assignment of constructors to
  216. Xa type explicit, and to use this information in order to restrict the
  217. Xapplicability of equations to objects of a given type.
  218. X
  219. X* Menu:
  220. X
  221. X* Using Type Guards::
  222. X* Built-In Types::
  223. X* Sub- and Supertypes::
  224. X
  225. X
  226. XFile: qdoc.info,  Node: Using Type Guards,  Next: Built-In Types,  Prev: Types,  Up: Types
  227. X
  228. XUsing Type Guards
  229. X=================
  230. X
  231. X   As in any programming language, the careful design of
  232. Xapplication-dependent data structures is one of the main concerns when
  233. Xdeveloping Q programs which go beyond simple numeric, string and list
  234. Xprocessing. As a typical example for a non-list data structure which
  235. Xplays a prominent role in many Q programs, let us consider binary
  236. Xsearch trees, which are a convenient means to implement sets, bags,
  237. Xdictionaries and the like. We will use this data structure as a running
  238. Xexample throughout this chapter.
  239. X
  240. X   A typical choice of constructors for binary trees is the following:
  241. X
  242. X     public const niltree;
  243. X     public bintree X T1 T2;
  244. X
  245. X   To make explicit the fact that `niltree' and `bintree' belong to the
  246. Xbinary tree type, we can also use a type declaration which introduces
  247. Xthe type symbol `BinTree', as discussed in *Note Declarations and
  248. XVariable Definitions:::
  249. X
  250. X     type BinTree = const niltree
  251. X                  | bintree X T1 T2
  252. X                  ;
  253. X
  254. X   The type symbol can then be used as a "guard" on variables to ensure
  255. Xthat a variable is only matched to objects of the given type, see *Note
  256. XType Guards::. E.g., the following rule employs such a type guard in
  257. Xorder to restrict the argument of the `foo' function to `BinTree'
  258. Xobjects:
  259. X
  260. X     foo T:BinTree           = ...;
  261. X
  262. X   This makes it possible to avoid explicit argument patterns like
  263. X
  264. X     foo niltree             = ...;
  265. X     foo (bintree X T1 T2)   = ...;
  266. X
  267. Xin cases in which the component values are not actually required. This
  268. Xcan simplify matters a lot, in particular if multiple arguments have to
  269. Xbe matched to a given type. Also, it is more efficient than checking
  270. Xthe type of an object in the qualifier part of a rule by using a
  271. Xuser-defined predicate, since the interpreter can use the type
  272. Xinformation right away in the pattern matching process.
  273. X
  274. X   Another important reason for preferring type guards over explicit
  275. Xargument patterns is the issue of "information hiding." With the former
  276. Xdefinition of the `foo' function above we do not make any explicit
  277. Xreference to the constructor patterns making up the `BinTree' data
  278. Xtype. This makes it possible to treat `BinTree' as an "abstract data
  279. Xtype" ("ADT") which hides the underlying implementation details (in
  280. Xparticular the constructors), while still being able to verify that the
  281. Xproper kind of object is supplied as an argument. Any access to objects
  282. Xof the ADT will then be implemented by referring to the appropriate
  283. Xoperations supplied by the type. In fact, we can make the constructors
  284. Xprivate symbols which are only accessible to the script which
  285. Ximplements the `BinTree' type:
  286. X
  287. X     type BinTree = private const niltree
  288. X                  | private bintree X T1 T2
  289. X                  ;
  290. X
  291. X   As a concrete example, let us assume the standard search tree
  292. Xoperations `insert T X' and `delete T X', which insert an element `X'
  293. Xinto a tree `T', and remove it from the tree, respectively. These
  294. Xoperations can be implemented as follows (see [Bird/Wadler 1988]):
  295. X
  296. X     private join T1 T2, init T, last T;
  297. X     
  298. X     insert niltree Y        = bintree Y niltree niltree;
  299. X     insert (bintree X T1 T2) Y
  300. X                             = bintree X (insert T1 Y) T2 if X>Y;
  301. X                             = bintree X T1 (insert T2 Y) if X<Y;
  302. X                             = bintree Y T1 T2 if X=Y;
  303. X     
  304. X     delete niltree Y        = niltree;
  305. X     delete (bintree X T1 T2) Y
  306. X                             = bintree X (delete T1 Y) T2 if X>Y;
  307. X                             = bintree X T1 (delete T2 Y) if X<Y;
  308. X                             = join T1 T2 if X=Y;
  309. X     
  310. X     join niltree T2         = T2;
  311. X     join T1 T2              = bintree (last T1) (init T1) T2 otherwise;
  312. X     
  313. X     init (bintree X T1 niltree)
  314. X                             = T1;
  315. X     init (bintree X T1 T2)  = bintree X T1 (init T2) otherwise;
  316. X     
  317. X     last (bintree X T1 niltree)
  318. X                             = X;
  319. X     last (bintree X T1 T2)  = last T2 otherwise;
  320. X
  321. X   (Note that the `last' and `init' operations return the last element
  322. Xof a binary tree, and a binary tree with the last element removed,
  323. Xrespectively. The `join', `init' and `last' functions are for internal
  324. Xuse only, and can hence be implemented as private functions.)
  325. X
  326. X   Furthermore, we assume the following function `mkBinTree' which
  327. Xconstructs a binary tree from a list, and the function `members' which
  328. Xreturns the list of elements stored in a tree (in ascending order):
  329. X
  330. X     mkBinTree Xs:List       = foldl insert niltree Xs;
  331. X     
  332. X     members niltree         = [];
  333. X     members (bintree X T1 T2)
  334. X                             = members T1 + [X|members T2];
  335. X
  336. X   The definition of `mkBinTree' employs the `foldl' operation which
  337. Xhas already been mentioned in *Note Higher-Order Functions:::
  338. X
  339. X     foldl F A []            = A;
  340. X     foldl F A [X|Xs]        = foldl F (F A X) Xs;
  341. X
  342. X   We can use `foldl' and the interface operations of the `BinTree' ADT
  343. Xin order to implement the functions `union' and `diff' which add and
  344. Xremove all members of a tree to/from another tree:
  345. X
  346. X     /* union T1 T2: add elements of T2 to T1 */
  347. X     
  348. X     union T1:BinTree T2:BinTree
  349. X                             = foldl insert T1 (members T2);
  350. X     
  351. X     /* diff T1 T2: remove elements of T2 from T1 */
  352. X     
  353. X     diff T1:BinTree T2:BinTree
  354. X                             = foldl delete T1 (members T2);
  355. X
  356. X   Observe that no explicit reference is made to the `BinTree'
  357. Xconstructors; we only employ the public "interface" functions `insert',
  358. X`delete' and `members' of the `BinTree' ADT.  This allows us to change
  359. Xthe realization of the data structure without having to rewrite the
  360. Xdefinitions of `union' and `diff'. Still, the definitions of `union'
  361. Xand `diff' are "safe;" the `BinTree' type guard ensures that the
  362. Xarguments passed to `union' and `diff' are indeed `BinTree' objects
  363. Xcapable of carrying out the requested operations.
  364. X
  365. X
  366. XFile: qdoc.info,  Node: Built-In Types,  Next: Sub- and Supertypes,  Prev: Using Type Guards,  Up: Types
  367. X
  368. XBuilt-In Types
  369. X==============
  370. X
  371. X   Type guards are also the only way for verifying that the actual
  372. Xvalue of a variable belongs to one of the built-in types integers,
  373. Xfloating point numbers, strings and files, since there is no way for
  374. Xwriting out all "constructors" for these kinds of objects - there are
  375. Xinfinitely many.  For this purpose, the type symbols `Int', `Float',
  376. X`String' and `File' are predefined. For instance, a predicate verifying
  377. Xthat an expression is an integer can be implemented as follows:
  378. X
  379. X     isint X:Int             = true;
  380. X     isint X                 = false otherwise;
  381. X
  382. X   There also is a type named `Num' which, when used as a guard on
  383. Xvariables, matches numeric (i.e. both integer and floating point)
  384. Xvalues.  Technically, `Num' is the "supertype" of both `Int' and
  385. X`Float'; more about that in *Note Sub- and Supertypes::. E.g., here is a
  386. Xdefinition of a function `abs' which returns the absolute value of an
  387. Xinteger or floating point number:
  388. X
  389. X     abs X:Num               = X if X>=0;
  390. X                             = -X otherwise;
  391. X
  392. X   The built-in `List' type matches all list expressions of the form
  393. X`[]' or `[X|Xs]'. This type is used to restrict the applicability of an
  394. Xequation to list arguments. For instance, the following equations
  395. Xdefine a function `reverse' which reverses a list:
  396. X
  397. X     reverse Xs:List         = foldl push [] Xs;
  398. X     push Xs:List X          = [X|Xs];
  399. X
  400. X   (Note that there is no built-in `tuple' type in the Q language.
  401. XThere is no point in introducing such a type symbol, since *any*
  402. Xexpression in the Q language is a tuple. To match empty tuples `()' and
  403. Xpairs `(X,Xs)', the corresponding patterns must be used explicitly.)
  404. X
  405. X   Finally, the predefined `Bool' type is a convenient means to refer to
  406. Xobjects which are truth values. It can be thought of as being
  407. Xpredefined as follows:
  408. X
  409. X     type Bool = const false, true;
  410. X
  411. X
  412. XFile: qdoc.info,  Node: Sub- and Supertypes,  Prev: Built-In Types,  Up: Types
  413. X
  414. XSub- and Supertypes
  415. X===================
  416. X
  417. X   The Q programming language also provides a subtype concept similar
  418. Xto the notion of single inheritance in object-oriented programming
  419. Xlanguages such as SMALLTALK. For instance, we can modify our
  420. Xdeclaration of the `BinTree' type (cf. *Note Using Type Guards::) in
  421. Xorder to make `BinTree' a subtype of the supertype `SearchTree' as
  422. Xfollows:
  423. X
  424. X     type BinTree : SearchTree = private const niltree
  425. X                               | private bintree X T1 T2
  426. X                               ;
  427. X
  428. X   Usually, supertypes will be "abstract" types which do not provide
  429. Xtheir own set of constructor symbols, but are simply used to factor out
  430. Xcommon operations shared among several "concrete" types. For instance,
  431. Xthe `SearchTree' type might have been declared as follows:
  432. X
  433. X     type SearchTree;
  434. X
  435. X   Now variables of type `SearchTree' will also match objects of its
  436. Xsubtype `BinTree', as well as of any other subtype of `SearchTree'. We
  437. Xcan turn the `union' and `diff' functions from *Note Using Type
  438. XGuards::, into operations on the `SearchTree' type as follows:
  439. X
  440. X     union T1:SearchTree T2:SearchTree
  441. X                             = foldl insert T1 (members T2);
  442. X     
  443. X     diff T1:SearchTree T2:SearchTree
  444. X                             = foldl delete T1 (members T2);
  445. X
  446. X   As the next step, we might introduce another type `AVLTree' providing
  447. Xthe same interface operations `insert', `delete' and `members' as the
  448. X`BinTree' type, but implementing these operations in terms of AVL trees
  449. Xrather than simple binary trees. (AVL trees are a variant of binary
  450. Xsearch trees in which the trees are kept balanced, and thus logarithmic
  451. Xinsertion and deletion times can be guaranteed.) If we make `AVLTree'
  452. Xanother subtype of `SearchTree', then the `union' and `diff' operations
  453. Xcan be applied to `AVLTree' objects just as well as to `BinTree''s. In
  454. Xfact, the operations will even work if we mix argument types, e.g.,
  455. Xprovide a `BinTree' as the first argument of `union' and an `AVLTree'
  456. Xas the second! By these means, it is possible to define polymorphic
  457. Xoperations which are applicable to several different types sharing the
  458. Xsame (subset of) interface functions.
  459. X
  460. X   For the sake of concreteness, here is an implementation of the
  461. X`AVLTree' type. The `shl', `shr', `rol' and `ror' functions implement
  462. Xthe common AVL tree rotation operations which are used to keep the tree
  463. Xbalanced; see [Bird/Wadler 1988] for details.
  464. X
  465. X     include "stdlib.q";     % for the foldl and max functions
  466. X     
  467. X     /* H denotes the height of a nonempty AVL tree */
  468. X     
  469. X     type AVLTree : SearchTree = private const niltree
  470. X                               | private bintree H X T1 T2
  471. X                               ;
  472. X     
  473. X     private mknode X T1 T2;
  474. X     private join T1 T2, init T, last T, height T, slope T, rebal T;
  475. X     private rol T, ror T, shl T, shr T;
  476. X     
  477. X     mkAVLTree Xs:List       = foldl insert niltree Xs;
  478. X     
  479. X     members niltree         = [];
  480. X     members (bintree H X T1 T2)
  481. X                             = members T1 + [X|members T2];
  482. X     
  483. X     insert niltree Y        = bintree 1 Y niltree niltree;
  484. X     insert (bintree H X T1 T2) Y
  485. X                             = rebal (mknode X (insert T1 Y)) T2 if X>Y;
  486. X                             = rebal (mknode X T1 (insert T2 Y)) if X<Y;
  487. X                             = bintree H Y T1 T2 if X=Y;
  488. X     
  489. X     delete niltree Y        = niltree;
  490. X     delete (bintree H X T1 T2) Y
  491. X                             = rebal (mknode X (delete T1 Y) T2) if X>Y;
  492. X                             = rebal (mknode X T1 (delete T2 Y)) if X<Y;
  493. X                             = join T1 T2 if X=Y;
  494. X     
  495. X     join niltree T2         = T2;
  496. X     join T1 T2              = rebal (mknode (last T1) (init T1) T2) otherwise;
  497. X     
  498. X     init (bintree H X T1 niltree)
  499. X                             = T1;
  500. X     init (bintree H X T1 T2)
  501. X                             = rebal (mknode X T1 (init T2)) otherwise;
  502. X     
  503. X     last (bintree H X T1 niltree)
  504. X                             = X;
  505. X     last (bintree H X T1 T2)
  506. X                             = last T2 otherwise;
  507. X     
  508. X     /* mknode constructs a tree node, computing the height value */
  509. X     
  510. X     mknode X T1 T2          = bintree (max (height T1) (height T2) +1)
  511. X                                     X T1 T2;
  512. X     
  513. X     /* height and slope compute the height and slope (difference between
  514. X        heights of the left and the right subtree), respectively */
  515. X     
  516. X     height niltree          = 0;
  517. X     height (bintree H T1 T2)
  518. X                             = H;
  519. X     
  520. X     slope niltree           = 0;
  521. X     slope (bintree H X T1 T2)
  522. X                             = height T1 - height T2;
  523. X     
  524. X     /* rebal rebalances after single insertions and deletions */
  525. X     
  526. X     rebal T                 = shl T if slope T = -2;
  527. X                             = shr T if slope T = 2;
  528. X                             = T otherwise;
  529. X     
  530. X     /* rotation operations */
  531. X     
  532. X     rol (bintree H1 X1 T1 (bintree H2 X2 T2 T3))
  533. X                             = mknode X2 (mknode X1 T1 T2) T3;
  534. X     
  535. X     ror (bintree H1 X1 (bintree H2 X2 T1 T2) T3)
  536. X                             = mknode X2 T1 (mknode X1 T2 T3);
  537. X     
  538. X     shl (bintree H X T1 T2)
  539. X                             = rol (mknode X T1 (ror T2)) if slope T2 = 1;
  540. X                             = rol (bintree H X T1 T2) otherwise;
  541. X     
  542. X     shr (bintree H X T1 T2)
  543. X                             = ror (mknode X T1 (ror T2)) if slope T2 = -1;
  544. X                             = ror (bintree H X T1 T2) otherwise;
  545. X
  546. X
  547. XFile: qdoc.info,  Node: Special Forms,  Next: Built-In Functions,  Prev: Types,  Up: Top
  548. X
  549. XSpecial Forms
  550. X*************
  551. X
  552. X   As discussed in *Note Equations and Expression Evaluation::, the Q
  553. Xinterpreter evaluates expressions in applicative, i.e.
  554. Xleftmost-innermost, order. This means that the arguments of a function
  555. Xare usually evaluated before the function is applied to them.
  556. XOccasionally, it is useful or even essential to defer the evaluation of
  557. Xarguments until they are actually required in the course of a
  558. Xcomputation. For this purpose, the Q language lets you introduce
  559. Xso-called "special forms". This chapter discusses how these constructs
  560. Xare defined and used.
  561. X
  562. X* Menu:
  563. X
  564. X* Basic Concepts::
  565. X* Form of Special Declarations::
  566. X* Special Constructors::
  567. X* Built-In Special Forms::
  568. X* The Special Form Quote::
  569. X
  570. X
  571. XFile: qdoc.info,  Node: Basic Concepts,  Next: Form of Special Declarations,  Prev: Special Forms,  Up: Special Forms
  572. X
  573. XBasic Concepts
  574. X==============
  575. X
  576. X   Consider the following definition from the standard library script
  577. X`special.q' which implements a kind of conditional expression:
  578. X
  579. X     cond P X Y              = X if P;
  580. X                             = Y otherwise;
  581. X
  582. X   The `cond' function takes as its first argument a truth value which
  583. Xis used to determine whether the second or third argument is to be
  584. Xreturned as the value of the conditional expression. Although the above
  585. Xdefinition is perfectly correct, using applicative order evaluation
  586. Xwith this definition is clearly inappropriate since all arguments must
  587. Xalready have been evaluated before the `cond' function gets applied to
  588. Xthem. Since either the second or third argument is simply thrown away,
  589. Xthe effort involved in the evaluation of this argument is wasted. As an
  590. Xextreme case, e.g., `Y' might not have a terminating evaluation at all,
  591. Xin which case the evaluation of `cond P X Y' would not terminate either
  592. Xeven though `Y' is actually not required if `P' happens to evaluate to
  593. X`true'.
  594. X
  595. X   Instead, we would like to have `cond' evaluate its arguments only as
  596. Xthey are required. In the Q language, this can be done simply by
  597. Xdeclaring `cond' as a "special form". All we have to do is to precede
  598. Xthe above equations with the following declaration:
  599. X
  600. X     special cond P X Y;
  601. X
  602. X   This tells the Q interpreter that the `cond' function expects three
  603. Xarguments `P', `X' and `Y' which should be left unevaluated until their
  604. Xvalues are actually required to reduce the qualifier or the right-hand
  605. Xside of an equation in `cond''s definition. Thus, when the interpreter
  606. Xcomes to consider the first rule,
  607. X
  608. X     cond P X Y              = X if P;
  609. X
  610. Xit will first evaluate `P' to obtain the value of the condition part of
  611. Xthis rule. If `P' evaluates to `true', `X' will be evaluated and
  612. Xreturned as the value of the left-hand side expression. Otherwise (if
  613. X`P' evaluates to `false'), `X' will be left unevaluated, and the
  614. Xinterpreter considers the next rule,
  615. X
  616. X     cond P X Y              = Y otherwise;
  617. X
  618. Xwhich causes it to evaluate `Y' and reduce `cond P X Y' to this value.
  619. X
  620. X   Note that a "special" argument is evaluated any time its value is
  621. Xrequired on the right-hand side of a definition. Consider, for instance:
  622. X
  623. X     special foo P X;
  624. X     foo P X                 = X * sqrt X if P;
  625. X                             = 0 otherwise;
  626. X
  627. X   As the first rule is applied `X' actually gets evaluated twice, once
  628. Xfor each occurrence on the right-hand side of the equation. We can avoid
  629. Xthis by introducing an auxiliary function `bar' as follows:
  630. X
  631. X     special foo P X;
  632. X     foo P X                 = bar X if P;
  633. X                             = 0 otherwise;
  634. X     bar X                   = X * sqrt X;
  635. X
  636. X   Now, the `X' parameter is evaluated before the `bar' function is
  637. Xapplied to it, since `bar' is implemented as an "ordinary"
  638. X(non-`special') function.
  639. X
  640. X   It should be noted that in the Q language special forms are indeed a
  641. Xruntime feature. This means that special forms are not only recognized
  642. Xat compile time, but also when they are passed as arguments or returned
  643. Xas function results in the course of a computation (which usually
  644. Xcannot be predicted at compile time). For instance, if we define `foo'
  645. Xas follows:
  646. X
  647. X     special bar X;
  648. X     foo                     = bar;
  649. X
  650. Xthen `foo (1+1)' evaluates to `bar (1+1)' and *not* to `bar 2',
  651. Xalthough `foo' itself is not declared to be a special form. This also
  652. Xworks if you pass `bar' as a functional parameter:
  653. X
  654. X     special bar X;
  655. X     foo F X                 = F (X+1);
  656. X
  657. X   Given the above definition, `foo bar 1' will evaluate to `bar (1+1)'.
  658. X
  659. X   On the other hand, you must take care that arguments to special
  660. Xfunctions which are passed on by other functions are not evaluated too
  661. Xearly. For instance, if the `apply' function is defined as follows:
  662. X
  663. X     apply F X               = F X;
  664. X
  665. Xand is then invoked as `apply bar (1+1)' then `(1+1)' will be evaluated
  666. Xeven though `bar' is a special form. The reason is that the argument
  667. X`(1+1)' is evaluated *before* `apply' is applied to it, since we have
  668. Xnot declared `apply' as a special form as well.  (Actually, this effect
  669. Xis commonly used deliberately to force evaluation of special form
  670. Xarguments.)
  671. X
  672. X   As a general rule, you should make any function a special form that
  673. Xpasses its arguments to another special form, unless you explicitly
  674. Xwish to evaluate these arguments.
  675. X
  676. X
  677. XFile: qdoc.info,  Node: Form of Special Declarations,  Next: Special Constructors,  Prev: Basic Concepts,  Up: Special Forms
  678. X
  679. XForm of Special Declarations
  680. X============================
  681. X
  682. X   The syntax of `special' declarations has already been introduced in
  683. X*Note Declarations and Variable Definitions::. The `special' keyword
  684. Xmust be followed by a function identifier and a sequence of variable
  685. Xsymbols (the variable symbols only serve to specify the number of
  686. Xarguments, and are otherwise treated as comments). If the argument list
  687. Xis omitted, the symbol is actually treated as an ordinary (non-special)
  688. Xsymbol. Otherwise the argument list specifies the number of parameters
  689. Xwhich should be protected from being evaluated. For instance, if `foo'
  690. Xis declared as
  691. X
  692. X     special foo X Y;
  693. X
  694. Xand is then invoked as `foo X Y Z' then only `X' and `Y' will be left
  695. Xunevaluated, while `Z' will be evaluated as usual.
  696. X
  697. X
  698. XFile: qdoc.info,  Node: Special Constructors,  Next: Built-In Special Forms,  Prev: Form of Special Declarations,  Up: Special Forms
  699. X
  700. XSpecial Constructors
  701. X====================
  702. X
  703. X   Special forms prevent their arguments from being evaluated until
  704. Xthey are used in a context which is not "protected" by another special
  705. Xform. In particular, you can also have special "constructors" which
  706. Xprotect their arguments until they are extracted in an ordinary
  707. Xcontext. A prime example for this are "streams", a kind of infinite
  708. Xlist data structure. We can implement streams using a type definition
  709. Xlike the following:
  710. X
  711. X     type Stream = const nilstream | special binstream X Xs;
  712. X
  713. X   Just like lists, a stream consists of a head element, `X', and a
  714. Xstream of remaining elements, `Xs'. Now the "head" and "tail" operations
  715. Xfor lists (cf. *Note Equations::) carry over to streams as follows:
  716. X
  717. X     hd (binstream X Xs)     = X;
  718. X     tl (binstream X Xs)     = Xs;
  719. X
  720. X   LISP programmers should note that this implementation does not
  721. Xrequire any explicit "delay" and "force" operations; all necessary
  722. Xevaluations are performed implicitly by the Q interpreter. For
  723. Xinstance, consider the stream of all integers starting from `N':
  724. X
  725. X     ints N                  = binstream N (ints (N+1));
  726. X
  727. X   With leftmost-innermost evaluation, this definition would certainly
  728. Xcause severe troubles, because of the recursive invokation of `ints'.
  729. XHowever, since `binstream' is a special form we have the following:
  730. X
  731. X     => def S = ints 1
  732. X     
  733. X     => S
  734. X     binstream 1 (ints (1+1))
  735. X     
  736. X     => hd S
  737. X     1
  738. X     
  739. X     => tl S
  740. X     binstream 2 (ints (2+1))
  741. X
  742. X   We can also have finite streams if we use the `nilstream' constant to
  743. Xsignal the end of a stream, and most common list operations carry over
  744. Xto streams accordingly. In difference to lists, streams produce their
  745. Xelements only "on demand." This paves the way for some important and
  746. Xpowerful programming techniques. For instance, streams are a useful
  747. Xdevice to implement different kinds of backtracking and dynamic
  748. Xprogramming algorithms in a uniform setting. Please refer to
  749. X[Abelson/Sussman 1985] for more details. The standard library includes
  750. Xan implementation of streams which is described in *Note The Standard
  751. XLibrary::.
  752. X
  753. X
  754. XFile: qdoc.info,  Node: Built-In Special Forms,  Next: The Special Form Quote,  Prev: Special Constructors,  Up: Special Forms
  755. X
  756. XBuilt-In Special Forms
  757. X======================
  758. X
  759. X   Some built-in operations of the Q language are actually implemented
  760. Xas special forms. This is necessary, in particular, in the case of the
  761. Xlogical connectives `and' and `or' which are usually evaluated in
  762. X"short-circuit mode." For instance, the `and' operator first evaluates
  763. Xits first argument and checks whether it denotes a truth value (if not,
  764. Xthe rule fails). Then, if the first argument evaluated to `false',
  765. X`false' is returned - there is no need to take a look at the second
  766. Xargument. Otherwise, the second argument is evaluated and returned as
  767. Xthe value of the expression. The `or' operation is defined analogously.
  768. XThese rules allow the Q interpreter to perform the following reductions
  769. Ximmediately, without ever having to evaluate the second argument `foo
  770. XX':
  771. X
  772. X     true or foo X           => true
  773. X     false and foo X         => false
  774. X
  775. X   The fact that `and' and `or' are special forms must be taken into
  776. Xaccount when overloading these operations. In fact, this becomes a
  777. Xnuisance when trying to implement algebraic simplification rules for
  778. Xlogical expressions in a style similar to the distributivity and
  779. Xassociativity rules for `+' and `*' mentioned in *Note Equations::.
  780. XTherefore it is possible to turn off the special treatment of these
  781. Xoperations by means of the `-c' option of the compiler (cf. *Note
  782. XRunning Compiler and Interpreter::). The `-c' option instructs the
  783. Xcompiler to treat the connectives `and' and `or' as ordinary operations
  784. Xjust like `+' and `*', s.t. logical expressions are evaluated completely
  785. Xusing the standard leftmost-innermost evaluation rule. This makes the
  786. Xfollowing script, which is used to transform symbolic logical
  787. Xexpressions into disjunctive normal form, work as expected:
  788. X
  789. X     % compile with -c
  790. X     % eliminate double negations:
  791. X     not not A               = A;
  792. X     % push negations inward (deMorgan's laws):
  793. X     not (A or B)            = not A and not B;
  794. X     not (A and B)           = not A or not B;
  795. X     % distributivity laws:
  796. X     A and (B or C)          = A and B or A and C;
  797. X     (A or B) and C          = A and C or B and C;
  798. X
  799. X   As already mentioned, operator sections (cf. *Note Sections::) are
  800. Xalso implemented by means of certain special forms, namely `leftsect'
  801. Xand `rightsect'. The definition of these operations is fairly
  802. Xstraightforward. In fact, the programmer could easily define them
  803. Xhimself or herself as follows:
  804. X
  805. X     special leftsect X Y Z, rightsect X Y Z;
  806. X     
  807. X     leftsect X Y Z          = X Y Z;
  808. X     rightsect X Y Z         = X Z Y;
  809. X
  810. X   Now a construct such as `(1/)' or `(/2)' can be represented as
  811. X`leftsect (/) 1' and `rightsect (/) 2', respectively. As an exercise,
  812. Xthe reader may verify that the above definitions produce the correct
  813. Xresults with expressions like `(1/) 3' and `(/2) 3'.
  814. X
  815. X   The reason that `leftsect' and `rightsect' are implemented as
  816. Xspecial forms is that this makes sections involving special operators
  817. Xsuch as `and' and operands invoking operations with side-effects (see
  818. X*Note Built-In Functions::) work as expected. For instance, let the
  819. X`loop' symbol stand for a nonterminating evaluation:
  820. X
  821. X     loop                    = loop;
  822. X
  823. X   Then `(and loop) false' still correctly reduces to `false' since the
  824. Xoperand `loop' will not be evaluated before it is passed to `(and)'.
  825. XSimilarly, a section like `(||writec "\n")' will not evaluate the
  826. X`writec "\n"' operand until the first operand is supplied. On the other
  827. Xhand, this means that for a non-special operator the specified operand
  828. Xwill be evaluated any time the section is applied to a given
  829. Xexpression. E.g., the section `(+1/3)' will evaluate `1/3' any time it
  830. Xis applied to an argument.
  831. X
  832. X
  833. XFile: qdoc.info,  Node: The Special Form Quote,  Prev: Built-In Special Forms,  Up: Special Forms
  834. X
  835. XThe Special Form Quote
  836. X======================
  837. X
  838. X   Another built-in special form is the predefined function symbol
  839. X`quote', which acts as a constructor that protects its single argument
  840. Xexpression from being evaluated:
  841. X
  842. X     special quote X;
  843. X
  844. X   This construct is useful if you wish to treat certain expressions
  845. X(which may or may not be in normal form) as literal objects rather than
  846. Xhaving them evaluated. For instance:
  847. X
  848. X     => quote (1+1)
  849. X     quote (1+1)
  850. X
  851. X   LISP programmers should note that `quote' is in fact a constructor,
  852. Xand *not* a function which returns its single argument unevaluated.
  853. XThis is essential since in the Q language an expression only remains
  854. Xunevaluated as long as it is protected by a special form - any
  855. Xexpression which occurs outside the context of a special form is always
  856. Xin normal form.
  857. X
  858. X   The reason that `quote' is supplied as a built-in in the Q language
  859. Xis that certain built-in operations return quoted expressions as
  860. Xresults or take such expressions as arguments, cf. *Note Built-In
  861. XFunctions::.
  862. X
  863. X
  864. XFile: qdoc.info,  Node: Built-In Functions,  Next: The Standard Library,  Prev: Special Forms,  Up: Top
  865. X
  866. XBuilt-In Functions
  867. X******************
  868. X
  869. X   Besides the built-in operators already discussed in *Note
  870. XExpressions::, the Q language also provides a collection of predefined
  871. Xfunctions which cover a variety of elementary operations. The built-in
  872. Xfunctions can be divided into five major groups, numeric functions,
  873. Xstring functions, conversion functions, I/O functions, and
  874. Xmiscellaneous functions. We will describe each of these in turn.
  875. X
  876. X* Menu:
  877. X
  878. X* Numeric Functions::
  879. X* String Functions::
  880. X* Conversion Functions::
  881. X* I/O Functions::
  882. X* Miscellaneous Functions::
  883. X
  884. X
  885. XFile: qdoc.info,  Node: Numeric Functions,  Next: String Functions,  Prev: Built-In Functions,  Up: Built-In Functions
  886. X
  887. XNumeric Functions
  888. X=================
  889. X
  890. X`exp X'
  891. X     exponential function
  892. X
  893. X`ln X'
  894. X     natural logarithm
  895. X
  896. X`sqrt X'
  897. X     square root
  898. X
  899. X`sin X'
  900. X     sine
  901. X
  902. X`cos X'
  903. X     cosine
  904. X
  905. X`atan X'
  906. X     arcus tangent
  907. X
  908. X`random'
  909. X     random number
  910. X
  911. X`seed N'
  912. X     initialize random number generator
  913. X
  914. X   This group includes the usual trigonometric and exponential
  915. Xfunctions, logarithms and square root. All these functions take both
  916. Xinteger and floating point arguments. They return a floating point
  917. Xnumber. Besides this, there is a parameterless function `random' which
  918. Xreturns a pseudo random floating point value in the range 0 <= x < 1.
  919. XThe current implementation uses the portable random number generator
  920. Xdeveloped by George Marsaglia and Arif Zaman [Marsaglia/Zaman 1987]. The
  921. Xgenerator is initialized automatically with a seed taken from the system
  922. Xclock at the time the interpreter starts up. The `seed' function allows
  923. Xto initialize the generator explicitly with a given integer seed; this
  924. Xis useful if it is necessary to reproduce random sequences.
  925. X
  926. X
  927. XFile: qdoc.info,  Node: String Functions,  Next: Conversion Functions,  Prev: Numeric Functions,  Up: Built-In Functions
  928. X
  929. XString Functions
  930. X================
  931. X
  932. X   This group consists of two operations for extracting substrings from
  933. Xa string and searching for occurrences of a substring in a string:
  934. X
  935. X`substr S K L'
  936. X     return substring of length `L' at position `K' in `S'
  937. X
  938. X`pos S1 S'
  939. X     position of substring `S1' in `S'
  940. X
  941. X   Positions are specified as integers ranging from `0' to `(#S-1)',
  942. Xwith `0' denoting the position of the first character in a string (just
  943. Xas with the indexing operator `!'). The `pos' function returns `-1' if
  944. Xthere is no occurrence of the given substring in the string.  The
  945. X`substr' function takes three arguments: the subject string `S', the
  946. Xindex `K' at which the substring begins, and the number `L' of
  947. Xcharacters to be extracted from the subject string. If `K' is less than
  948. Xzero, it is assumed to be zero. If `L' is less than or equal to zero,
  949. Xor if `K>=#S', the empty string is returned. If `L' exceeds the number
  950. Xof characters behind position `K', the remainder of the string is
  951. Xreturned.
  952. X
  953. X
  954. XFile: qdoc.info,  Node: Conversion Functions,  Next: I/O Functions,  Prev: String Functions,  Up: Built-In Functions
  955. X
  956. XConversion Functions
  957. X====================
  958. X
  959. X   This group consists of functions for converting between different
  960. Xkinds of objects:
  961. X
  962. X`trunc X'
  963. X     truncate floating point to integer value
  964. X
  965. X`round X'
  966. X     round floating point to nearest integer value
  967. X
  968. X`int X'
  969. X     integer part of floating point number
  970. X
  971. X`frac X'
  972. X     fraction part of floating point number
  973. X
  974. X`ord C'
  975. X     character number in local character set
  976. X
  977. X`chr N'
  978. X     character with given number
  979. X
  980. X`str X'
  981. X     convert expression to string
  982. X
  983. X`strq X'
  984. X     convert quoted expression to string
  985. X
  986. X`val S'
  987. X     convert string to expression
  988. X
  989. X`valq S'
  990. X     convert string to quoted expression
  991. X
  992. X   The `str' function converts its argument expression to the
  993. Xcorresponding print representation conforming to the Q expression
  994. Xsyntax, which is returned as a string; the argument is evaluated as
  995. Xusual. The `strq' function is similar, but converts a quoted expression
  996. X(cf.  *Note The Special Form Quote::). For instance:
  997. X
  998. X     str (1+1)               => "2"
  999. X     strq (quote (1+1))      => "1+1"
  1000. X
  1001. X   The `val'/`valq' functions are the counterpart of `str' and `strq';
  1002. Xthey convert a string containing the print representation of an
  1003. Xexpression back to an expression. In the case of `val', the expression
  1004. Xis evaluated, while `valq' returns the parsed expression as it is,
  1005. Xprotected with `quote':
  1006. X
  1007. X     val "1+1"               => 2
  1008. X     valq "1+1"              => quote (1+1)
  1009. X
  1010. X   These functions require that the contents of their string arguments
  1011. Xconform to the Q expression syntax. In case of a syntax error, the
  1012. Xbuilt-in rules fail.
  1013. X
  1014. X
  1015. XFile: qdoc.info,  Node: I/O Functions,  Next: Miscellaneous Functions,  Prev: Conversion Functions,  Up: Built-In Functions
  1016. X
  1017. XI/O Functions
  1018. X=============
  1019. X
  1020. X   This group provides functions for handling input/output from/to the
  1021. Xterminal or a text file. These functions implement operations with
  1022. Xside-effects; the side-effects consist in modifying the terminal
  1023. Xdisplay or a file.
  1024. X
  1025. X`fopen NAME MODE'
  1026. X     open file `NAME' in mode `MODE'
  1027. X
  1028. X`popen CMD MODE'
  1029. X     open pipe `CMD' in mode `MODE'
  1030. X
  1031. X`read, fread F'
  1032. X     read an expression from the terminal or a file
  1033. X
  1034. X`readq, freadq F'
  1035. X     read a quoted expression from the terminal or a file
  1036. X
  1037. X`readc, freadc F'
  1038. X     read a character from the terminal or a file
  1039. X
  1040. X`reads, freads F'
  1041. X     read a string from the terminal or a file
  1042. X
  1043. X`write X, fwrite F X'
  1044. X     write an expression to the terminal or a file
  1045. X
  1046. X`writeq X, fwriteq F X'
  1047. X     write a quoted expression to the terminal or a file
  1048. X
  1049. X`writec C, fwritec F C'
  1050. X     write a character to the terminal or a file
  1051. X
  1052. X`writes S, fwrites F S'
  1053. X     write a string to the terminal or a file
  1054. X
  1055. X`eof, feof F'
  1056. X     check for end-of-file on the terminal or a file
  1057. X
  1058. X* Menu:
  1059. X
  1060. X* Terminal I/O::
  1061. X* File I/O::
  1062. X* Pipes::
  1063. X
  1064. X
  1065. XFile: qdoc.info,  Node: Terminal I/O,  Next: File I/O,  Prev: I/O Functions,  Up: I/O Functions
  1066. X
  1067. XTerminal I/O
  1068. X------------
  1069. X
  1070. X   Input from the terminal (i.e. the standard input device) is done
  1071. Xthrough the parameterless functions `read', `readq', `readc' and
  1072. X`reads' which read and return, respectively, an expression, a quoted
  1073. Xexpression, a single character, and a string. Terminal input is
  1074. Xline-buffered which means that you must type an entire input line
  1075. Xbefore anything is returned by these functions.
  1076. X
  1077. X   The `reads' function obtains one line of input, strips off the
  1078. Xtrailing newline character, and returns the result as a string. For
  1079. Xinstance (here and in the following, `<CR>' means that you hit the
  1080. Xcarriage return key to terminate the input line, rather than actually
  1081. Xtyping the string `"<CR>"'):
  1082. X
  1083. X     => reads
  1084. X     one line of text<CR>
  1085. X     "one line of text"
  1086. X
  1087. X   The `readc' function allows you to read input character by character;
  1088. Xat the end of a line the newline character `"\n"' is returned:
  1089. X
  1090. X     => readc
  1091. X     <CR>
  1092. X     "\n"
  1093. X
  1094. X   The `read' and `readq' functions read one line from the input, as
  1095. Xwith `reads', and convert the resulting string to an expression, as with
  1096. X`val' and `valq', respectively. For instance:
  1097. X
  1098. X     => read
  1099. X     1+1<CR>
  1100. X     2
  1101. X     
  1102. X     => readq
  1103. X     1+1<CR>
  1104. X     quote (1+1)
  1105. X
  1106. X   The corresponding functions for producing output on the terminal are
  1107. Xnamed `write', `writeq', `writec' and `writes'. They print an
  1108. Xexpression, a quoted expression, a character and a string, respectively.
  1109. XThese functions take one argument, the object to be printed, and return
  1110. Xthe empty tuple `()'. For instance:
  1111. X
  1112. X     => writec "x"
  1113. X     x()
  1114. X     
  1115. X     => writes "one line of text\n"
  1116. X     one line of text
  1117. X     ()
  1118. X     
  1119. X     => write (1+1)
  1120. X     2()
  1121. X     
  1122. X     => writeq (quote (1+1))
  1123. X     1+1()
  1124. X
  1125. X   (Output operations are invoked solely for their side-effects.
  1126. XHowever, any Q expression must have a value, and since there is no
  1127. Xother meaningful value to return, the `write' functions return `()'. In
  1128. Xthe above examples, this value is output by the interpreter after the
  1129. Xprinted text, which explains, e.g., the `x()' in response to `writec
  1130. X"x"'.)
  1131. X
  1132. X   It is common practice to combine these operations by means of the
  1133. X`||' operator in order to implement dialogs such as the following
  1134. Xprompt/input interaction:
  1135. X
  1136. X     => writes "Input: " || reads
  1137. X     Input: one line of text<CR>
  1138. X     "one line of text"
  1139. X
  1140. X   You will also often encounter several output operations for
  1141. Xinterpolating data into text fragments:
  1142. X
  1143. X     => writes "The result is " || writeq (quote (1+1)) || writes ".\n"
  1144. X     The result is 1+1.
  1145. X     ()
  1146. X
  1147. X   Finally, the `eof' function allows you to check for "end-of-file" on
  1148. Xthe terminal. Actually, this causes another line of input to be read
  1149. Xfrom the terminal if no input is currently available, to see whether the
  1150. Xend of the input has been reached. Most operating systems allow you to
  1151. Xtype a special character to indicate end-of-file, such as the `Ctl-D'
  1152. Xcharacter on the UNIX system:
  1153. X
  1154. X     => eof
  1155. X     <Ctl-D>
  1156. X     true
  1157. X
  1158. X
  1159. XFile: qdoc.info,  Node: File I/O,  Next: Pipes,  Prev: Terminal I/O,  Up: I/O Functions
  1160. X
  1161. XFile I/O
  1162. X--------
  1163. X
  1164. X   File input and output is implemented by the functions `fread',
  1165. X`freadq', `freadc', `freads', `fwrite', `fwriteq', `fwritec' and
  1166. X`fwrites'. There also is an `feof' function which allows to check
  1167. Xwhether the end of a file has been reached. These operations are
  1168. Xanalogous to their terminal equivalents, but take an additional first
  1169. Xargument, a "file object". A file object is a special kind of
  1170. Xelementary object in the Q language which is returned by the built-in
  1171. X`fopen' function.
  1172. X
  1173. X   The `fopen' function takes two string arguments, the "name" of the
  1174. Xfile to be opened (which is the name under which the file is known by
  1175. Xthe operating system), and the "mode" in which the file is to be
  1176. Xopened. The mode string must consist of a single character. The
  1177. Xcharacter `"r"' means to open an existing file for reading, `"w"' to
  1178. Xopen a new file for writing (existing files are truncated to zero
  1179. Xsize), and `"a"' to create a new or append to an existing file.
  1180. X
  1181. X   For instance, a function checking whether a file exists and is
  1182. Xaccessible for reading can be implemented as follows:
  1183. X
  1184. X     exists NAME             = isfile (fopen NAME "r");
  1185. X     isfile X:File           = true;
  1186. X     isfile X                = false otherwise;
  1187. X
  1188. X   Files are closed automatically when the corresponding file objects
  1189. Xare no longer accessible in a computation. Therefore no explicit
  1190. Xoperation for closing a file is required. E.g., with the above
  1191. Xdefinition of the `exists' function, if you invoke this function as
  1192. X`exists "myfile"', then the file object returned by `fopen "myfile" "r"'
  1193. X(assuming that the file actually exists) will become inaccessible as
  1194. Xsoon as it has been processed by the `isfile' function, at which point
  1195. Xit gets closed. Similarly, if you assign a file to a variable in the
  1196. Xinterpreter,
  1197. X
  1198. X     => def F = fopen "myfile" "r"
  1199. X
  1200. Xthe file will be closed as soon as you undefine the variable:
  1201. X
  1202. X     => undef F
  1203. X
  1204. X   As an example for the use of file I/O, here's a function which copies
  1205. Xthe contents of one file opened in read mode to another file opened in
  1206. Xwrite or append mode:
  1207. X
  1208. X     fcopy F G               = () if feof F;
  1209. X                             = fwritec G (freadc F) || fcopy F G otherwise;
  1210. X
  1211. X   There is also a tail-recursive implementation of `fcopy' which
  1212. Xprevents stack overflows (cf. *Note Tail Recursion::):
  1213. X
  1214. X     fcopy F G               = () if feof F;
  1215. X                             = fcopy F (fwritec G (freadc F) || G) otherwise;
  1216. X
  1217. X   Note that file objects are indeed modified by input and output
  1218. Xoperations; at least, the file pointer is moved accordingly. Otherwise
  1219. Xthe above definitions would not work. This also becomes apparent when
  1220. Xmanipulating files interactively:
  1221. X
  1222. X     => def F = fopen "xyz" "r"
  1223. X     
  1224. X     => freads F
  1225. X     "FIRST LINE IN FILE XYZ"
  1226. X     
  1227. X     => freads F
  1228. X     "SECOND LINE IN FILE XYZ"
  1229. X     
  1230. X     ...
  1231. X
  1232. X   It should be noted that all file objects in the Q language are
  1233. Xactually implemented as text files; binary files are *not* supported,
  1234. Xalthough some systems may allow you to interpret a binary file as a
  1235. Xfile of characters (this is considered non-portable, and hence should be
  1236. Xavoided). We also remark that since file objects have no printable
  1237. Xrepresentation, the functions `str', `strq', `write' and `writeq'
  1238. Xunparse such objects employing the special notation `<<file>>'. (This
  1239. Xnotation also prevents such objects from being reparsed using `val',
  1240. X`valq', `read' and `readq', of course.)
  1241. X
  1242. X
  1243. XFile: qdoc.info,  Node: Pipes,  Prev: File I/O,  Up: I/O Functions
  1244. X
  1245. XPipes
  1246. X-----
  1247. X
  1248. X   The `popen' function is used to create a file object connected to a
  1249. X"pipe". The file objects constructed with `popen' allow you to pipe
  1250. Xdata into an operating system command, and to read the output of such a
  1251. Xcommand from a file. Like `fopen', `popen' takes two string arguments.
  1252. XThe first parameter denotes the command to be executed, and the second
  1253. Xparameter specifies the mode in which the pipe is to be opened. The
  1254. Xmode argument must be either `"r"' (read from the output of the given
  1255. Xcommand) or `"w"' (write to the input of the command), and causes a
  1256. Xfile object open for reading or writing to be returned, respectively.
  1257. X
  1258. X   Input pipes are typically employed for retrieving information from
  1259. Xthe host operating system. For instance, on UNIX systems we can use the
  1260. X`ls' command to obtain a list of filenames matching a given wildcard
  1261. Xspecification. A corresponding function `ls' which returns such a list
  1262. Xcan be implemented as follows:
  1263. X
  1264. X     ls S:String             = freadls (popen ("ls "+S) "r");
  1265. X     freadls F:File          = [] if feof F;
  1266. X                             = [freads F|freadls F] otherwise;
  1267. X
  1268. X   As an example for an output pipe, the following function `more'
  1269. Xpipes a file through the `more' program which displays the file page by
  1270. Xpage:
  1271. X
  1272. X     more F:File             = fcopy F (popen "more" "w");
  1273. X
  1274. X   (The definition of `fcopy' is as in *Note File I/O::.)
  1275. X
  1276. X   Just like ordinary files, pipes are closed automatically when the
  1277. Xcorresponding file object is no longer accessible. Furthermore, the
  1278. Xinterpreter waits for the command started with `popen' to finish when
  1279. Xclosing the pipe.
  1280. X
  1281. X   Output pipes are a convenient means to implement specialized output
  1282. Xdevices in the Q language. For instance, the standard library script
  1283. X`graphics.q' writes its graphics output to a file `GRAPHICS' which is
  1284. Xusually implemented as a pipe to a PostScript previewer like, e.g.,
  1285. XGhostscript:
  1286. X
  1287. X     def GRAPHICS = popen "gs -q -" "w";
  1288. X
  1289. X
  1290. XFile: qdoc.info,  Node: Miscellaneous Functions,  Prev: I/O Functions,  Up: Built-In Functions
  1291. X
  1292. XMiscellaneous Functions
  1293. X=======================
  1294. X
  1295. X   This group consists of some special operations which do not fit into
  1296. Xany of the other groups treated above.
  1297. X
  1298. X`halt'
  1299. X     halt evaluation
  1300. X
  1301. X`quit'
  1302. X     exit the Q interpreter
  1303. X
  1304. X`break'
  1305. X     invoke the debugger
  1306. X
  1307. X`quote X'
  1308. X     quote constructor
  1309. X
  1310. X`leftsect X Y Z, rightsect X Y Z'
  1311. X     left and right section
  1312. X
  1313. X`isspecial X'
  1314. X     predicate checking whether argument is a special form
  1315. X
  1316. X`isconst X, isfun X, isvar X'
  1317. X     predicates checking whether argument is a constant, function or
  1318. X     variable symbol, respectively
  1319. X
  1320. X`isdef X'
  1321. X     predicate checking whether the variable X has been assigned a value
  1322. X
  1323. X   The `halt' function never returns, but causes the evaluation process
  1324. Xto be aborted. This last resort is commonly used in case of a fatal
  1325. Xerror condition. The `quit' function is like `halt', but it also exits
  1326. Xfrom the interpreter and returns you to the operating system shell; this
  1327. Xoperation is often used interactively to terminate a session with the
  1328. Xinterpreter. The `break' function interrupts an evaluation and invokes
  1329. Xthe symbolic debugger built into the Q interpreter (cf. *Note
  1330. XDebugging::); it returns `()'. This operation allows you to set
  1331. Xbreakpoints in a script. For instance,
  1332. X
  1333. X     foo X                   = break || bar X;
  1334. X
  1335. Xcauses the debugger to be invoked as soon as the rule is executed.
  1336. X
  1337. X   The `quote' constructor allows to protect expressions from being
  1338. Xevaluated; it has already been described in *Note The Special Form
  1339. XQuote::.  The special forms `leftsect' and `rightsect' are used for the
  1340. Xinternal representation of operator sections; however, you can also
  1341. Xinvoke them directly. See *Note Built-In Special Forms:: for a
  1342. Xdiscussion of these functions.
  1343. X
  1344. X   The predicate `isspecial' allows you to determine whether an
  1345. Xexpression is a special form which will receive its next argument
  1346. Xunevaluated. The predicates `isconst', `isfun' and `isvar' are special
  1347. Xforms which are used to check whether an expression is a constant symbol
  1348. X(including the built-in constants `true', `false', `[]' and `()'),
  1349. Xother function symbol (including the built-in operators `(+)', `(*)',
  1350. Xetc.), or variable symbol, respectively. Finally, the special form
  1351. X`isdef' can be used to check whether its argument (a variable) has been
  1352. Xassigned a value using `def'.
  1353. X
  1354. X
  1355. XFile: qdoc.info,  Node: The Standard Library,  Next: Q Language Grammar,  Prev: Built-In Functions,  Up: Top
  1356. X
  1357. XThe Standard Library
  1358. X********************
  1359. X
  1360. X   This chapter gives an overview of the data types and operations
  1361. Xprovided by the standard library modules supplied with the Q
  1362. Xprogramming system.  The library currently consists of the following
  1363. Xscripts:
  1364. X
  1365. X`assert.q'
  1366. X     print diagnostics
  1367. X
  1368. X`error.q'
  1369. X     print error messages
  1370. X
  1371. X`graphics.q'
  1372. X     graphics interface
  1373. X
  1374. X`lambda.q'
  1375. X     an implementation of the lambda calculus
  1376. X
  1377. X`lex.q'
  1378. X     lexicographic ordering on lists and tuples
  1379. X
  1380. X`list.q'
  1381. X     list comprehensions
  1382. X
  1383. X`math.q'
  1384. X     mathematical functions
  1385. X
  1386. X`plain.q'
  1387. X     empty Q script (see *Note Getting Started::)
  1388. X
  1389. X`sort.q'
  1390. X     a collection of sorting algorithms
  1391. X
  1392. X`special.q'
  1393. X     miscellaneous special forms
  1394. X
  1395. X`stdlib.q'
  1396. X     a collection of common standard functions
  1397. X
  1398. X`stdtypes.q'
  1399. X     a collection of efficient container data structures
  1400. X
  1401. X`stream.q'
  1402. X     an implementation of streams
  1403. X
  1404. X`string.q'
  1405. X     additional string functions
  1406. X
  1407. X`type.q'
  1408. X     a collection of expression predicates
  1409. X
  1410. X   Use the `std.q' script to load all modules except `math.q',
  1411. X`graphics.q' and `lex.q'. To include the `math.q' script, too, use
  1412. X`stdm.q' instead. (This still does not include the `graphics.q' and
  1413. X`lex.q' modules which are "added value" scripts that must be included
  1414. Xexplicitly.)
  1415. X
  1416. X   The `stdlib.q' script is probably the one which will be used most
  1417. Xfrequently by the average programmer; it contains a lot of additional
  1418. Xlist processing functions and other useful stuff mostly adopted from
  1419. X[Bird/Wadler 1988]. This module is also included by many other library
  1420. Xscripts.  Historically, it was the first script written for the
  1421. Xstandard library.
  1422. X
  1423. X   The `stdtypes.q' script simply includes all modules which implement
  1424. Xcommon container data structures; currently these are `array.q',
  1425. X`bag.q', `dict.q', `heap.q' and `set.q', see *Note Standard Types::. It
  1426. Xis also possible to load a single script such as `array.q' if you do
  1427. Xnot need the entire collection.
  1428. X
  1429. X* Menu:
  1430. X
  1431. X* Standard Functions::
  1432. X* Additional String Functions::
  1433. X* Expression Predicates::
  1434. X* Sorting Algorithms::
  1435. X* Standard Types::
  1436. X* Lambda Calculus::
  1437. X* List Comprehensions::
  1438. X* Streams::
  1439. X* Other Special Forms::
  1440. X* Mathematical Functions::
  1441. X* Graphics::
  1442. X* Lexicographic List Ordering::
  1443. X* Diagnostics and Error Messages::
  1444. X
  1445. X
  1446. XFile: qdoc.info,  Node: Standard Functions,  Next: Additional String Functions,  Prev: The Standard Library,  Up: The Standard Library
  1447. X
  1448. XStandard Functions
  1449. X==================
  1450. X
  1451. X   The `stdlib.q' script provides frequently used list operations and
  1452. Xother stuff mostly adopted from [Bird/Wadler 1988]. Here is a list of
  1453. Xthe operations provided by this module:
  1454. X
  1455. X`abs X'
  1456. X     absolute value of X
  1457. X
  1458. X`append Xs Y'
  1459. X     append a value `Y' to the list `Xs'
  1460. X
  1461. X`apply X Y'
  1462. X     apply function `X' to argument `Y'
  1463. X
  1464. X`applyq X Y'
  1465. X     quoted application
  1466. X
  1467. X`cat Xs'
  1468. X     concatenate a list of lists
  1469. X
  1470. X`compose X Y'
  1471. X     function composition: `compose X Y Z => X (Y Z)'
  1472. X
  1473. X`cons X Y'
  1474. X     construct a list node `[X|Y]'
  1475. X
  1476. X`consq X Y'
  1477. X     quoted list node
  1478. X
  1479. X`cst X'
  1480. X     constant-valued function: `cst X Y => X'
  1481. X
  1482. X`do F Xs'
  1483. X     apply a function `F' to each member of a list `Xs', return `()'
  1484. X
  1485. X`drop N Xs'
  1486. X     remove the first `N' elements from the list `Xs'
  1487. X
  1488. X`dropwhile P Xs'
  1489. X     remove elements from the beginning of `Xs' while the predicate `P'
  1490. X     is satisfied
  1491. X
  1492. X`each P Xs'
  1493. X     verify that each element of the list `Xs' satisfies the predicate
  1494. X     `P'
  1495. X
  1496. X`eq X Y'
  1497. X     syntactic equality (cf. *Note Non-Linear Equations and Syntactic
  1498. X     Equality::)
  1499. X
  1500. X`exist P Xs'
  1501. X     verify that the list `Xs' contains an element satisfying predicate
  1502. X     `P'
  1503. X
  1504. X`filter P Xs'
  1505. X     filter a list with a predicate
  1506. X
  1507. X`foldl F A Xs'
  1508. X     fold-left
  1509. X
  1510. X`foldl1 F Xs'
  1511. X     fold-left over nonempty lists
  1512. X
  1513. X`foldr F A Xs'
  1514. X     fold-right
  1515. X
  1516. X`foldr1 F Xs'
  1517. X     fold-right over nonempty lists
  1518. X
  1519. X`fst Xs'
  1520. X     return first element of a pair
  1521. X
  1522. X`genlist F P A'
  1523. X     generate the list of values `A', `F A', `F (F A)', ...  satisfying
  1524. X     a given predicate `P'
  1525. X
  1526. X`hd Xs'
  1527. X     return the first element of a list
  1528. X
  1529. X`id'
  1530. X     the identity function: `id X => X'
  1531. X
  1532. X`init Xs'
  1533. X     return list `Xs' without its last element
  1534. X
  1535. X`last Xs'
  1536. X     return the last element of a list
  1537. X
  1538. X`map F Xs'
  1539. X     apply function `F' to each member of a list
  1540. X
  1541. X`max X Y'
  1542. X     maximum of two values
  1543. X
  1544. X`min X Y'
  1545. X     minimum of two values
  1546. X
  1547. X`mklist X N'
  1548. X     create a list of `N' `X''s
  1549. X
  1550. X`neq X Y'
  1551. X     syntactic inequality
  1552. X
  1553. X`pair X Y'
  1554. X     construct a pair
  1555. X
  1556. X`pairq X Y'
  1557. X     quoted pair
  1558. X
  1559. X`pop Xs'
  1560. X     remove the first element from a list
  1561. X
  1562. X`prd Xs'
  1563. X     product of a list of numbers
  1564. X
  1565. X`push Xs X'
  1566. X     prepend an element to a list
  1567. X
  1568. X`range N M'
  1569. X     return a range of integers
  1570. X
  1571. X`repeat F P X'
  1572. X     repeat applying `F' to `X' (one or more times) until `P' is
  1573. X     satisfied
  1574. X
  1575. X`reverse Xs'
  1576. X     reverse a list
  1577. X
  1578. X`scan F A Xs'
  1579. X     apply `foldl' to every initial part of a list
  1580. X
  1581. X`scan1 F Xs'
  1582. X     apply `foldl1' to every nonempty initial part of a list
  1583. X
  1584. X`sgn X'
  1585. X     sign of a number
  1586. X
  1587. X`snd Xs'
  1588. X     return second element of a pair
  1589. X
  1590. X`sum Xs'
  1591. X     sum of a list of numbers
  1592. X
  1593. X`take N Xs'
  1594. X     select the first `N' elements from the list `Xs'
  1595. X
  1596. X`takewhile P Xs'
  1597. X     select elements from the beginning of `Xs' while the predicate `P'
  1598. X     is satisfied
  1599. X
  1600. X`tl Xs'
  1601. X     return the tail of a list
  1602. X
  1603. X`top Xs'
  1604. X     return the first element from a list
  1605. X
  1606. X`until P F X'
  1607. X     repeat applying `F' to `X' (zero or more times) until `P' is
  1608. X     satisfied
  1609. X
  1610. X`unzip Xs'
  1611. X     take a list of pairs into a pair of lists
  1612. X
  1613. X`value X'
  1614. X     return the value of a quoted expression
  1615. X
  1616. X`zip Xs'
  1617. X     take a pair of lists into a list of pairs of corresponding elements
  1618. X
  1619. X   Besides this, the `stdlib.q' script also overloads the `=' and `<>'
  1620. Xoperators with rules for deciding equality/inequality of lists, tuples
  1621. Xand truth values.
  1622. X
  1623. X
  1624. XFile: qdoc.info,  Node: Additional String Functions,  Next: Expression Predicates,  Prev: Standard Functions,  Up: The Standard Library
  1625. X
  1626. XAdditional String Functions
  1627. X===========================
  1628. X
  1629. X   The `string.q' script provides a collection of additional string
  1630. Xfunctions. Currently the following operations are implemented:
  1631. X
  1632. X`chars S'
  1633. X     return the list of individual characters in `S'
  1634. X
  1635. X`join DELIM Xs'
  1636. X     concatenate a list of strings, interpolating the given `DELIM'
  1637. X     string between each pair of consecutive strings in the list
  1638. X
  1639. X`split DELIM S'
  1640. X     split a string into a list of substrings delimited by characters
  1641. X     in the given `DELIM' string
  1642. X
  1643. X`strcat Xs'
  1644. SHAR_EOF
  1645. true || echo 'restore of q-1.7/qdoc.info failed'
  1646. fi
  1647. echo 'End of  part 12'
  1648. echo 'File q-1.7/qdoc.info is continued in part 13'
  1649. echo 13 > _shar_seq_.tmp
  1650. exit 0
  1651.  
  1652.