|
|
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 84-10a ! 18: .DA "June 27, 1984; Revised August 4, 1984" ! 19: .Gr ! 20: .TL ! 21: Extensions to Version 5 of the Icon Programming Language ! 22: .AU ! 23: Ralph E. Griswold ! 24: .AU ! 25: Robert K. McConeghy ! 26: .AU ! 27: William H. Mitchell ! 28: .AE ! 29: .tr *\(** ! 30: .NH ! 31: Introduction ! 32: .PP ! 33: The standard features of Version 5 of Icon are described in ! 34: Reference 1. Since Icon is the byproduct of a research effort that ! 35: is concerned with the development of novel programming language ! 36: facilities for processing nonnumeric data, it is inevitable that ! 37: some extensions to the standard language will develop. ! 38: .PP ! 39: Some of these extensions are incorporated as features of new releases. ! 40: Others are available as options that can be selected when the Icon ! 41: system is installed [2]. This report describes the extensions that are included in ! 42: Version 5.9 of Icon. ! 43: .PP ! 44: All the extensions are upward-compatible with standard Version 5 Icon. ! 45: Their inclusion should not interfere with any program that works ! 46: properly under the standard version. ! 47: .NH ! 48: New Version 5.9 Features ! 49: .NH 2 ! 50: The Link Directive ! 51: .PP ! 52: Version 5.9 contains a link directive that simplifies the inclusion of ! 53: separately translated libraries of Icon procedures. If \fIicont(1)\fR [3] is run ! 54: with the \*M\-c\fR option, source files are translated into intermediate ! 55: \fIucode\fR files (with names ending in \*M.u1\fR and \*M.u2\fR). ! 56: For example, ! 57: .Ds ! 58: icont -c libe.icn ! 59: .De ! 60: produces the ucode files \*Mlibe.u1\fR and \*Mlibe.u2\fR. The ucode files ! 61: can be incorporated in another program with the new link ! 62: directive, which has the form ! 63: .Ds ! 64: link libe ! 65: .De ! 66: The argument of \*Mlink\fR is, in general, a list of identifiers or ! 67: string literals that specify the names of files to be linked (without ! 68: the \*M.u1\fR or \*M.u2\fR). Thus ! 69: .Ds ! 70: link libe, "/usr/icon/ilib/collate" ! 71: .De ! 72: specifies the linking of \*Mlibe\fR in the current directory and ! 73: \*Mcollate\fR in \*M/usr/icon/ilib\fR. ! 74: .PP ! 75: The environment variable \fIIPATH\fR controls the location of files ! 76: specified in link directives. \fIIPATH\fR should be have a value ! 77: of the form \fIp1:p2: .\^.\^. pn\fR where each \fIpi\fR names a directory. ! 78: Each directory is searched in turn to locate files named in link ! 79: directives. The default value of \fIIPATH\fR is `.', that is, the ! 80: current directory. ! 81: .NH 2 ! 82: Installation Options ! 83: .PP ! 84: When an Icon system is installed, various configuration options ! 85: are specified [2]. The value of the keyword \*M&options\fR is ! 86: a string that contains the command line arguments that were used ! 87: to configure Icon. ! 88: .NH ! 89: Optional Extensions ! 90: .PP ! 91: There are two extension options: sets (\*M\-sets\fR in \*M&options\fR), ! 92: and a collection of experimental features (\*M\-xpx\fR in \*M&options\fR). ! 93: .NH 2 ! 94: Sets ! 95: .PP ! 96: Sets are unordered collections of values and have the properties normally ! 97: associated with sets in the mathematical sense. ! 98: The function ! 99: .Ds ! 100: set(a) ! 101: .De ! 102: creates a set that contains the distinct elements of the list \*Ma\fR. For ! 103: example, ! 104: .Ds ! 105: set(\^["abc",\*b3]) ! 106: .De ! 107: creates a set with two members, \*Mabc\fR and 3. ! 108: Note that ! 109: .Ds ! 110: set(\^[\^]) ! 111: .De ! 112: creates an empty set. ! 113: Sets, like ! 114: other data aggregates in Icon, need not be homogeneous \(em a set ! 115: may contain members of different types. ! 116: .PP ! 117: Sets, like other Icon data aggregates, are represented by pointers to ! 118: the actual data. Sets can be members of sets, as in ! 119: .Ds ! 120: s1 := set(\^[1,\*b2,\*b3]) ! 121: s2 := set(\^[s1,\*b\^[\^]]) ! 122: .De ! 123: in which \*Ms2\fR contains two members, one of which is a set of three ! 124: members and the other of which is an empty list. ! 125: .PP ! 126: Any specific value can occur only once in a set. For example, ! 127: .Ds ! 128: set(\^[1,\*b2,\*b3,\*b3,\*b1]) ! 129: .De ! 130: creates a set with the three members 1, 2, and 3. ! 131: Set membership is determined the same way the equivalence of ! 132: values is determined in the operation ! 133: .Ds ! 134: x === y ! 135: .De ! 136: For example, ! 137: .Ds ! 138: set(\^[\^[\^],\*b\^[\^]]) ! 139: .De ! 140: creates a set that contains two distinct empty lists. ! 141: .PP ! 142: The functions and operations of Icon that apply to other data aggregates ! 143: apply to sets as well. For example, if \*Ms\fR is a set, ! 144: .Ds ! 145: *s ! 146: .De ! 147: is the size of \*Ms\fR (the number of members in it). Similarly, ! 148: .Ds ! 149: type(s) ! 150: .De ! 151: produces the string \*Mset\fR and ! 152: .Ds ! 153: s := set(\^["abc",\*b3]) ! 154: write(image(s)) ! 155: .De ! 156: writes \*Mset(2)\fR. Note that the string images of sets are in the ! 157: same style as for other aggregates, with the size enclosed in ! 158: parentheses. ! 159: .PP ! 160: The operation ! 161: .Ds ! 162: !s ! 163: .De ! 164: generates the members of \*Ms\fR, but in no predictable order. Similarly, ! 165: .Ds ! 166: ?s ! 167: .De ! 168: produces a randomly selected member of \*Ms\fR. ! 169: These operations produce values, not variables \(em it is not possible ! 170: to assign a value to \*M!s\fR or \*M?s\fR. ! 171: .PP ! 172: The function ! 173: .Ds ! 174: copy(s) ! 175: .De ! 176: produces a new set, distinct from \*Ms\fR, but which contains the same ! 177: members as \*Ms\fR. The copy is made in the same fashion as the copy ! 178: of a list \(em the members themselves are not copied. ! 179: .PP ! 180: The function ! 181: .Ds ! 182: sort(s) ! 183: .De ! 184: produces a list containing the members of \*Ms\fR in sorted order. ! 185: Sets themselves occur after tables but before records in the sorting order. ! 186: .PP ! 187: The customary set operations are provided. The function ! 188: .Ds ! 189: member(s,\*bx) ! 190: .De ! 191: succeeds and returns the value of \*Mx\fR if \*Mx\fR is a member of ! 192: \*Ms\fR, but fails otherwise. Note that ! 193: .Ds ! 194: member(s1,\*bmember(s2,\*bx)) ! 195: .De ! 196: succeeds if \*Mx\fR is a member of both \*Ms1\fR and \*Ms2\fR. ! 197: .PP ! 198: The function ! 199: .Ds ! 200: insert(s,\*bx) ! 201: .De ! 202: inserts \*Mx\fR into the set \*Ms\fR and returns the value of \*Ms\fR ! 203: (it is similar to \*Mput(a,\*bx)\fR in form). Note that ! 204: .Ds ! 205: insert(s,\*bs) ! 206: .De ! 207: adds \*Ms\fR as an member of itself. ! 208: .PP ! 209: The function ! 210: .Ds ! 211: delete(s,\*bx) ! 212: .De ! 213: deletes the member \*Mx\fR from the set \*Ms\fR and returns the ! 214: value of \*Ms\fR. ! 215: .PP ! 216: The functions \*Minsert(s,\*bx)\fR and \*Mdelete(s,\*bx)\fR always ! 217: succeed, whether or not \*Mx\fR is in \*Ms\fR. This allows their ! 218: use in loops ! 219: in which failure may occur for other reasons. For example, ! 220: .Ds ! 221: s := set(\^[\^]) ! 222: while insert(s,\*bread()) ! 223: .De ! 224: builds a set that consists of the (distinct) lines from the standard ! 225: input file. ! 226: .PP ! 227: The operations ! 228: .Ds ! 229: s1 ++ s2 ! 230: s1 ** s2 ! 231: s1 -- s2 ! 232: .De ! 233: create the union, intersection, and difference of \*Ms1\fR and \*Ms2\fR, ! 234: respectively. In each case, the result is a new set. ! 235: .PP ! 236: The use of these operations on csets is unchanged. There is no ! 237: automatic type conversion between csets and sets; the result of the ! 238: operation depends on the types of the arguments. For example, ! 239: .Ds ! 240: \&'aeiou' ++ 'abcde' ! 241: .De ! 242: produces ! 243: the cset \*Mabcdeiou\fR, while ! 244: .Ds ! 245: set(\^[1,\*b2,\*b3]) ++ set(\^[2,\*b3,\*b4]) ! 246: .De ! 247: produces a set that contains 1, 2, 3, and 4. On the other hand, ! 248: .Ds ! 249: set(\^[1,\*b2,\*b3]) ++ 4 ! 250: .De ! 251: results in Run-time Error 119 (\*Mset expected\fR). ! 252: .SH ! 253: Examples ! 254: .a ! 255: .LP ! 256: \fIWord Counting:\fR ! 257: .PP ! 258: The following program lists, in alphabetical order, all the different ! 259: words that occur in the standard input file: ! 260: .Ds ! 261: .Px ! 262: procedure main() ! 263: letter := &lcase ++ &ucase ! 264: words := set(\^[\^]) ! 265: while text := read() do ! 266: text ? while tab(upto(letter)) do ! 267: insert(words,\*btab(many(letter))) ! 268: every write(!sort(words)) ! 269: end ! 270: .De ! 271: .LP ! 272: \fIThe Sieve of Eratosthenes:\fR ! 273: .PP ! 274: The follow program produces prime numbers, using the classical ``Sieve of ! 275: Eratosthenes'': ! 276: .Ds ! 277: .Px ! 278: procedure main(a) ! 279: local limit, s, i ! 280: limit := a\^[1] | 5000 # limit to 5000 if not specified ! 281: s := set(\^[]) ! 282: every insert(s,\*b1 to limit) ! 283: every member(s,\*bi := 2 to limit) do ! 284: every delete(s,\*bi + i to limit by i) ! 285: primes := sort(s) ! 286: write("There are ",\*b*primes,\*b" primes in the first ",\*blimit,\*b" integers.") ! 287: write("The primes are:") ! 288: every write(right(!primes,\*b*limit + 1)) ! 289: end ! 290: .De ! 291: .NH ! 292: Expermental Features ! 293: .NH 2 ! 294: PDCO Invocation Syntax ! 295: .PP ! 296: The experimental features include the procedure invocation syntax that is ! 297: used for programmer-defined control operations [4]. ! 298: In this syntax, when braces are used in place of parentheses to ! 299: enclose an argument list, the arguments are passed as a list ! 300: of co-expressions. That is, ! 301: .Ds ! 302: p{\*1, \*2, \*(El, \*n} ! 303: .De ! 304: is equivalent to ! 305: .Ds ! 306: p(\^[create \*1, create \*2, \*(El, create \*n]) ! 307: .De ! 308: Note that ! 309: .Ds ! 310: p{\^} ! 311: .De ! 312: is equivalent to ! 313: .Ds ! 314: p(\^[\^\^]) ! 315: .De ! 316: .NH 2 ! 317: Invocation Via String Name ! 318: .PP ! 319: The experimental features allow a string-valued expression that corresponds to the ! 320: name of a procedure or operation to be used in place of the ! 321: procedure or operation in an invocation expression. For example, ! 322: .Ds ! 323: "image"(x) ! 324: .De ! 325: produces the same call as ! 326: .Ds ! 327: image(x) ! 328: .De ! 329: and ! 330: .Ds ! 331: "-"(i,\*bj) ! 332: .De ! 333: is equivalent to ! 334: .Ds ! 335: i - j ! 336: .De ! 337: .PP ! 338: In the case of operations, the number of arguments determines ! 339: the operation. Thus ! 340: .Ds ! 341: "-"(i) ! 342: .De ! 343: is equivalent to ! 344: .Ds ! 345: -i ! 346: .De ! 347: Since \*Mto-by\fR is an operation, despite its reserved-word syntax, ! 348: it is included in this facility with the string name \*M...\fR . ! 349: Thus ! 350: .Ds ! 351: "..."(1,\*b10,\*b2) ! 352: .De ! 353: is equivalent to ! 354: .Ds ! 355: 1 to 10 by 2 ! 356: .De ! 357: Similarly, range specifications are represented by \*M":"\fR, so that ! 358: .Ds ! 359: ":"(s,i,j) ! 360: .De ! 361: is equivalent to ! 362: .Ds ! 363: s\^[i:j] ! 364: .De ! 365: .PP ! 366: Defaults are not provided for omitted or null-valued arguments in this ! 367: facility. Consequently, ! 368: .Ds ! 369: "..."(1,\*b10) ! 370: .De ! 371: results in a run-time error when it is evaluated. ! 372: .PP ! 373: The subscripting operation also is available with the string name ! 374: \*M[\^\^]\fR. Thus ! 375: .Ds ! 376: "[\^\^]"(&lcase,\*b3) ! 377: .De ! 378: produces \*Mc\fR. ! 379: .PP ! 380: String names are available for all the operations in Icon, but not for ! 381: control structures. Thus ! 382: .Ds ! 383: "|"(\*1,\*b\*2) ! 384: .De ! 385: is erroneous. ! 386: Note that string scanning is a control structure. ! 387: .PP ! 388: Field references, of the form ! 389: .Ds ! 390: \*0 . \fIfieldname\fR ! 391: .De ! 392: are not operations in the ordinary sense and are not available ! 393: via string invocation. ! 394: .PP ! 395: String names for procedures are available through global identifiers. ! 396: Note that the names of functions, such as \*Mimage\fR, are global ! 397: identifiers. Similarly, any procedure-valued global identifier may be ! 398: used as the string name of a procedure. Thus in ! 399: .Ds ! 400: global q ! 401: ! 402: procedure main() ! 403: q := p ! 404: "q"("hi") ! 405: end ! 406: ! 407: procedure p(s) ! 408: write(s) ! 409: end ! 410: .De ! 411: the procedure \*Mp\fR is invoked via the global identifier \*Mq\fR. ! 412: .NH 2 ! 413: Conversion to Procedure ! 414: .PP ! 415: The experimental features include the function \*Mproc(x,\*bi)\fR, which ! 416: converts \*Mx\fR to a procedure, if possible. ! 417: If \*Mx\fR is procedure-valued, its value is returned unchanged. If the ! 418: value of \*Mx\fR is a string that corresponds to the name of a procedure ! 419: as described in the preceding section, the corresponding procedure ! 420: value is returned. ! 421: The value of \*Mi\fR is used to distinguish between ! 422: unary and binary operators. ! 423: For example, \*Mproc("^",\*b2)\fR produces the exponentiation operator, while ! 424: \*Mproc("^",\*b1)\fR produces the co-expression refresh operator. ! 425: If \*Mx\fR cannot be converted to a procedure, \*Mproc(x,\*bi)\fR fails. ! 426: .NH 2 ! 427: Integer Sequences ! 428: .PP ! 429: To facilitate the generation of integer sequences that have no limit, ! 430: the experimental features include ! 431: the function \*Mseq(i,\*bj)\fR. This function has the ! 432: result sequence {\^i, i+j, i+2j, \*(El }. Omitted or null values for \*Mi\fR ! 433: and \*Mj\fR ! 434: default to 1. Thus the result sequence for \*Mseq()\fR is ! 435: {\^1, 2, 3, \*(El }. ! 436: .SH ! 437: Acknowledgements ! 438: .PP ! 439: The design of sets for Icon was done as part of a class project. ! 440: In addition to the authors of this paper, the following persons ! 441: participated in the design: ! 442: John Bolding, Owen Fonorow, Roger Hayes, Tom Hicks, Robert Kohout, ! 443: Mark Langley, Susan Moore, Maylee Noah, Janalee O'Bagy, Gregg Townsend, and Alan Wendt. ! 444: .SH ! 445: References ! 446: .LP ! 447: 1. Griswold, Ralph E. and Madge T. Griswold. \fIThe Icon Programming ! 448: Language\fR, Prentice-Hall, Inc., Englewood Cliffs, New Jersey. 1983. ! 449: .LP ! 450: 2. Griswold, Ralph E. and William H. Mitchell. ! 451: \fIInstallation and Maintenance Instructions for Version 5.9 of ! 452: Icon\fR, Technical Report TR 84-13, Department of Computer Science, ! 453: The University of Arizona. ! 454: August 1984. ! 455: .LP ! 456: 3. Griswold, Ralph E. and William H. Mitchell. \fIICONT(1)\fR, ! 457: manual page for \fIUNIX Programmer's Manual\fR, Department of Computer ! 458: Science, The University of Arizona. August 1984. ! 459: .LP ! 460: 4. Griswold, Ralph E. and Michael Novak. ``Programmer-Defined Control ! 461: Operations'', \fIThe Computer Journal\fR, Vol. 26, No. 2 (May 1983). ! 462: pp. 175-183.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.