|
|
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.