|
|
1.1 ! root 1: .so tmac.tr ! 2: .de Ta ! 3: .ta .8i +.8i +.8i +.8i +.8i +.8i +.8i ! 4: .. ! 5: .de Px ! 6: .ta 3.5i ! 7: .. ! 8: .ds CF \s10- \\n(PN - \s0 ! 9: .de Ap ! 10: .bp ! 11: .ce 10 ! 12: \f3\\$1\f1 ! 13: .ce 0 ! 14: .sp 2 ! 15: .if !''\\$2' 'so \\$2 ! 16: .. ! 17: .TR 86-10a ! 18: .DA "June 8, 1986" ! 19: .Gr ! 20: .TL ! 21: Version 6.0 of Icon ! 22: .AU ! 23: Ralph E. Griswold ! 24: William H. Mitchell ! 25: Janalee O'Bagy ! 26: .AE ! 27: .tr *\(** ! 28: .NH ! 29: Background ! 30: .PP ! 31: Different versions of the Icon programming language are identified by numbers. The first, ! 32: Version 1, was superceded by Version 2. Starting with Version 3, the ! 33: implementation of Icon was completely changed. While Version 2 is still ! 34: in use on some computers, Version 5 is by far the mostly widely ! 35: used version of Icon. ! 36: The features of Version 5 are described in the ``Icon book'' [1]. ! 37: Since this book is the only complete and generally available description ! 38: of a widely used version of Icon, Version 5 is sometimes called ! 39: ``standard Icon''. ! 40: .PP ! 41: Since Icon is the byproduct of a research effort that ! 42: is concerned with the development of novel programming language ! 43: features, ! 44: some extensions to the standard language are inevitable. ! 45: These extensions are incorporated as features of new releases of ! 46: the implementation. ! 47: These releases are identified by minor version numbers that are separated ! 48: from the major version number by a decimal point. For example, Version 5.10 ! 49: is the tenth minor revision of Version 5. ! 50: .PP ! 51: Because of the relationship between language design and implementation, ! 52: major version numbers usually contain significant language changes ! 53: that have accumulated over a number of minor revisions, while minor ! 54: version numbers primarily reflect implementation changes. ! 55: .PP ! 56: Recently an implementation of Icon written almost entirely in C has ! 57: been completed. This implementation is so different from previous ! 58: ones that some designation is needed to distinguish it from other ! 59: implementations. It therefore has been designated Version 6. ! 60: Despite the change in major version number, the Version 6.0 ! 61: language is nearly the same as the Version 5.10 language and ! 62: the Version 5 book continues to serve as the primary reference ! 63: for Version 6. ! 64: Since a revision of a book is a major and time-consuming process, ! 65: this report is provided to supplement the present Icon book. ! 66: Together, the book and this report provide a description of ! 67: Version 6.0. ! 68: .PP ! 69: Most of the language extensions in Version 6.0 are upward-compatible with ! 70: Version 5 and almost all programs that contain only standard Version 5 ! 71: features work properly under Version 6.0. ! 72: However, some of the more implementation-dependent aspects described ! 73: in the Version 5 book are now obsolete and there are significant new ! 74: language features. ! 75: .NH ! 76: Features of Version 6.0 ! 77: .PP ! 78: Version 6.0 extensions consist of a declaration to facilitate the use ! 79: of Icon procedure libraries, a new set data type, new options for sorting ! 80: tables, new syntax to support the use of co-expressions in programmer-defined ! 81: control operations, the invocation of functions and operators by their ! 82: string names, and a few new functions. ! 83: .NH 2 ! 84: The Link Declaration ! 85: .PP ! 86: The link declaration simplifies the inclusion of ! 87: separately translated libraries of Icon procedures. If \*Micont\fR [2] is run ! 88: with the \*M\-c\fR option, source files are translated into intermediate ! 89: \fIucode\fR files (with names ending in \*M.u1\fR and \*M.u2\fR). ! 90: For example, ! 91: .Ds ! 92: icont -c libe.icn ! 93: .De ! 94: produces the ucode files \*Mlibe.u1\fR and \*Mlibe.u2\fR. The ucode files ! 95: can be incorporated in another program with the new link ! 96: declaration, which has the form ! 97: .Ds ! 98: link libe ! 99: .De ! 100: The argument of \*Mlink\fR is, in general, a list of identifiers or ! 101: string literals that specify the names of files to be linked (without ! 102: the \*M.u1\fR or \*M.u2\fR). Thus, when running under \*U, ! 103: .Un ! 104: .Ds ! 105: link libe, "/usr/icon/ilib/collate" ! 106: .De ! 107: specifies the linking of \*Mlibe\fR in the current directory and ! 108: \*Mcollate\fR in \*M/usr/icon/ilib\fR. ! 109: The syntax for paths may be different for other operating systems. ! 110: .PP ! 111: The environment variable \*MIPATH\fR controls the location of files ! 112: specified in link declaratinos. The value of \*MIPATH\fR should be a ! 113: blank-separated string\s-2\u1\d\s0 ! 114: .FS ! 115: \s-2\u1\d\s0\^The separator is a colon for UNIX systems under Versions 5.9 and ! 116: 5.10. ! 117: .FE ! 118: of the form \fIp\^\*(sd1\*(su\^\0\^p\^\*(sd2\*(su\0 \*(El p\^\*(sdn\*(su\fR where each ! 119: \fIp\^\*(sdi\*(su\fR names a directory. ! 120: Each directory is searched in turn to locate files named in link ! 121: declarations. The default value of \*MIPATH\fR is the ! 122: current directory. ! 123: .NH 2 ! 124: Sets ! 125: .PP ! 126: Sets are unordered collections of values and have many of the properties normally ! 127: associated with sets in the mathematical sense. ! 128: The function ! 129: .Ds ! 130: set(a) ! 131: .De ! 132: creates a set that contains the distinct elements of the list \*Ma\fR. For ! 133: example, ! 134: .Ds ! 135: set(\^["abc",\*b3]) ! 136: .De ! 137: creates a set with two members, \*Mabc\fR and 3. ! 138: Note that ! 139: .Ds ! 140: set(\^[\^]) ! 141: .De ! 142: creates an empty set. ! 143: Sets, like ! 144: other data aggregates in Icon, need not be homogeneous \(em a set ! 145: may contain members of different types. ! 146: .PP ! 147: Sets, like other Icon data aggregates, are represented by pointers to ! 148: the actual data. Sets can be members of sets, as in ! 149: .Ds ! 150: s1 := set(\^[1,\*b2,\*b3]) ! 151: s2 := set(\^[s1,\*b\^[\^]]) ! 152: .De ! 153: in which \*Ms2\fR contains two members, one of which is a set of three ! 154: members and the other of which is an empty list. ! 155: .PP ! 156: Any specific value can occur only once in a set. For example, ! 157: .Ds ! 158: set(\^[1,\*b2,\*b3,\*b3,\*b1]) ! 159: .De ! 160: creates a set with the three members 1, 2, and 3. ! 161: Set membership is determined the same way the equivalence of ! 162: values is determined in the operation ! 163: .Ds ! 164: x === y ! 165: .De ! 166: For example, ! 167: .Ds ! 168: set(\^[\^[\^],\*b\^[\^]]) ! 169: .De ! 170: creates a set that contains two distinct empty lists. ! 171: .PP ! 172: Several set operations are provided. The function ! 173: .Ds ! 174: member(s,\*bx) ! 175: .De ! 176: succeeds and returns the value of \*Mx\fR if \*Mx\fR is a member of ! 177: \*Ms\fR, but fails otherwise. Note that ! 178: .Ds ! 179: member(s1,\*bmember(s2,\*bx)) ! 180: .De ! 181: succeeds if \*Mx\fR is a member of both \*Ms1\fR and \*Ms2\fR. ! 182: .PP ! 183: The function ! 184: .Ds ! 185: insert(s,\*bx) ! 186: .De ! 187: inserts \*Mx\fR into the set \*Ms\fR and returns the value of \*Ms\fR. ! 188: Note that \*Minsert(s,\*bx)\fR is similar to \*Mput(a,\*bx)\fR in form. ! 189: A set may contain (a pointer to) itself: ! 190: .Ds ! 191: insert(s,\*bs) ! 192: .De ! 193: adds \*Ms\fR as an member of itself. ! 194: .PP ! 195: The function ! 196: .Ds ! 197: delete(s,\*bx) ! 198: .De ! 199: deletes the member \*Mx\fR from the set \*Ms\fR and returns the ! 200: value of \*Ms\fR. ! 201: .PP ! 202: The functions \*Minsert(s,\*bx)\fR and \*Mdelete(s,\*bx)\fR always ! 203: succeed, whether or not \*Mx\fR is in \*Ms\fR. This allows their ! 204: use in loops ! 205: in which failure may occur for other reasons. For example, ! 206: .Ds ! 207: s := set(\^[\^]) ! 208: while insert(s,\*bread()) ! 209: .De ! 210: builds a set that consists of the (distinct) lines from the standard ! 211: input file. ! 212: .PP ! 213: The operations ! 214: .Ds ! 215: s1 ++ s2 ! 216: s1 ** s2 ! 217: s1 -\^- s2 ! 218: .De ! 219: create the union, intersection, and difference of \*Ms1\fR and \*Ms2\fR, ! 220: respectively. In each case, the result is a new set. ! 221: .PP ! 222: The use of these operations on csets is unchanged. There is no ! 223: automatic type conversion between csets and sets; the result of the ! 224: operation depends on the types of the arguments. For example, ! 225: .Ds ! 226: \&'aeiou' ++ 'abcde' ! 227: .De ! 228: produces ! 229: the cset \*M\(fmabcdeiou\(fm\fR, while ! 230: .Ds ! 231: set(\^[1,\*b2,\*b3]) ++ set(\^[2,\*b3,\*b4]) ! 232: .De ! 233: produces a set that contains 1, 2, 3, and 4. On the other hand, ! 234: .Ds ! 235: set(\^[1,\*b2,\*b3]) ++ 4 ! 236: .De ! 237: results in Run-time Error 119 (\*Mset expected\fR). ! 238: .PP ! 239: The functions and operations of Icon that apply to other data aggregates ! 240: apply to sets as well. For example, if \*Ms\fR is a set, ! 241: .Ds ! 242: *s ! 243: .De ! 244: is the size of \*Ms\fR (the number of members in it). Similarly, ! 245: .Ds ! 246: type(s) ! 247: .De ! 248: produces the string \*Mset\fR. ! 249: The string images of sets are in the ! 250: same style as for other aggregates, with the size enclosed in ! 251: parentheses. Therefore, ! 252: .Ds ! 253: s := set(\^["abc",\*b3]) ! 254: write(image(s)) ! 255: .De ! 256: writes \*Mset(2)\fR. ! 257: .PP ! 258: The operation ! 259: .Ds ! 260: !s ! 261: .De ! 262: generates the members of \*Ms\fR, but in no predictable order. Similarly, ! 263: .Ds ! 264: ?s ! 265: .De ! 266: produces a randomly selected member of \*Ms\fR. ! 267: These operations produce values, not variables \(em it is not possible ! 268: to assign a value to \*M!s\fR or \*M?s\fR. ! 269: .PP ! 270: The function ! 271: .Ds ! 272: copy(s) ! 273: .De ! 274: produces a new set, distinct from \*Ms\fR, but which contains the same ! 275: members as \*Ms\fR. The copy is made in the same fashion as the copy ! 276: of a list \(em the members themselves are not copied. ! 277: .PP ! 278: The function ! 279: .Ds ! 280: sort(s) ! 281: .De ! 282: produces a list containing the members of \*Ms\fR in sorted order. ! 283: Sets occur after tables but before records in Icon's collating sequence. ! 284: .SH ! 285: Examples ! 286: .a ! 287: .LP ! 288: \fIWord Counting:\fR ! 289: .PP ! 290: The following program lists, in alphabetical order, all the different ! 291: words that occur in standard input: ! 292: .Ds ! 293: .Px ! 294: procedure main() ! 295: letter := &lcase ++ &ucase ! 296: words := set(\^[\^]) ! 297: while text := read() do ! 298: text ? while tab(upto(letter)) do ! 299: insert(words,\*btab(many(letter))) ! 300: every write(!sort(words)) ! 301: end ! 302: .De ! 303: .LP ! 304: \fIThe Sieve of Eratosthenes:\fR ! 305: .PP ! 306: The follow program produces prime numbers, using the classical ``Sieve of ! 307: Eratosthenes'': ! 308: .Ds ! 309: .Px ! 310: procedure main() ! 311: local limit, s, i ! 312: limit := 5000 ! 313: s := set(\^[]) ! 314: every insert(s,\*b1 to limit) ! 315: every member(s,\*bi := 2 to limit) do ! 316: every delete(s,\*bi + i to limit by i) ! 317: primes := sort(s) ! 318: write("There are ",\*b*primes,\*b" primes in the first ",\*blimit,\*b" integers.") ! 319: write("The primes are:") ! 320: every write(right(!primes,\*b*limit + 1)) ! 321: end ! 322: .De ! 323: .NH 2 ! 324: Sorting Tables ! 325: .PP ! 326: Two new options are available for sorting tables. These options are specified by ! 327: the values 3 and 4 as the second argument of \*Msort(t,\*bi)\fR. ! 328: Both of these options produce a single list in which the entry values and ! 329: assigned values of table elements alternate. A value of 3 for \*Mi\fR ! 330: produces a list in which the entry values are in sorted order, and ! 331: a value of 4 produces a list in which the assigned values are in sorted ! 332: order. For example, if the table \*Mwcount\fR contains elements whose entry values are ! 333: words and whose corresponding assigned values are counts, the following ! 334: code segment writes out a list of the words and their counts, with the ! 335: words in alphabetical order: ! 336: .Ds ! 337: a := sort(wcount,\*b3) ! 338: every i := 1 to *a - 1 by 2 do ! 339: write(a\^[i]," : ",a\^[i + 1]) ! 340: .De ! 341: .PP ! 342: The main advantage of the new sorting options is that they only produce ! 343: a single list, rather than a list of lists as produced by the options ! 344: 1 and 2. The amount of space needed for the single list is proportionally much less ! 345: than for the list of lists. ! 346: .NH 2 ! 347: Programmer-Defined Control Operations ! 348: .PP ! 349: As described in [3], co-expressions can be used to provide programmer-defined ! 350: control operations. Version 6.0 provides support for this facility by means ! 351: of an alternative syntax for procedure invocation in which the arguments ! 352: are passed in a list of co-expressions. This syntax uses braces ! 353: in place of parentheses: ! 354: .Ds ! 355: p{\*1, \*2, \*(El, \*n} ! 356: .De ! 357: is equivalent to ! 358: .Ds ! 359: p(\^[create \*1, create \*2, \*(El, create \*n]) ! 360: .De ! 361: Note that ! 362: .Ds ! 363: p{\^} ! 364: .De ! 365: is equivalent to ! 366: .Ds ! 367: p(\^[\^\^]) ! 368: .De ! 369: .NH 2 ! 370: Invocation By String Name ! 371: .PP ! 372: A string-valued expression that corresponds to the ! 373: name of a procedure or operation can be used in place of the ! 374: procedure or operation in an invocation expression. For example, ! 375: .Ds ! 376: "image"(x) ! 377: .De ! 378: produces the same call as ! 379: .Ds ! 380: image(x) ! 381: .De ! 382: and ! 383: .Ds ! 384: "-"(i,\*bj) ! 385: .De ! 386: is equivalent to ! 387: .Ds ! 388: i - j ! 389: .De ! 390: .PP ! 391: In the case of operator symbols with unary and binary forms, the number of arguments determines ! 392: the operation. Thus ! 393: .Ds ! 394: "-"(i) ! 395: .De ! 396: is equivalent to ! 397: .Ds ! 398: -i ! 399: .De ! 400: Since \*Mto-by\fR is an operation, despite its reserved-word syntax, ! 401: it is included in this facility with the string name \*M"..."\fR . ! 402: Thus ! 403: .Ds ! 404: "..."(1,\*b10,\*b2) ! 405: .De ! 406: is equivalent to ! 407: .Ds ! 408: 1 to 10 by 2 ! 409: .De ! 410: Similarly, range specifications are represented by \*M":"\fR, so that ! 411: .Ds ! 412: ":"(s,\*bi,\*bj) ! 413: .De ! 414: is equivalent to ! 415: .Ds ! 416: s\^[i:j] ! 417: .De ! 418: .PP ! 419: Defaults are not provided for omitted or null-valued arguments in this ! 420: facility. Consequently, ! 421: .Ds ! 422: "..."(1,\*b10) ! 423: .De ! 424: results in a run-time error when it is evaluated. ! 425: .PP ! 426: The subscripting operation is available with the string name ! 427: \*M"[\^\^]"\fR. Thus ! 428: .Ds ! 429: "[\^\^]"(&lcase,\*b3) ! 430: .De ! 431: produces \*Mc\fR. ! 432: .PP ! 433: Arguments to operators invoked by string names are dereferenced. Consequently, ! 434: string invocation for assignment operations is ineffective and results ! 435: in error termination. ! 436: .PP ! 437: String names are available for the operations in Icon, but not for ! 438: control structures. Thus ! 439: .Ds ! 440: "|"(\*1,\*b\*2) ! 441: .De ! 442: is erroneous. ! 443: Note that string scanning is a control structure. ! 444: .PP ! 445: Field references, of the form ! 446: .Ds ! 447: \*0 . \fIfieldname\fR ! 448: .De ! 449: are not operations in the ordinary sense and are not available ! 450: via string invocation. ! 451: In addition, conjunction is not available via string invocation, since ! 452: no operation is actually performed. ! 453: .PP ! 454: String names for procedures are available through global identifiers. ! 455: Note that the names of functions, such as \*Mimage\fR, are global ! 456: identifiers. Similarly, any procedure-valued global identifier may be ! 457: used as the string name of a procedure. Thus in ! 458: .Ds ! 459: global q ! 460: ! 461: procedure main() ! 462: q := p ! 463: "q"("hi") ! 464: end ! 465: ! 466: procedure p(s) ! 467: write(s) ! 468: end ! 469: .De ! 470: the procedure \*Mp\fR is invoked via the global identifier \*Mq\fR. ! 471: .NH 2 ! 472: New Functions ! 473: .PP ! 474: The function \*Mproc(x,\*bi)\fR ! 475: converts \*Mx\fR to a procedure, if possible. ! 476: If \*Mx\fR is procedure-valued, its value is returned unchanged. If the ! 477: value of \*Mx\fR is a string that corresponds to the name of a procedure ! 478: as described in the preceding section, the corresponding procedure ! 479: value is returned. ! 480: The value of \*Mi\fR is used to distinguish between ! 481: unary and binary operators. ! 482: For example, \*Mproc("*",\*b2)\fR produces the multiplication operator, while ! 483: \*Mproc("*",\*b1)\fR produces the size operator. ! 484: The default value for \*Mi\fR is 1. ! 485: If \*Mx\fR cannot be converted to a procedure, \*Mproc(x,\*bi)\fR fails. ! 486: .PP ! 487: The function \*Mseq(i,\*bj)\fR generates an infinite sequence of ! 488: integers starting at \*Mi\fR with increments of \*Mj\fR. An omitted ! 489: or null-valued argument defaults to 1. For example, ! 490: \*Mseq()\fR generates 1, 2, 3, \*(El . ! 491: .PP ! 492: Storage is allocated automatically during the ! 493: execution of an Icon program, and garbage collections ! 494: are performed automatically to reclaim storage for subsequent ! 495: reallocation. Garbage collection normally only occurs when ! 496: it is necessary. Garbage collection can be forced by the ! 497: function ! 498: \*Mcollect()\fR. ! 499: .br ! 500: .ne 1.5i ! 501: .NH 2 ! 502: Minor Language Changes ! 503: .PP ! 504: There are two minor language changes: ! 505: .RS ! 506: .IP \(bu 4n ! 507: The keyword \*M&options\fR of Version 5.10 is not present in Version 6.0. ! 508: .IP \(bu ! 509: Version 6.0 reads the last line of a file, even if that line does ! 510: not end with a newline; Version 5 discards such a line. ! 511: .RE ! 512: .NH 2 ! 513: Version Checking ! 514: .PP ! 515: The Icon translator converts a source-language program to an ! 516: intermediate form, called \fIucode\fR. The Icon linker converts ! 517: one or more ucode files to a binary form called \fIicode\fR. The ! 518: format of Version 6.0 ucode and icode files is different from ! 519: that of earlier versions. ! 520: To avoid the possibility of malfunction ! 521: due to incompatible ucode and icode formats, Version 6.0 checks ! 522: both ucode and icode files and terminates processing with an ! 523: error message if the versions are not correct. ! 524: .NH ! 525: Obsolete and Changed Features of Version 5 ! 526: .PP ! 527: The original implementation of Version 5 supported both a compiler (\*Miconc\fR) ! 528: and an interpreter (\*Micont\fR). ! 529: Version 6.0 supports only ! 530: an interpreter. Interpretation is only slightly slower than the execution ! 531: of compiled code and the interpreter is portable and gets into ! 532: execution much more quickly than the compiler. However, it is not ! 533: possible to load C functions with the interpreter as it was with the compiler. ! 534: A system for ! 535: personalized interpreters [4] is included with Version 6.0 for UNIX systems to ! 536: make it comparatively easy to add new functions and otherwise modify the Icon run-time system. ! 537: .PP ! 538: Some run-time environment variables have changed; see Appendix A. ! 539: A number of error messages have been changed. ! 540: Appendix B contains a list of run-time error messages. ! 541: .sp -1 ! 542: .NH ! 543: Known Bugs in Version 6.0 ! 544: .PP ! 545: .RS ! 546: .IP \(bu ! 547: The translator does not detect arithmetic overflow in conversion of ! 548: numeric literals. Very large numeric literals may have incorrect values. ! 549: .IP \(bu ! 550: Integer overflow on multiplication and exponentiation is not detected ! 551: during execution. ! 552: Such overflow may occur during type conversion. ! 553: .IP \(bu ! 554: Line numbers may be wrong in diagnostic messages related to lines with continued ! 555: quoted literals. ! 556: .IP \(bu ! 557: In some cases, trace messages may show the return of subscripted ! 558: values, such as \*M&null\^[2]\fR, that would be erroneous if they were ! 559: dereferenced. ! 560: .IP \(bu ! 561: If a long file name for an Icon source-language program is truncated by ! 562: the operating system, ! 563: mysterious diagnostic ! 564: messages may occur during linking. ! 565: .IP \(bu ! 566: Stack overflow is checked using a heuristic that may not always be effective. ! 567: .IP \(bu ! 568: If an expression such as ! 569: .Ds ! 570: \*Mx := create \*0 ! 571: .De ! 572: is used in a loop, and ! 573: \*Mx\fR is not a global variable, unreferenceable co-expressions are ! 574: generated by each successive \*Mcreate\fR operation. ! 575: These co-expressions are not ! 576: garbage collected. This problem can be circumvented ! 577: by making \*Mx\fR a global variable or by assigning a value to \*Mx\fR before ! 578: the \*Mcreate\fR operation, as in ! 579: .Ds ! 580: x := &null ! 581: x := create \*0 ! 582: .De ! 583: .IP \(bu ! 584: Stack overflow in a co-expression may not ! 585: be detected ! 586: and may cause mysterious program malfunction. ! 587: .IP \(bu ! 588: Co-expressions were designed to support coroutine programming ! 589: as well as the more usual application for the controlled production ! 590: of the results of a generator. ! 591: However, the implementation is not sufficiently general to support ! 592: coroutines. In Version 5, the use of co-expressions in a coroutine ! 593: fashion could produce program malfunction. In Version 6.0, such uses ! 594: are prevented and cause error termination. As a consequence, some uses of co-expressions that ! 595: worked in Version 5 may not work in Version 6.0. In particular, the ! 596: example in Section 13.4.2 of the Icon book does not work in ! 597: Version 6.0. ! 598: .IP \(bu ! 599: The garbage collector was designed for machines with comparatively small ! 600: address spaces and may not perform well for computers with very large ! 601: address spaces. ! 602: In particular, if ! 603: an attempt is made to create a very large data object that will ! 604: not fit into memory (such as a million-element list), it takes ! 605: an inordinately long time to determine that the object can ! 606: not be allocated. ! 607: .RE ! 608: .NH ! 609: Possible Differences Among Version 6.0 Implementations ! 610: .PP ! 611: Version 6.0 of Icon is written almost entirely in C and most of its ! 612: features are machine-independent. Appendix B of the Icon book lists ! 613: differences that may occur because of different machine architectures. ! 614: In addition to the differences listed there, the implementation of ! 615: sets and tables uses a parameter that is different for 16- and 32-bit ! 616: computers. This parameter determines how set members and table elements ! 617: are physically stored as a result of hashing. The difference only is ! 618: noticeable in the results produced by \*M!x\fR and \*M?x\fR, where ! 619: \*Mx\fR is a set or a table. ! 620: .PP ! 621: A few aspects of the implementation of Version 6.0 are specific to ! 622: different computer architectures and operating systems. Co-expressions ! 623: require a context switch that is implemented in assembly language. ! 624: If this context switch is not implemented, an attempt to activate a ! 625: co-expression results in error termination. ! 626: Arithmetic overflow checking also generally requires assembly-language ! 627: routines and may not be supported on some implementations of Version 6.0. ! 628: .PP ! 629: Some features of Icon, such as opening a pipe for i/o and the \*Msystem\fR function, ! 630: are closely related to UNIX. These features should work correctly ! 631: for Version 6.0 running on UNIX systems, but they may not be supported ! 632: on other operating systems. ! 633: .SH ! 634: Acknowledgements ! 635: .PP ! 636: In addition to the authors of this report, several persons contributed to ! 637: the implementation of Version 6.0 of Icon. ! 638: The implementation of sets and the new sorting options were done by Rob McConeghy. ! 639: Other major contributors include Gregg Townsend, Chris Janton, and ! 640: Kelvin Nilsen. ! 641: .SH ! 642: References ! 643: .LP ! 644: 1. Griswold, Ralph E. and Madge T. Griswold. \fIThe Icon Programming ! 645: Language\fR, Prentice-Hall, Inc., Englewood Cliffs, New Jersey. 1983. ! 646: .LP ! 647: 2. Griswold, Ralph E. \fIICONT(1)\fR, ! 648: manual page for \fIUNIX Programmer's Manual\fR, Department of Computer ! 649: Science, The University of Arizona. May 1986. ! 650: .LP ! 651: 3. Griswold, Ralph E. and Michael Novak. ``Programmer-Defined Control ! 652: Operations'', \fIThe Computer Journal\fR, Vol. 26, No. 2 (May 1983). ! 653: .LP ! 654: 4. Griswold, Ralph E. \fIPersonalized Interpreters for Version 6.0 of Icon\fR, ! 655: Technical Report TR 86-12, Department of Computer Science, The University of ! 656: Arizona. May 1985. ! 657: .Ap "Appendix A \(em Environment Variables" ! 658: .sp ! 659: .PP ! 660: There are a number of environment variables that can be set to ! 661: override the default values for sizes of Icon's storage regions ! 662: and other run-time parameters. These environment variables are: ! 663: .RS ! 664: .IP \*MTRACE\fR 1i ! 665: The initial value of \*M&trace\fR. The default value is zero. ! 666: .IP \*MNBUFS\fR ! 667: The number of input-output buffers. ! 668: The default value is 10 for computers with large address spaces and ! 669: 5 for computers with small address spaces. ! 670: .IP \*MNOERRBUF\fR ! 671: No buffering of standard error output. ! 672: .IP \*MICONCORE\fR ! 673: Produce a core dump in the case of error termination. ! 674: .IP \*MMSTKSIZE\fR ! 675: The size in words of the main interpreter stack. The default value is ! 676: 10000 for machines with large address spaces and 3000 for machines ! 677: with small address spaces. ! 678: .IP \*MSTRSIZE\fR ! 679: The initial size in bytes of the allocated string region. The default value is ! 680: 51200 for machines with large address spaces and 10240 for machines ! 681: with small address spaces. ! 682: .IP \*MHEAPSIZE\fR ! 683: The initial size in bytes of the allocated block region. The default value is ! 684: 51200 for machines with large address spaces and 10240 for machines ! 685: with small address spaces. ! 686: .IP \*MSTATSIZE\fR ! 687: The initial size in bytes of the static region in which co-expressions are ! 688: allocated. The default value is 20480 for machines with large ! 689: address spaces and 1024 for machines with small address spaces. ! 690: .IP \*MSTATINCR\fR ! 691: The increment for expanding the static region. The default increment ! 692: is one-fourth the initial size of the static region. ! 693: .IP \*MCOEXPSIZE\fR ! 694: The size in words of co-expression blocks. The default value is 2000 for ! 695: machines with large address spaces and 1000 for machines with ! 696: small address spaces. ! 697: .RE ! 698: .Ap "Appendix B \(em Run-Time Error Messages" ! 699: .sp 2 ! 700: .DS ! 701: .ft R ! 702: .ta .8i ! 703: 101 integer expected ! 704: 102 numeric expected ! 705: 103 string expected ! 706: 104 cset expected ! 707: 105 file expected ! 708: 106 procedure or integer expected ! 709: 107 record expected ! 710: 108 list expected ! 711: 109 string or file expected ! 712: 110 string or list expected ! 713: 111 variable expected ! 714: 112 invalid type to size operation ! 715: 113 invalid type to random operation ! 716: 114 invalid type to subscript operation ! 717: 115 list or table expected ! 718: 116 invalid type to element generator ! 719: 117 missing main procedure ! 720: 118 co-expression expected ! 721: 119 set expected ! 722: ! 723: 201 division by zero ! 724: 202 remaindering by zero ! 725: 203 integer overflow ! 726: 204 real overflow underflow or division by zero ! 727: 205 value out of range ! 728: 206 negative first operand to real exponentiation ! 729: 207 invalid field name ! 730: 208 second and third arguments to map of unequal length ! 731: 209 invalid second argument to open ! 732: 210 argument to system function too long ! 733: 211 by clause equal to zero ! 734: 212 attempt to read file not open for reading ! 735: 213 attempt to write file not open for writing ! 736: 214 recursive co-expression activation ! 737: ! 738: 301 interpreter stack overflow ! 739: 302 C stack overflow ! 740: 303 unable to expand memory region ! 741: 304 memory region size changed ! 742: .DE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.