Annotation of researchv10dc/cmd/icon/docs/tr86-10.roff, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.