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

1.1       root        1: .ds l] /usr/lib/bmac
                      2: 'so \*(l]/bmac.std
                      3: .de s[   \" start reference
                      4: .nh
                      5: .IP \\*([F. 5n
                      6: ..
                      7: .\"    RT -  reset everything to normal state
                      8: .de RT
                      9: .if !\\n(1T .BG
                     10: .if !\\n(IK .if !\\n(IF .if !\\n(IX .di
                     11: .ce 0
                     12: .ul 0
                     13: .if \\n(NX=0 .if \\n(AJ=0 .ll \\n(LLu
                     14: .ps \\n(PS
                     15: .if \\n(VS>=40 .vs \\n(VSu
                     16: .if \\n(VS<=39 .vs \\n(VSp
                     17: .if \\n(IP .in -\\n(IQu
                     18: .if !\\n(IP .nr IQ \\n(PIu
                     19: .if \\n(IP .nr IP -1
                     20: .ft 1
                     21: .bd 1
                     22: .ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n 70n 75n 80n
                     23: .fi
                     24: ..
                     25: .      \"IZ - initialization
                     26: .de IZ
                     27: .if \\n(FM=0 .nr FM 1i
                     28: .nr YY -\\n(FMu
                     29: .nr XX 0 1
                     30: .nr IP 0
                     31: .nr PI 3n
                     32: .nr IQ \\n(PIu
                     33: .nr PS 10
                     34: .nr VS 12
                     35: .if !\\n(PD .if n .nr PD 1v
                     36: .if !\\n(PD .if t .nr PD 0.3v
                     37: .nr ML 3v
                     38: .ps \\n(PS
                     39: .if \\n(VS>40 .vs \\n(VSu
                     40: .if \\n(VS<=39 .vs \\n(VSp
                     41: .if \\n(IR=0 .nr IR 5n
                     42: .nr TB 0
                     43: .nr SJ \\n(.j
                     44: .nr LL 6.5i
                     45: .ll \\n(LLu
                     46: .nr LT \\n(.l
                     47: .lt \\n(LTu
                     48: .ev 1
                     49: .nr FL \\n(LLu*11u/12u
                     50: .ll \\n(FLu
                     51: .ps 8
                     52: .vs 10p
                     53: .ev
                     54: .if \\*(CF .ds CF "\(hy \\\\n(PN \(hy
                     55: .wh 0 NP
                     56: .wh -\\n(FMu FO
                     57: .ch FO 16i
                     58: .wh -\\n(FMu FX
                     59: .ch FO -\\n(FMu
                     60: .wh -\\n(FMu/2u BT
                     61: ..
                     62: .de TR \" Tech Report
                     63: .nr ST 2
                     64: .pn 0
                     65: .ds MN \\$1
                     66: .rm SG
                     67: .br
                     68: ..
                     69: .de GR \" Grant - full
                     70: .ds GS *
                     71: .de GX
                     72: *This work was supported by the National Science Foundation under
                     73: .if \\n(.$=1 Grant \\$1.
                     74: .if \\n(.$=2 Grants \\$1 and \\$2.
                     75: .if \\n(.$=3 Grants \\$1, \\$2, and \\$3.
                     76: .if \\n(.$=4 Grants \\$1, \\$2, \\$3, and \\$4.
                     77: \\..
                     78: ..
                     79: .de GP \" Grant - part
                     80: .ds GS *
                     81: .de GX
                     82: *This work was supported in part by the National Science Foundation under
                     83: .if \\n(.$=1 Grant \\$1.
                     84: .if \\n(.$=2 Grants \\$1 and \\$2.
                     85: .if \\n(.$=3 Grants \\$1, \\$2, and \\$3.
                     86: .if \\n(.$=4 Grants \\$1, \\$2, \\$3, and \\$4.
                     87: \\..
                     88: ..
                     89: .      \"TL - title and initialization
                     90: .de TL
                     91: .br
                     92: .nr TV 1
                     93: .ME
                     94: .rm ME
                     95: .di WT
                     96: .nr SJ \\n(.j
                     97: .na
                     98: .fi
                     99: .ll 3.75i
                    100: .ft 3
                    101: .ps 10
                    102: .hy 0
                    103: ..
                    104: .de TX
                    105: .rs
                    106: .sp .5i
                    107: .ce 1000
                    108: .ps 12
                    109: .ft 3
                    110: .vs 15p
                    111: .if n .vs 1P
                    112: .ne 4
                    113: .hy 0
                    114: .WT
                    115: .hy 14
                    116: .ce 0
                    117: ..
                    118: .de TY
                    119: .di XT
                    120: .ll 3.75i
                    121: .fi
                    122: .hy 0
                    123: .WT
                    124: \h'-\w' 'u'\\*(GS
                    125: .hy 14
                    126: .nf
                    127: .di
                    128: .ll \\n(LLu
                    129: .ce 1000
                    130: .ps 12
                    131: .ft 3
                    132: .if t .vs 15p
                    133: .if n .vs 1P
                    134: .ne 4
                    135: .XT
                    136: .ce 0
                    137: ..
                    138: .      \"      AU - author(s)
                    139: .de AU
                    140: .nr AV 1
                    141: .ad \\n(SJ
                    142: .br
                    143: .di
                    144: .br
                    145: .nf
                    146: .nr NA +1
                    147: .ds R\\n(NA \\$1
                    148: .ds E\\n(NA \\$2
                    149: .di A\\n(NA
                    150: .ll \\n(LLu
                    151: .if t .ft 2
                    152: .if n .ft 1
                    153: .ps 10
                    154: ..
                    155: .de AX
                    156: .ft 1
                    157: .rs
                    158: .ce 1000
                    159: .ps 10
                    160: .vs 12p
                    161: .if n .sp 2
                    162: .if t .sp
                    163: .A1
                    164: .if n .sp
                    165: .if t .sp 0.5
                    166: .ns
                    167: .I1
                    168: .if \\n(NA-1 .if n .sp 2
                    169: .if \\n(NA-1 .if t .sp
                    170: .A2
                    171: .if \\n(NA-1 .if n .sp
                    172: .if \\n(NA-1 .if t .sp 0.5
                    173: .ns
                    174: .I2
                    175: .if \\n(NA-2 .if t .sp
                    176: .if \\n(NA-2 .if n .sp 2
                    177: .A3
                    178: .if \\n(NA-2 .if t .sp 0.5
                    179: .if \\n(NA-2 .if n .sp
                    180: .ns
                    181: .I3
                    182: .if \\n(NA-3 .if t .sp
                    183: .if \\n(NA-3 .if n .sp 2
                    184: .A4
                    185: .if \\n(NA-3 .if t .sp 0.5
                    186: .if \\n(NA-3 .if n .sp
                    187: .ns
                    188: .I4
                    189: .if \\n(NA-4 .if t .sp
                    190: .if \\n(NA-4 .if n .sp 2
                    191: .A5
                    192: .if \\n(NA-4 .if n .sp
                    193: .if \\n(NA-4 .if t .sp 0.5
                    194: .ns
                    195: .I5
                    196: .if \\n(NA-5 .if t .sp
                    197: .if \\n(NA-5 .if n .sp 2
                    198: .A6
                    199: .if \\n(NA-5 .if n .sp
                    200: .if \\n(NA-5 .if t .sp 0.5
                    201: .ns
                    202: .I6
                    203: .if \\n(NA-6 .if t .sp
                    204: .if \\n(NA-6 .if n .sp 2
                    205: .A7
                    206: .if \\n(NA-6 .if n .sp
                    207: .if \\n(NA-6 .if t .sp 0.5
                    208: .ns
                    209: .I7
                    210: .if \\n(NA-7 .if t .sp
                    211: .if \\n(NA-7 .if n .sp 2
                    212: .A8
                    213: .if \\n(NA-7 .if n .sp
                    214: .if \\n(NA-7 .if t .sp 0.5
                    215: .ns
                    216: .I8
                    217: .if \\n(NA-8 .if t .sp
                    218: .if \\n(NA-8 .if n .sp 2
                    219: .A9
                    220: .if \\n(NA-8 .if n .sp
                    221: .if \\n(NA-8 .if t .sp 0.5
                    222: .ns
                    223: .I9
                    224: ..
                    225: .      \"AI - authors institution
                    226: .de AI
                    227: .br
                    228: .ft 1
                    229: .di
                    230: .di I\\n(NA
                    231: .nf
                    232: ..
                    233: .      \"AB - begin an abstract
                    234: .de AB
                    235: .br
                    236: .di
                    237: .ul 0
                    238: .ce 0
                    239: .nr 1T 1
                    240: .nr IK 1
                    241: .nr KI 1
                    242: .di WB
                    243: .rs
                    244: .nr AJ 1
                    245: .ce 1
                    246: .ft 2
                    247: .if n .ul
                    248: .ll \\n(LLu
                    249: .if \\n(.$=0 ABSTRACT
                    250: .if \\n(.$>0 .if !"\\$1"-" .if !"\\$1"no"  \\$1
                    251: .if \\n(.$=0 .sp
                    252: .if \\n(.$>0 .if !"\\$1"-" .if !"\\$1"no" .sp
                    253: .hy 14
                    254: .ul 0
                    255: .ce 0
                    256: .fi
                    257: .ft 1
                    258: .nr OJ \\n(.i
                    259: .in +\\n(.lu/12u
                    260: .ll -\\n(.lu/12u
                    261: .br
                    262: .ps \\n(PS
                    263: .if \\n(VS>40 .vs \\n(VSu
                    264: .if \\n(VS<=39 .vs \\n(VSp
                    265: .ti +\\n(PIu
                    266: ..
                    267: .      \"AE - end of an abstract
                    268: .de AE
                    269: .br
                    270: .di
                    271: .ll \\n(LLu
                    272: .ps \\n(PS
                    273: .if \\n(VS>40 .vs \\n(VSu
                    274: .if \\n(VS<=39 .vs \\n(VSp
                    275: .nr 1T 0
                    276: .nr IK 0
                    277: .in \\n(OJu
                    278: .nr AJ 0
                    279: .di
                    280: .ce 0
                    281: .if \\n(ST=2 .SY
                    282: .if \\n(ST<3 .rm SY
                    283: ..
                    284: .      \"S2 - tech report style
                    285: .      \"SY - cover sheet of released paper
                    286: .de SY
                    287: .ch FO 16i
                    288: .ch FX 16i
                    289: .ll \\n(LLu
                    290: .rs
                    291: .sp |13P
                    292: .ns
                    293: .if \\n(TV .TY
                    294: .if \\n(AV .AX
                    295: .rs
                    296: .sp |22P
                    297: .if !'\\*(MN'' TR \\*(MN
                    298: .ce 0
                    299: .nf
                    300: .sp |28P
                    301: .ls 1
                    302: .ll -\\n(.lu/12u
                    303: .WB
                    304: .ll \\n(LLu
                    305: .ls
                    306: .ce 1000
                    307: .sp |8i
                    308: \\*(DY
                    309: .sp 2
                    310: Department of Computer Science
                    311: .sp 1
                    312: The University of Arizona
                    313: .sp 1
                    314: Tucson, Arizona 85721
                    315: .ce 0
                    316: .sp |10i
                    317: .na
                    318: .fi
                    319: .GX
                    320: .br
                    321: ..
                    322: .      \"S2 - first text page, released paper format
                    323: .de S2
                    324: .ce 0
                    325: .br
                    326: .SY
                    327: .rm SY
                    328: .bp 1
                    329: .if \\n(TV .TX
                    330: .rs
                    331: .ce 0
                    332: .ft 1
                    333: .ad \\n(SJ
                    334: ..
                    335: .      \"S0- mike lesk conserve paper style
                    336: .de S0
                    337: .ce 0
                    338: .br
                    339: .ll \\n(LLu
                    340: .if \\n(TV+\\n(AV>0 .ns
                    341: .if \\n(TV .TX
                    342: .if \\n(AV .AX
                    343: .if \\n(TV+\\n(AV>0 .rs
                    344: .ce 0
                    345: .nf
                    346: .if \\n(TV>0 .sp 2
                    347: .ls 1
                    348: .WB
                    349: .ls
                    350: .fi
                    351: .ad \\n(SJ
                    352: ..
                    353: .      \"SG - signature
                    354: .de SG
                    355: .br
                    356: .KS
                    357: .in +2u*\\n(.lu/3u
                    358: .sp 2
                    359: .A1
                    360: .if \\n(NA-1 .sp 2
                    361: .A2
                    362: .if \\n(NA-2 .sp 2
                    363: .A3
                    364: .if \\n(NA-3 .sp 2
                    365: .A4
                    366: .if \\n(NA-4 .sp 2
                    367: .A5
                    368: .if \\n(NA>5 .sp 2
                    369: .A6
                    370: .if \\n(NA>6 .sp 2
                    371: .A7
                    372: .if \\n(NA>7 .sp 2
                    373: .A8
                    374: .if \\n(NA>8 .sp 2
                    375: .A9
                    376: .in
                    377: .nf
                    378: .sp -1
                    379: .if \\n(.$>=1 \\$1
                    380: .if \\n(.$>=2 \\$2
                    381: .if \\n(.$>=3 \\$3
                    382: .if \\n(.$>=4 \\$4
                    383: .if \\n(.$>=5 \\$5
                    384: .if \\n(.$>=6 \\$6
                    385: .if \\n(.$>=7 \\$7
                    386: .if \\n(.$>=8 \\$8
                    387: .if \\n(.$>=9 \\$9
                    388: .fi
                    389: .br
                    390: .KE
                    391: ..
                    392: .      \"Tables.  TS - table start, TE - table end
                    393: .de TS
                    394: .br
                    395: .if !\\n(1T .RT
                    396: .ul 0
                    397: .ti \\n(.iu
                    398: .if t .sp 0.5
                    399: .if n .sp
                    400: .if \\$1H .TQ
                    401: .nr IX 1
                    402: ..
                    403: .de TQ
                    404: .di TT
                    405: .nr IT 1
                    406: ..
                    407: .de TH
                    408: .if \\n(.d>0.5v .nr T. 0
                    409: .if \\n(.d>0.5v .T# 0
                    410: .di
                    411: .nr TQ \\n(.i
                    412: .nr HT 1
                    413: .in 0
                    414: .TT
                    415: .in \\n(TQu
                    416: .mk #T
                    417: ..
                    418: .de TE
                    419: .nr IX 0
                    420: .if \\n(IT>0 .if \\n(HT=0 .di
                    421: .if \\n(IT>0 .if \\n(HT=0 .nr EF \\n(.u
                    422: .if \\n(IT>0 .if \\n(HT=0 .nf
                    423: .if \\n(IT>0 .if \\n(HT=0 .TT
                    424: .if \\n(IT>0 .if \\n(HT=0 .if \\n(EF>0 .fi
                    425: .nr IT 0
                    426: .nr HT 0
                    427: .if n .sp 1
                    428: .if t .sp 0.5
                    429: ..
                    430: .      \"DS - display.  If .DS C, center; L, left-adjust; I, indent.
                    431: .de DS
                    432: .KS
                    433: .\\$1D \\$2 \\$1
                    434: ..
                    435: .de D
                    436: .ID \\$1
                    437: ..
                    438: .de CD
                    439: .ce 1000
                    440: .XD
                    441: ..
                    442: .de ID
                    443: .XD
                    444: .if t .in +0.5i
                    445: .if n .in +8
                    446: .if \\n(.$ .if !"\\$1"I" .in \\n(OIu
                    447: .if \\n(.$ .if !"\\$1"I" .in +\\$1n
                    448: ..
                    449: .de LD
                    450: .XD
                    451: ..
                    452: .de XD
                    453: .nf
                    454: .nr OI \\n(.i
                    455: .if t .sp 0.5
                    456: .if n .sp 1
                    457: ..
                    458: .de BD \" block display: save everything, then center it.
                    459: .XD
                    460: .nr BD 1
                    461: .nr RD 2
                    462: .di DD
                    463: ..
                    464: .de RD \" right block display: save everything, then right adjust it.
                    465: .XD
                    466: .nr BD 1
                    467: .nr RD 1
                    468: .di DD
                    469: ..
                    470: .      \"DE - display end
                    471: .de DE
                    472: .ce 0
                    473: .in \\n(OIu
                    474: .if t .sp 0.5
                    475: .if n .sp 1
                    476: .if \\n(BD>0 .DF
                    477: .nr BD 0
                    478: .KE
                    479: .fi
                    480: ..
                    481: .de DF \" finish a block display to be recentered.
                    482: .di
                    483: .if \\n(dl>\\n(BD .nr BD \\n(dl
                    484: .if \\n(BD<\\n(.l .in (\\n(.lu-\\n(BDu)/\\n(RDu
                    485: .ta \\n(.luR
                    486: .DD
                    487: .in \\n(OIu
                    488: ..
                    489: .      \"KS keep - for keep release features. As in IFM
                    490: .de KS
                    491: .if \\n(IK=0 .if \\n(IF=0 .KQ
                    492: .nr IK +1
                    493: ..
                    494: .      \"KQ - real keep processor
                    495: .de KQ
                    496: .br
                    497: .nr KI \\n(.i
                    498: .ev 2
                    499: .br
                    500: .in \\n(KIu
                    501: .ps \\n(PS
                    502: .if \\n(VS>40 .vs \\n(VSu
                    503: .if \\n(VS<=39 .vs \\n(VSp
                    504: .ll \\n(LLu
                    505: .lt \\n(LTu
                    506: .if \\n(NX>0 .ll \\n(CWu
                    507: .if \\n(NX>0 .lt \\n(CWu
                    508: .di KK
                    509: .nr TB 0
                    510: ..
                    511: .      \"KF - floating keep
                    512: .de KF
                    513: .if !\\n(IK .FQ
                    514: .nr IK +1
                    515: ..
                    516: .      \"FQ real floating keep processor
                    517: .de FQ
                    518: .nr KI \\n(.i
                    519: .ev 2
                    520: .br
                    521: .in \\n(KIu
                    522: .ps \\n(PS
                    523: .if \\n(VS>40 .vs \\n(VSu
                    524: .if \\n(VS<=39 .vs \\n(VSp
                    525: .ll \\n(LLu
                    526: .lt \\n(LTu
                    527: .if \\n(NX>0 .ll \\n(CWu
                    528: .if \\n(NX>0 .lt \\n(CWu
                    529: .di KK
                    530: .nr TB 1
                    531: ..
                    532: .      \"KE release - everything between keep and release is together
                    533: .de KE
                    534: .if \\n(IK .if !\\n(IK-1 .if \\n(IF=0 .RQ
                    535: .if \\n(IK .nr IK -1
                    536: ..
                    537: .      \"RQ real release
                    538: .de RQ
                    539: .br
                    540: .di
                    541: .nr NF 0
                    542: .if \\n(dn-\\n(.t .nr NF 1
                    543: .if \\n(TC .nr NF 1
                    544: .if \\n(NF .if !\\n(TB .sp 200
                    545: .if !\\n(NF .if \\n(TB .nr TB 0
                    546: .nf
                    547: .\".rs
                    548: .nr TC 5
                    549: .in 0
                    550: .ls 1
                    551: .if \\n(TB=0 .ev
                    552: .if \\n(TB=0 .br
                    553: .if \\n(TB=0 .ev 2
                    554: .if \\n(TB=0 .KK
                    555: .ls
                    556: .ce 0
                    557: .if \\n(TB=0 .rm KK
                    558: .if \\n(TB .da KJ
                    559: .if \\n(TB \!.KD \\n(dn
                    560: .if \\n(TB .KK
                    561: .if \\n(TB .di
                    562: .nr TC \\n(TB
                    563: .fi
                    564: .in
                    565: .ev
                    566: ..
                    567: .de EQ \"equation, breakout and display
                    568: .nr EF \\n(.u
                    569: .rm EE
                    570: .nr LE 1       \" 1 is center
                    571: .ds EL \\$1
                    572: .if "\\$1"L" .ds EL \\$2
                    573: .if "\\$1"L" .nr LE 0
                    574: .if "\\$1"C" .ds EL \\$2
                    575: .if "\\$1"I" .nr LE 0
                    576: .if "\\$1"I" .ds EE \\h'|10n'
                    577: .if "\\$1"I" .if !"\\$3"" .ds EE \\h'\\$3'
                    578: .if "\\$1"I" .ds EL \\$2
                    579: .if \\n(YE>0 .nf
                    580: .di EZ
                    581: ..
                    582: .de EN \" end of a displayed equation
                    583: .br
                    584: .di
                    585: .rm EZ
                    586: .nr ZN \\n(dn
                    587: .if \\n(ZN>0 .if \\n(YE=0 .LP
                    588: .if \\n(ZN=0 .if !"\\*(EL"" .nr ZN 1
                    589: .if "\\n(.z"" .if \\n(ZN>0 .if !\\n(nl=\\n(PE .if t .sp .5
                    590: .if "\\n(.z"" .if \\n(ZN>0 .if !\\n(nl=\\n(PE .if n .sp 1
                    591: .if !"\\n(.z"" .if \\n(ZN>0 .if !\\n(.d=\\n(PE .if t .sp .5
                    592: .if !"\\n(.z"" .if \\n(ZN>0 .if !\\n(.d=\\n(PE .if n .sp 1
                    593: .pc
                    594: .if \\n(BD>0 .nr LE 0 \" can't mean centering in this case.
                    595: .lt \\n(.lu
                    596: .if \\n(EP=0 .if \\n(ZN>0 .if \\n(LE>0 .tl \(ts\(ts\\*(10\(ts\\*(EL\(ts
                    597: .if \\n(EP=0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD=0 .tl \(ts\\*(EE\\*(10\(ts\(ts\\*(EL\(ts
                    598: .if \\n(EP=0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD>0 .if \\n(BD<\\w\(ts\\*(10\(ts .nr BD \\w\(ts\\*(10\(ts
                    599: .if \\n(EP=0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD>0 \!\\*(10\\\\t\\*(EL
                    600: .if \\n(EP>0 .if \\n(ZN>0 .if \\n(LE>0 .tl \(ts\\*(EL\(ts\\*(10\(ts\(ts
                    601: .if \\n(EP>0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD=0 .tl \(ts\\*(EL\\*(EE\\*(10\(ts\(ts\(ts
                    602: .if \\n(EP>0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD>0 .if \\n(BD<\\w\(ts\\*(10\(ts .nr BD \\w\(ts\\*(10\(ts
                    603: .if \\n(EP>0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD>0 \!\\h'-\\\\n(.iu'\\*(EL\\h'|0'\\*(10
                    604: .\".di EZ \" GCOS patch
                    605: .\"\\*(10 \" GCOS patch
                    606: .\".br \" GCOS patch
                    607: .\".di \" GCOS patch
                    608: .\".rm EZ \" GCOS patch
                    609: .lt \\n(LLu
                    610: .pc %
                    611: .if \\n(YE>0 .if \\n(EF>0 .fi
                    612: .rm EL
                    613: .rm 10
                    614: .rm 11
                    615: .rm 12
                    616: .rm 13
                    617: .rm 14
                    618: .rm 15
                    619: .rm 16
                    620: .rm 17
                    621: .rm 18
                    622: .rm 19
                    623: .rm 20
                    624: .rm 21
                    625: .rm 22
                    626: .rm 23
                    627: .if \\n(ZN>0 .if t .sp .5
                    628: .if \\n(ZN>0 .if n .sp
                    629: .if "\\n(.z"" .nr PE \\n(nl
                    630: .if !"\\n(.z"" .nr PE \\n(.d
                    631: ..
                    632: .de ME
                    633: .nr SJ \\n(.j
                    634: .if \\n(LL>0 .nr LT \\n(LL
                    635: .nr YE 1
                    636: .if \\n(PO=0 .nr PO \\n(.o
                    637: ..
                    638: .      \"EM end up macro - process left over keep-release
                    639: .de EM
                    640: .br
                    641: .if \\n(TB=0 .if t .if \\nd=0 .wh -1p CM
                    642: .if \\n(TB \&\c
                    643: .if \\n(TB 'bp
                    644: .if \\n(TB .NP
                    645: .if \\n(TB .ch CM 160
                    646: ..
                    647: .      \"NP new page
                    648: .de NP
                    649: .if \\n(FM+\\n(HM>=\\n(.p .tm Margins bigger than page length.
                    650: .if \\n(FM+\\n(HM>=\\n(.p .ab
                    651: .if \\n(FM+\\n(HM>=\\n(.p .ex
                    652: .nr PX \\n(.s
                    653: .nr PF \\n(.f
                    654: .if t .if \\nd=0 .CM
                    655: .if \\n(HM=0 .nr HM 1i
                    656: 'sp \\n(HMu/2u
                    657: .lt \\n(LTu
                    658: .ps \\n(PS
                    659: .ft 1
                    660: .PT
                    661: .ps \\n(PX
                    662: .ft \\n(PF
                    663: 'sp |\\n(HMu
                    664: .nr XX 0 1
                    665: .nr YY 0-\\n(FMu
                    666: .ch FO 16i
                    667: .ch FX 17i
                    668: .ch FO -\\n(FMu
                    669: .ch FX -\\n(FMu
                    670: .if \\n(MF .FV
                    671: .nr MF 0
                    672: .mk
                    673: .os
                    674: .ev 1
                    675: .if \\n(TD=0 .if \\n(TC<5  .XK
                    676: .nr TC 0
                    677: .ns
                    678: .ev
                    679: .nr TQ \\n(.i
                    680: .if \\n(IT>0 .in 0
                    681: .if \\n(IT>0 .TT
                    682: .if \\n(IT>0 .in \\n(TQu
                    683: .mk #T
                    684: .if \\n(PO>0 .po \\n(POu
                    685: .if t .if \\n(.o+\\n(LL>7.75i .tm Offset + line length exceeds 7.75 inches, too wide
                    686: ..
                    687: .de XK
                    688: .nr TD 1
                    689: .nf
                    690: .ls 1
                    691: .in 0
                    692: .rn KJ KL
                    693: .KL
                    694: .rm KL
                    695: .if "\\n(.z"KJ" .di
                    696: .nr TB 0
                    697: .if "\\n(.z"KJ" .nr TB 1
                    698: .br
                    699: .in
                    700: .ls
                    701: .fi
                    702: .nr TD 0
                    703: ..
                    704: .de KD
                    705: .nr KM 0
                    706: .if "\\n(.z"KJ" .nr KM 1 \" KM is 1 if in a rediversion of keeps
                    707: .if \\n(KM>0 \!.KD \\$1
                    708: .if \\n(KM=0 .if \\n(.t<\\$1 .di KJ
                    709: ..
                    710: .de PT
                    711: .lt \\n(LLu
                    712: .pc %
                    713: .nr PN \\n%
                    714: .if \\n%-1 .tl '\\*(LH'\\*(CH'\\*(RH'
                    715: .lt \\n(.lu
                    716: ..
                    717: .      \"FO - footer of page
                    718: .de FO
                    719: .rn FO FZ
                    720: .if \\n(K1>0 .tm This memo has a multi-page cover sheet.  You are
                    721: .if \\n(K1>0 .tm rebuked in the name of the Committee on Technical Memoranda.
                    722: .if \\n(IT>0 .nr T. 1
                    723: .if \\n(IT>0 .if \\n(FC=0  .T# 1
                    724: .if \\n(IT>0 .br
                    725: .nr FC +1
                    726: .if !\\n(NX .nr WF 0
                    727: .nr dn 0
                    728: .if \\n(FC<=1 .if \\n(XX .XF
                    729: .rn FZ FO
                    730: .nr MF 0
                    731: .if \\n(dn  .nr MF 1
                    732: .if !\\n(WF .nr YY 0-\\n(FMu
                    733: .if !\\n(WF .ch FO \\n(YYu
                    734: .if !\\n(dn .nr WF 0
                    735: .if \\n(FC<=1 .if \\n(XX=0  .if \\n(NX>0 .RC
                    736: .if \\n(FC<=1 .if \\n(XX=0  .if \\n(NX<=0 'bp
                    737: .nr FC -1
                    738: .if \\n(ML>0 .ne \\n(MLu
                    739: ..
                    740: .      \"2C - begin double column
                    741: .de 2C
                    742: .if !\\n(1T .if n .sp 4
                    743: .if !\\n(1T .if t .sp 2
                    744: .RT
                    745: .if \\n(NX=0 .mk
                    746: .if \\n(NX=0 .nr NC 1
                    747: .hy 12
                    748: .if \\n(L1=0 .nr L1 \\n(.l
                    749: .nr NX 1
                    750: .if \\n(CW=0 .nr CW \\n(.l*7/15
                    751: .ll \\n(CWu
                    752: .nr FL \\n(CWu*11u/12u
                    753: .if \\n(GW=0 .nr GW \\n(L1-(2*\\n(CW)
                    754: .nr RO \\n(CW+\\n(GW
                    755: .ns
                    756: ..
                    757: .de RC
                    758: .if \\n(NC>1 .C2
                    759: .if \\n(NC<=1 .C1
                    760: .nr NC \\n(ND
                    761: ..
                    762: .de C1
                    763: .rt
                    764: .po +\\n(ROu
                    765: .nr ND 2
                    766: .nr XX 0 1
                    767: .if \\n(MF .FV
                    768: .ev 1
                    769: .if \\n(TB .XK
                    770: .nr TC 0
                    771: .ev
                    772: .ns
                    773: ..
                    774: .ch FO \\n(YYu
                    775: .de C2
                    776: .po \\n(POu
                    777: 'bp
                    778: .nr ND 1
                    779: ..
                    780: .      \"1C - return to single column format
                    781: .de 1C
                    782: .br
                    783: .RT
                    784: .po \\n(POu
                    785: .nr ND 1
                    786: .if \\n(NX>0 .ll \\n(L1u
                    787: .if \\n(NX>0 .bp
                    788: .nr NX 0
                    789: .hy 14
                    790: ..
                    791: .      \".de R3
                    792: .      \".pl 102
                    793: .      \".nr LT \\n(.l
                    794: .      \"..
                    795: .de BT
                    796: .nr PX \\n(.s
                    797: .nr PF \\n(.f
                    798: .ft 1
                    799: .ps \\n(PS
                    800: 'lt \\n(LTu
                    801: .if \\n%>0 .tl '\\*(LF'\\*(CF'\\*(RF'
                    802: .ft \\n(PF
                    803: .ps \\n(PX
                    804: ..
                    805: .      \"PP - paragraph
                    806: .de PP
                    807: .RT
                    808: .ne 1.1
                    809: .if \\n(1T .sp \\n(PDu
                    810: .ti +\\n(PIu
                    811: ..
                    812: .      \"SH - (unnumbered) section heading
                    813: .de SH
                    814: .RT
                    815: .if \\n(1T .sp 1
                    816: .if !\\n(1T .BG
                    817: .RT
                    818: .ne 4
                    819: .ft 3
                    820: .if n .cu 1000
                    821: ..
                    822: .      \"NH - numbered heading
                    823: .de NH
                    824: .RT
                    825: .if \\n(1T .sp 1
                    826: .if \\n(1T .if !\\n(.$ .sp 1
                    827: .if !\\n(1T .BG
                    828: .RT
                    829: .ne 4
                    830: .ft 3
                    831: .if n .cu 1000
                    832: .nr NS \\$1
                    833: .if !\\n(.$ .nr NS 1
                    834: .if !\\n(NS .nr NS 1
                    835: .nr H\\n(NS +1
                    836: .if !\\n(NS-4 .nr H5 0
                    837: .if !\\n(NS-3 .nr H4 0
                    838: .if !\\n(NS-2 .nr H3 0
                    839: .if !\\n(NS-1 .nr H2 0
                    840: .if !\\$1 .if \\n(.$ .nr H1 1
                    841: .ds SN \\n(H1.
                    842: .if \\n(NS-1 .as SN \\n(H2
                    843: .if \\n(NS-2 .as SN .\\n(H3
                    844: .if \\n(NS-3 .as SN .\\n(H4
                    845: .if \\n(NS-4 .as SN .\\n(H5
                    846: .nr IQ \w'\\*(SN\ \ '
                    847: .nr IP +1
                    848: .in +\\n(IQu
                    849: .ti -\\n(IQu
                    850: .nf
                    851: \\*(SN\ \ \\c
                    852: ..
                    853: .      \"BG - begin, execute at first PP
                    854: .de BG
                    855: .br
                    856: .ME
                    857: .rm ME
                    858: .di
                    859: .ce 0
                    860: .nr KI 0
                    861: .hy 14
                    862: .nr 1T 1
                    863: .S\\n(ST
                    864: .rm S0
                    865: .rm S2
                    866: .rm TX
                    867: .rm AX
                    868: .rm WT
                    869: .rm XT
                    870: .rm GR
                    871: .rm GP
                    872: .rm GS
                    873: .rm GX
                    874: .rm I1
                    875: .rm I2
                    876: .rm I3
                    877: .rm I4
                    878: .rm I5
                    879: .rm CB
                    880: .rm E1
                    881: .rm E2
                    882: .de TL
                    883: .ft 3
                    884: .sp
                    885: .ce 100
                    886: .LG
                    887: \\..
                    888: .de AU
                    889: .ft 2
                    890: .ce 100
                    891: .sp
                    892: .NL
                    893: \\..
                    894: .de AI
                    895: .ft 1
                    896: .ce 100
                    897: .if n .sp
                    898: .if t .sp .5
                    899: .NL
                    900: \\..
                    901: .RA
                    902: .rm RA
                    903: .rn FJ FS
                    904: .rn FK FE
                    905: .nf
                    906: .if \\n(KG=0 .nr FP 0 \"KI should be new
                    907: .nr KG 0 \"KI should be new
                    908: .if \\n(FP>0 .FS
                    909: .if \\n(FP>0 .FG
                    910: .if \\n(FP>0 .FE
                    911: .br
                    912: .if \\n(TV>0 .if n .sp 2
                    913: .if \\n(TV>0 .if t .sp 1
                    914: .fi
                    915: .ll \\n(LLu
                    916: ..
                    917: .de RA \"redefine abstract macros
                    918: .de AB
                    919: .br
                    920: .if !\\n(1T .BG
                    921: .ce 1
                    922: .sp 1
                    923: ABSTRACT
                    924: .sp 1
                    925: .nr AJ 1
                    926: .in +\\n(.lu/12u
                    927: .ll -\\n(.lu/12u
                    928: .RT
                    929: \\..
                    930: .de AE
                    931: .nr AJ 0
                    932: .br
                    933: .in 0
                    934: .ll \\n(LLu
                    935: .if \\n(VS>40 .vs \\n(VSu
                    936: .if \\n(VS<=39 .vs \\n(VSp
                    937: \\..
                    938: ..
                    939: .      \"IP - indented paragraph
                    940: .de IP
                    941: .RT
                    942: .if !\\n(IP .nr IP +1
                    943: .sp \\n(PDu
                    944: .ne 3v
                    945: .if \\n(.$-1 .nr IQ \\$2n
                    946: .if \\n(.$ .LB "\\$1"
                    947: .if !\\n(.$ .LB
                    948: ..
                    949: .      \"LP - left aligned (block) paragraph
                    950: .de LP
                    951: .ti \\n(.iu
                    952: .RT
                    953: .if \\n(1T .sp \\n(PDu
                    954: .ne 1.1
                    955: .if \\n(.$ .LB \\$1
                    956: ..
                    957: .      \"IE - synonym for .LP
                    958: .de IE
                    959: .LP
                    960: ..
                    961: .      \"LB - label paragraph
                    962: .de LB
                    963: .in +\\n(IQu
                    964: .ta \\n(IQu
                    965: .if \\n(.$ .ti -\\n(IQu
                    966: .if \\n(.$ \\$1\t\c
                    967: ..
                    968: .      \"RS - prepare for double indenting
                    969: .de RS
                    970: .in +\\n(IRu
                    971: ..
                    972: .      \"RE - retreat to the left
                    973: .de RE
                    974: .br
                    975: .in -\\n(IRu
                    976: ..
                    977: .      \"CM - cut mark
                    978: .de CM
                    979: .po 0
                    980: .\"lt 7i
                    981: .ft 1
                    982: .ps 10
                    983: .vs 4p
                    984: .\"tl '--''--'
                    985: .tl '---'''
                    986: .po
                    987: .vs
                    988: .\"lt
                    989: .ps
                    990: .ft
                    991: ..
                    992: .      \"B - bold font
                    993: .de B
                    994: .nr PQ \\n(.f
                    995: .if n .if \\n(.$>2 \\&\\$3\\c
                    996: .if "\\$1"" .if n .ul 1000
                    997: .if !"\\$1"" .if n .ul 1
                    998: .if t .if !"\\$1"" \\$3\\fB\\$1\\f\\n(PQ\\$2
                    999: .if n .if \\n(.$=1 \\$1
                   1000: .if n .if \\n(.$>1 \\$1\\c
                   1001: .if n .if \\n(.$>1 \\&\\$2
                   1002: ..
                   1003: .      \"R - Roman font
                   1004: .de R
                   1005: .if n .ul 0
                   1006: .ft 1
                   1007: ..
                   1008: .      \"I - italic font
                   1009: .de I
                   1010: .nr PQ \\n(.f
                   1011: .if n .if \\n(.$>2 \\&\\$3\\c
                   1012: .if "\\$1"" .if n .ul 1000
                   1013: .if !"\\$1"" .if n .ul 1
                   1014: .if t .if !"\\$1"" \\$3\\fI\\$1\\f\\n(PQ\\$2
                   1015: .if n .if \\n(.$=1 \\$1
                   1016: .if n .if \\n(.$>1 \\$1\\c
                   1017: .if n .if \\n(.$>1 \\&\\$2
                   1018: ..
                   1019: .      \"TA - tabs set in ens or chars
                   1020: .de TA
                   1021: .ta \\$1n \\$2n \\$3n \\$4n \\$5n \\$6n \\$7n \\$8n \\$9n
                   1022: ..
                   1023: .      \"SM - make smaller size
                   1024: .de SM
                   1025: .ps -2
                   1026: ..
                   1027: .      \"LG - make larger size
                   1028: .de LG
                   1029: .ps +2
                   1030: ..
                   1031: .      \"NL - return to normal size
                   1032: .de NL
                   1033: .ps \\n(PS
                   1034: ..
                   1035: .      \"DA - force date; ND - no date or new date.
                   1036: .de DA
                   1037: .ds DY \\$1
                   1038: ..
                   1039: .if \n(mo-0 .ds MO January
                   1040: .if \n(mo-1 .ds MO February
                   1041: .if \n(mo-2 .ds MO March
                   1042: .if \n(mo-3 .ds MO April
                   1043: .if \n(mo-4 .ds MO May
                   1044: .if \n(mo-5 .ds MO June
                   1045: .if \n(mo-6 .ds MO July
                   1046: .if \n(mo-7 .ds MO August
                   1047: .if \n(mo-8 .ds MO September
                   1048: .if \n(mo-9 .ds MO October
                   1049: .if \n(mo-10 .ds MO November
                   1050: .if \n(mo-11 .ds MO December
                   1051: .if \n(dw-0 .ds DW Sunday
                   1052: .if \n(dw-1 .ds DW Monday
                   1053: .if \n(dw-2 .ds DW Tuesday
                   1054: .if \n(dw-3 .ds DW Wednesday
                   1055: .if \n(dw-4 .ds DW Thursday
                   1056: .if \n(dw-5 .ds DW Friday
                   1057: .if \n(dw-6 .ds DW Saturday
                   1058: .ds DY \*(MO \n(dy, 19\n(yr
                   1059: .IZ
                   1060: .rm IZ
                   1061: .rm MO
                   1062: .de FN
                   1063: .FS
                   1064: ..
                   1065: .      \"FS - begin footnote
                   1066: .de FJ
                   1067: 'ce 0
                   1068: .di
                   1069: .ev1
                   1070: .ll \\n(FLu
                   1071: .da FF
                   1072: .br
                   1073: .if \\n(IF>0 .tm Footnote within footnote-illegal.
                   1074: .nr IF 1
                   1075: .if !\\n+(XX-1 .FA
                   1076: ..
                   1077: .      \"FE - footnote end
                   1078: .de FK
                   1079: .br
                   1080: .in 0
                   1081: .nr IF 0
                   1082: .di
                   1083: .ev
                   1084: .if !\\n(XX-1 .nr dn +\\n(.v
                   1085: .nr YY -\\n(dn
                   1086: .if \\n(NX=0 .nr WF 1
                   1087: .if \\n(dl>\\n(CW .nr WF 1
                   1088: .if (\\n(nl+\\n(.v)<=(\\n(.p+\\n(YY) .ch FO \\n(YYu
                   1089: .if (\\n(nl+\\n(.v)>(\\n(.p+\\n(YY) .if \\n(nl>(\\n(HM+1.5v) .ch FO \\n(nlu+\\n(.vu
                   1090: .if (\\n(nl+\\n(.v)>(\\n(.p+\\n(YY) .if \\n(nl>(\\n(HM+1.5v) .ch FX 16i
                   1091: .if (\\n(nl+\\n(.v)>(\\n(.p+\\n(YY) .if \\n(nl<=(\\n(HM+1.5v) .ch FO \\n(HMu+(4u*\\n(.vu)
                   1092: ..
                   1093: .\"    First page footer.
                   1094: .de FS
                   1095: .ev1
                   1096: .br
                   1097: .ll \\n(FLu
                   1098: .da FG
                   1099: ..
                   1100: .de FE
                   1101: .br
                   1102: .di
                   1103: .nr FP \\n(dn
                   1104: .if \\n(1T=0 .nr KG 1 \";not in abstract repeat next page. KI should be new
                   1105: .ev
                   1106: ..
                   1107: .de FA
                   1108: .if n __________________________
                   1109: .if t \l'1i'
                   1110: .br
                   1111: ..
                   1112: .de FV
                   1113: .FS
                   1114: .nf
                   1115: .ls 1
                   1116: .FY
                   1117: .ls
                   1118: .fi
                   1119: .FE
                   1120: ..
                   1121: .de FX
                   1122: .if \\n(XX>0 .di FY
                   1123: .if \\n(XX>0 .ns
                   1124: ..
                   1125: .de XF
                   1126: .if \\n(nlu+1v>(\\n(.pu-\\n(FMu) .ch FX \\n(nlu+1.9v
                   1127: .ev1
                   1128: .nf
                   1129: .ls 1
                   1130: .FF
                   1131: .rm FF
                   1132: .nr XX 0 1
                   1133: .br
                   1134: .ls
                   1135: .di
                   1136: .fi
                   1137: .ev
                   1138: ..
                   1139: .de FL
                   1140: .ev1
                   1141: .nr FL \\$1n
                   1142: .ll \\$1
                   1143: .ev
                   1144: ..
                   1145: .de UL \" underline argument, don't italicize
                   1146: .if t \\$1\l'|0\(ul'\\$2
                   1147: .if n .I \\$1 \\$2
                   1148: ..
                   1149: .em EM
                   1150: . \"  ACCENTS  say \*'e or \*`e to get e acute or e grave
                   1151: .ds ' \h'\w'e'u*4/10'\z\(aa\h'-\w'e'u*4/10'
                   1152: .ds ` \h'\w'e'u*4/10'\z\(ga\h'-\w'e'u*4/10'
                   1153: . \"  UMLAUT  \*:u, etc.
                   1154: .ds : \v'-0.6m'\h'(1u-(\\n(.fu%2u))*0.13m+0.06m'\z.\h'0.2m'\z.\h'-((1u-(\\n(.fu%2u))*0.13m+0.26m)'\v'0.6m'
                   1155: . \" TILDE and CIRCUMFLEX
                   1156: .ds ^ \\k:\h'-\\n(.fu+1u/2u*2u+\\n(.fu-1u*0.13m+0.06m'\z^\h'|\\n:u'
                   1157: .ds ~ \\k:\h'-\\n(.fu+1u/2u*2u+\\n(.fu-1u*0.13m+0.06m'\z~\h'|\\n:u'
                   1158: .      \" czech v symbol
                   1159: .ds C \\k:\\h'+\\w'e'u/4u'\\v'-0.6m'\\s6v\\s0\\v'0.6m'\\h'|\\n:u'
                   1160: .              \" cedilla
                   1161: .ds , \\k:\\h'\\w'c'u*0.4u'\\z,\\h'|\\n:u'
                   1162: .if n .ds oq ""
                   1163: .if n .ds cq ""
                   1164: .if n .ds OQ '
                   1165: .if n .ds CQ '
                   1166: .if n .ds em --
                   1167: .if t .ds oq ``
                   1168: .if t .ds cq ''
                   1169: .if t .ds OQ `
                   1170: .if t .ds CQ '
                   1171: .if t .ds em \(em
                   1172: .if n .na
                   1173: .if t .if \nd=0 .ss 4
                   1174: .if t .if \nd=1 .ss 10
                   1175: .if t .if \nd=2 .ss 12
                   1176: .if n .po 1i
                   1177: .if t .if \\nd=3 .po 1.0625i
                   1178: .if t .if \\nd=3 .nr PO 1.0625i
                   1179: .ds Ag a\(ga
                   1180: .ds At a\(um
                   1181: .ds Cd \o'c,'
                   1182: .ds Ea e\(aa
                   1183: .ds Eg e\(ga
                   1184: .ds Ic i\(cf\h'-\w'.'u'\^\^\^
                   1185: .ds Na n\(aa
                   1186: .ds Ol o\(um
                   1187: .ds Oo \s-2\v'-8u'o\v'8u'\s+2
                   1188: .ds eA E\(aa
                   1189: .ds mi -
                   1190: .if t .if !\nd .nr T. 1
                   1191: .ie \n(T. .ds M \fM
                   1192: .el .ds M \fB
                   1193: .if \nd .ds v+ \v'.25m'
                   1194: .if \nd .ds v- \v'-.25m'
                   1195: .ds ra >\^
                   1196: .ds lS \\*(v-+\(mi\(mi\(mi\\*(v+
                   1197: .ds rS \\*(v-\(mi\(mi\(mi\\*(ra
                   1198: .ds rE \\*(v+
                   1199: .ds CF \s10\fR\- \\n(PN \-\s0\fP
                   1200: .de dU
                   1201: .sp -.65
                   1202: ..
                   1203: .de dD
                   1204: .sp -.2
                   1205: ..
                   1206: .de Nt
                   1207: .Ds
                   1208: .ta 2.7i
                   1209: icon-project.arizona@csnet-relay       \fR(CSNET or ARPANET)\fP
                   1210: arizona!icon-project   \fR(Usenet and uucpnet)
                   1211: .De
                   1212: There are currently uucp connections to Arizona through
                   1213: \*Mnoao\fR, \*Mmcnc\fR, \*Mihnp4\fR, and \*Mutah-cs\fR.
                   1214: ..
                   1215: .ds U UNIX\u\s-2*\s0\d
                   1216: .de Un
                   1217: .FS
                   1218: \u\s-2*\s0\dUNIX is a trademark of AT&T Bell Laboratories.
                   1219: .FE
                   1220: ..
                   1221: .if \nv .ss 10
                   1222: .hy 14
                   1223: .de Gr
                   1224: .GR DCR-8401831
                   1225: ..
                   1226: .de Gi
                   1227: .GR DCR-8502015
                   1228: ..
                   1229: .de Gs
                   1230: .GR DCR-8401831 DCR-8502015
                   1231: ..
                   1232: .de Nh
                   1233: .sp -.8
                   1234: .NH
                   1235: ..
                   1236: .de Wd
                   1237: .ll 7.8i
                   1238: .lt 7.8i
                   1239: .nr LL 7.8i
                   1240: .nr LT 7.8i
                   1241: ..
                   1242: .de Pf
                   1243: .nr VS 20
                   1244: .vs 20
                   1245: ..
                   1246: .de do
                   1247: .if '\\$1'' .in +.5i
                   1248: .if !'\\$1'' .in +\\$1
                   1249: .vs 6p
                   1250: \&.
                   1251: \&.\\$2
                   1252: \&.
                   1253: .vs
                   1254: .in
                   1255: ..
                   1256: .de Ve
                   1257: .nf
                   1258: .sp -.5
                   1259: .do .74i
                   1260: ..
                   1261: .de tR
                   1262: .de SY
                   1263: .ch FO 16i
                   1264: .ch FX 16i
                   1265: .ll \\n(LLu
                   1266: .rs
                   1267: .sp |13P
                   1268: .ns
                   1269: .if \\n(TV .TY
                   1270: .if \\n(AV .AX
                   1271: .rs
                   1272: .sp |22P
                   1273: .if !'\\*(MN'' \\*(MN
                   1274: .ce 0
                   1275: .nf
                   1276: .sp |28P
                   1277: .ls 1
                   1278: .ll -\\n(.lu/12u
                   1279: .WB
                   1280: .ll \\n(LLu
                   1281: .ls
                   1282: .ce 1000
                   1283: .sp |8i
                   1284: \\*(DY
                   1285: .sp 2
                   1286: Department of Computer Science
                   1287: .sp 1
                   1288: The University of Arizona
                   1289: .sp 1
                   1290: Tucson, Arizona 85721
                   1291: .ce 0
                   1292: .sp |10i
                   1293: .na
                   1294: .fi
                   1295: .GX
                   1296: .br
                   1297: ..
                   1298: ..
                   1299: .ds d \s+5\fR\&.\h'-1.5p'\fP\s-5
                   1300: .ds t  
                   1301: .ds >= >=
                   1302: .ds >: >:
                   1303: .ds >> >>
                   1304: .ds <= <=
                   1305: .ds <: <:
                   1306: .ds << <<
                   1307: .ds <- <-
                   1308: .ds -> ->
                   1309: .ds <> <->
                   1310: .if n .fp 4 M c1
                   1311: .ds cf ^
                   1312: .ds fm '
                   1313: .ds sl /
                   1314: .ds v \fR|\fP
                   1315: .ds b \|
                   1316: .ds El \fR.\^.\^.\fP
                   1317: .ds sd \s8\v'.2m'\h'-0.4n'
                   1318: .ds su \v'-.2m'\s0
                   1319: .ds 0 \fIexpr\fP
                   1320: .ds 1 \fIexpr\*(sd1\*(su\fP
                   1321: .ds 2 \fIexpr\*(sd2\*(su\fP
                   1322: .ds 3 \fIexpr\*(sd3\*(su\fP
                   1323: .ds 4 \fIexpr\*(sd4\*(su\fP
                   1324: .ds 5 \fIexpr\*(sd5\*(su\fP
                   1325: .ds i \fIexpr\*(sdi\*(su\fP
                   1326: .ds n \fIexpr\*(sdn\*(su\fP
                   1327: .ds z \fIexpr\*(sd0\*(su\fP
                   1328: .de Ds
                   1329: .DS
                   1330: .tr -\\-'\\(fm/\\(sl
                   1331: .ie \n(T. .ss9
                   1332: .el .ss 20
                   1333: .Ta
                   1334: .In
                   1335: .if t \\*M\c
                   1336: ..
                   1337: .de De
                   1338: .ie \n(T. .ss4
                   1339: .el .ss 10
                   1340: .DE
                   1341: .ft R
                   1342: .tr -\\*(mi'\\*(fm/\\*(sl
                   1343: ..
                   1344: .de Dd
                   1345: .De
                   1346: .sp -.4
                   1347: .Ds
                   1348: ..
                   1349: .de Ua
                   1350: Technical Report \\$1, Department of Computer Science, The University of Arizona.
                   1351: ..
                   1352: .de
                   1353: .if \nv .ss 10
                   1354: .if \nv .rm CM
                   1355: .de Li
                   1356: .Sd
                   1357: .de Ta
                   1358: .ta 3i
                   1359: \\..
                   1360: .de Ti
                   1361: .ce 10
                   1362: \f3\\\\$1\f1
                   1363: .ce 0
                   1364: .sp 2
                   1365: .ds RF \s10\*(DY\s0
                   1366: .ds LF \s10\\\\$3\s0
                   1367: 'so \\\\$2
                   1368: .bp
                   1369: \\..
                   1370: ..
                   1371: .de Sd
                   1372: .am Ds
                   1373: .ps 8
                   1374: .vs 10
                   1375: .nr PS 8
                   1376: .nr VS 10
                   1377: \\..
                   1378: .am De
                   1379: .nr VS 12
                   1380: .nr PS 10
                   1381: .vs 12
                   1382: .ps 10
                   1383: \\..
                   1384: ..
                   1385: .de Qs
                   1386: .br
                   1387: .ps -1p
                   1388: .vs -1p
                   1389: .in +5n
                   1390: .ll -5n
                   1391: .sp
                   1392: ..
                   1393: .de Qe
                   1394: .br
                   1395: .ps +1p
                   1396: .vs +1p
                   1397: .in -5n
                   1398: .ll +5n
                   1399: .sp
                   1400: ..
                   1401: .de Qd
                   1402: .Qe
                   1403: .sp -.7
                   1404: .Qs
                   1405: ..
                   1406: .de Ap
                   1407: .bp
                   1408: .ce 10
                   1409: \f3\\$1\f1
                   1410: .ce 0
                   1411: .sp 2
                   1412: .if !''\\$2' .so \\$2
                   1413: ..
                   1414: .if \nd=3 .po 1.0625i
                   1415: .if \nd=3 .nr PO 1.0625i
                   1416: .if \nd=3 .ds M \fH
                   1417: .de CS
                   1418: .cs H 22
                   1419: .ft H
                   1420: ..
                   1421: .de CE
                   1422: .cs H
                   1423: .ft R
                   1424: ..
                   1425: .DA "June 4, 1986"
                   1426: .TR 86-13a
                   1427: .Gr
                   1428: .TL
                   1429: The Icon Program Library; Version 6.0
                   1430: .AU
                   1431: Ralph E. Griswold
                   1432: .AE
                   1433: .tr *\(**
                   1434: .SH
                   1435: Introduction
                   1436: .PP
                   1437: This version of the Icon program library is intended for use with
                   1438: Version 6.0 of Icon.
                   1439: Basic documentation for Version 6 of Icon is contained in the Icon book\*([<\*([[1\*(]]\*(>]
                   1440: and a supplementary report\*([<\*([[2\*(]]\*(>].
                   1441: .PP
                   1442: The library contains both complete programs and collections
                   1443: of procedures. The programs range from demonstrations and games to
                   1444: text-processing utilities. The procedures range from straightforward
                   1445: extensions to Icon's function repertoire to such
                   1446: relatively esoteric subjects as programmer-defined control operations.
                   1447: This manual is divided into two main parts according to the
                   1448: composition of the library:
                   1449: complete programs and collections of procedures.
                   1450: .PP
                   1451: While the library provides some useful application programs and
                   1452: components that may be helpful in building other programs, it also
                   1453: provides examples of Icon programming techniques. In particular, persons
                   1454: who are new to Icon may find it helpful to read the source code for
                   1455: the library to see how experienced persons program in Icon. While
                   1456: not all of the code is the best possible \(em far from it \(em
                   1457: it illustrates useful idioms and a variety programming techniques.
                   1458: .PP
                   1459: In the descriptions that follow, there are pointers to interesting
                   1460: programming techniques as well as several suggestions for
                   1461: extensions and improvements to programs.
                   1462: Such extensions are good exercises
                   1463: persons who are just starting in Icon. Some of these extensions, however, will
                   1464: challenge the most experienced Icon programmer.
                   1465: .SH
                   1466: Library Format
                   1467: .PP
                   1468: The root directory of the library is \*Mipl\fR (``Icon program library'').
                   1469: There are four subdirectories: \*Msource\fR, \*Mprogs\fR, \*Mprocs\fR,
                   1470: and \*Mdata\fR.
                   1471: The subdirectory \*Msource\fR contains Icon source code for both
                   1472: programs and procedure libraries. Compiled programs are in \*Mprogs\fR
                   1473: and translated procedures are in \*Mprocs\fR.
                   1474: The subdirectory \*Mdata\fR contains sample input for programs in
                   1475: \*Mprogs\fR. The names of programs and data files generally
                   1476: coincide, with the extensions of data files providing some
                   1477: differentiating identification. For example, the data file
                   1478: \*Mcsgen.abc\fR is input to the program \*Mcsgen\fR. There are
                   1479: also several files with the extension \*M.txt\fR
                   1480: that contain English-language text
                   1481: that is suitable as input to any of the programs
                   1482: that process text files.
                   1483: .SH
                   1484: Disclaimer
                   1485: .PP
                   1486: The material contained in the Icon program library is provided on
                   1487: an as-is basis. No claim is made that the programs are free of error
                   1488: or that they will function properly.
                   1489: The responsibility for the use of library material resides entirely
                   1490: with the user.
                   1491: .PP
                   1492: Notes of errors will be appreciated and corrections will be incorporated
                   1493: in future releases of the library.
                   1494: .SH
                   1495: New Material
                   1496: .PP
                   1497: Additions are made to the Icon program library from time to time.
                   1498: New material
                   1499: is welcome. Such material should be sent to:
                   1500: .DS
                   1501: .ft R
                   1502: Icon Project
                   1503: Department of Computer Science
                   1504: The University of Arizona
                   1505: Tucson, AZ   87521
                   1506: .DE
                   1507: Documentation similar in form to that provided in this manual \fImust\fR
                   1508: be included and test data should be provided where appropriate.
                   1509: The final decision on inclusion of material in the library resides
                   1510: with the Icon Project.
                   1511: .SH
                   1512: Acknowledgements
                   1513: .PP
                   1514: Several persons have contributed programs and procedures to the
                   1515: Icon program library.
                   1516: In addition to the author of this manual, these persons include
                   1517: Allan Anderson, Ward Cunningham, Tom Hicks, William
                   1518: Malloy, Bill Mitchell, Mike Novak, Randal Schwartz,
                   1519: Steve Wampler, and George Yee. See the source files for specific attributions.
                   1520: .ds CH \s10Programs\s0
                   1521: .bp
                   1522: .SH
                   1523: Introduction
                   1524: .PP
                   1525: Most programs take input from standard input and write
                   1526: output to standard output.
                   1527: Input and output can be redirected and piped in the usual fashion.
                   1528: For example,
                   1529: .Ds
                   1530: csgen <..\edata\ecsgen.abc | more
                   1531: .De
                   1532: runs the program \*Mcsgen\fR\s-2\u1\d\s0 on the data file \*Mcsgen.abc\fR in the parallel
                   1533: .FS
                   1534: \s-2\u1\d\s0\^On some systems, including DOS\*([<\*([[3\*(]]\*(>] and VMS\*([<\*([[4\*(]]\*(>],
                   1535: compiled programs cannot be run directly, but must be executed using
                   1536: \*Miconx\fR. For DOS, the example above is done as follows:
                   1537: .Ds
                   1538: iconx csgen <..\edata\ecsgen.abc | more
                   1539: .De
                   1540: .FE
                   1541: subdirectory and pipes the output through \*Mmore\fR.
                   1542: .PP
                   1543: Many programs take
                   1544: command line arguments, which may be the names of files to
                   1545: process or options that select specific processing functions.
                   1546: An option is prefixed by a dash, sometimes followed by an
                   1547: argument. For example,
                   1548: .Ds
                   1549: deal -h 5
                   1550: .De
                   1551: runs the program \*Mdeal\fR with the option \*M\-h\fR and the
                   1552: argument \*M5\fR.
                   1553: .PP
                   1554: If a program is not called with the proper options or arguments,
                   1555: it generally terminates with an error message such as
                   1556: .Ds
                   1557: usage: [ -h n ] [ -s n ]
                   1558: .De
                   1559: which indicates the proper usage. Some programs provide
                   1560: more specific errors messages. Error messages are written
                   1561: to standard error output. Standard error output
                   1562: is always written to the console and cannot be
                   1563: redirected.  Consult the descriptions of the
                   1564: programs that follow for details.
                   1565: .PP
                   1566: The programs that follow are divided into categories by their function.
                   1567: .NH
                   1568: Demonstrations and Games
                   1569: .PP
                   1570: .NH 2
                   1571: Non-Attacking Queens: \*Mqueens\fR
                   1572: .PP
                   1573: This program displays the solutions to the non-attacking
                   1574: \fIn\fR-queens problem: the ways in which \fIn\fR queens can be
                   1575: placed on an \fIn\fR-by-\fIn\fR chessboard so that no queen can
                   1576: attack another. A positive integer can be given as a command line
                   1577: argument to specify the number of queens. For example,
                   1578: .Ds
                   1579: iconx queens 8
                   1580: .De
                   1581: displays the solutions for 8 queens on an 8-by-8 chessboard.
                   1582: The default value in the absence of an argument is 6.
                   1583: One solution for six queens is:
                   1584: .br
                   1585: .ne 1.8i
                   1586: .in .5i
                   1587: .CS
                   1588:   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   1589:   |   | Q |   |   |   |   |
                   1590:   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   1591:   |   |   |   | Q |   |   |
                   1592:   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   1593:   |   |   |   |   |   | Q |
                   1594:   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   1595:   | Q |   |   |   |   |   |
                   1596:   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   1597:   |   |   | Q |   |   |   |
                   1598:   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   1599:   |   |   |   |   | Q |   |
                   1600:   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   1601: .sp .1
                   1602: .CE
                   1603: .in 0
                   1604: .LP
                   1605: \fBComments:\fR
                   1606: There are many approaches to programming solutions to the \fIn\fR-queens problem.
                   1607: This library program is worth reading for its
                   1608: programming techniques. Other solutions may be found in
                   1609: \*([[1\*(]] and\*([<\*([[5\*(]]\*(>].
                   1610: .NH 2
                   1611: Word Intersections: \*Mcross\fR
                   1612: .PP
                   1613: This program takes a list of words and tries to arrange them
                   1614: in cross-word format so that they intersect. Uppercase letters
                   1615: are mapped into lowercase letters on input.
                   1616: For example, the input
                   1617: .Ds
                   1618: and
                   1619: eggplants
                   1620: elephants
                   1621: purple
                   1622: .De
                   1623: produces the output
                   1624: .ne 2i
                   1625: .CS
                   1626: .nf
                   1627: .in .5i
                   1628: +\-\-\-\-\-\-\-\-\-+
                   1629: | p       |
                   1630: | u e     |
                   1631: | r g     |
                   1632: | p g     |
                   1633: |elephants|
                   1634: | e l     |
                   1635: |   and   |
                   1636: |   n     |
                   1637: |   t     |
                   1638: |   s     |
                   1639: +\-\-\-\-\-\-\-\-\-+
                   1640: .in 0
                   1641: .CE
                   1642: .LP
                   1643: \fBDiagnostics:\fR
                   1644: The program objects if the input contains a nonalphabetic
                   1645: character.
                   1646: .LP
                   1647: \fBComments:\fR
                   1648: This program produces only one possible intersection and
                   1649: it does not attempt to produce the most compact result.
                   1650: The program is not very fast, either.
                   1651: There is a lot of room for improvement here. In particular,
                   1652: it is natural for Icon to generate a sequence of solutions.
                   1653: .NH 2
                   1654: Bridge Hands: \*Mdeal
                   1655: .PP
                   1656: This program shuffles, deals, and displays hands in the game of bridge.
                   1657: An example of the output of \*Mdeal\fR is
                   1658: .br
                   1659: .ne 2.2i
                   1660: .CS
                   1661: .in .5i
                   1662: .nf
                   1663: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   1664: 
                   1665:           S: KQ987
                   1666:           H: 52
                   1667:           D: T94
                   1668:           C: T82
                   1669: 
                   1670: S: 3                S: JT4
                   1671: H: T7               H: J9863
                   1672: D: AKQ762           D: J85
                   1673: C: QJ94             C: K7
                   1674: 
                   1675:           S: A652
                   1676:           H: AKQ4
                   1677:           D: 3
                   1678:           C: A653
                   1679: 
                   1680: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   1681: .in 0
                   1682: .CE
                   1683: .LP
                   1684: \fBOptions:\fR
                   1685: The following options are available:
                   1686: .RS
                   1687: .IP "\*M\-h\fI n\fR" .5i
                   1688: Produce \fIn\fR hands. The default is 1.
                   1689: .IP "\*M\-s\fI n\fR"
                   1690: Set the seed for random generation to \fIn\fR.
                   1691: Different seeds give different hands.
                   1692: The default seed is 0.
                   1693: .RE
                   1694: .NH 2
                   1695: Farberisms: \*Mfarb
                   1696: .PP
                   1697: Dave Farber, co-author of the original SNOBOL programming language,
                   1698: is noted for his creative use of the English language. Hence the
                   1699: terms ``farberisms'' and ``to farberate''.
                   1700: This program produces a randomly selected farberism.
                   1701: .LP
                   1702: \fBNotes:\fR Not all of the farberisms contained in this program were
                   1703: uttered by the master himself; others have learned to emulate him.
                   1704: A few of the farberisms may be objectionable to some persons.
                   1705: ``I wouldn't marry her with a twenty-foot pole.''
                   1706: .NH
                   1707: Random Strings
                   1708: .PP
                   1709: The programs in this section involve the random generation of
                   1710: strings according to various criteria.
                   1711: These programs are only loosely related to each other.
                   1712: .NH 2
                   1713: Random Sentence Generation: \*Mrsg
                   1714: .PP
                   1715: This program generates randomly selected strings (``sentences'')
                   1716: from a grammar specified by
                   1717: the user.
                   1718: Grammars are basically context-free and resemble BNF in form, although
                   1719: there are a number of extensions.
                   1720: .PP
                   1721: The program works interactively, allowing the user to build, test, modify,
                   1722: and save grammars. Input to \*Mrsg\fR consists of various kinds of
                   1723: specifications, which can be intermixed:
                   1724: .PP
                   1725: \fIProductions\fR define nonterminal symbols in a syntax similar to 
                   1726: the rewriting rules of BNF with various alternatives consisting
                   1727: of the concatenation of nonterminal and terminal symbols.
                   1728: \fIGeneration specifications\fR cause the generation of a specified
                   1729: number of sentences from the language defined by a given nonterminal
                   1730: symbol.
                   1731: \fIGrammar output specifications\fR cause the definition of a
                   1732: specified nonterminal or the entire current grammar to be written
                   1733: to a given file.
                   1734: \fISource specifications\fR cause subsequent input to be read from
                   1735: a specified file.
                   1736: .PP
                   1737: In addition, any line beginning with \*M#\fR is considered to be
                   1738: a comment, while any line beginning with \*M=\fR causes the rest
                   1739: of that line to be used subsequently as a prompt to the user whenever \*Mrsg\fR
                   1740: is ready for input (there normally is no prompt). A line consisting
                   1741: of a single \*M=\fR stops prompting.
                   1742: .LP
                   1743: \fBProductions:\fR
                   1744: Examples of productions are:
                   1745: .Ds
                   1746: <expr>::=<term>|<term>+<expr>
                   1747: <term>::=<elem>|<elem>*<term>
                   1748: <elem>::=x|y|z|(<expr>)
                   1749: .De
                   1750: Productions may occur in any order. The definition for a nonterminal
                   1751: symbol can be changed by specifying a new production for it.
                   1752: .PP
                   1753: There are a number of special devices to facilitate the definition of
                   1754: grammars, including eight predefined, built-in nonterminal symbols:
                   1755: .nf
                   1756: .sp .5
                   1757: .ta .3i 1.2i
                   1758:        symbol  definition
                   1759: .sp .5
                   1760:        \*M<lb> <
                   1761:        <rb>    >
                   1762:        <vb>    |
                   1763:        <nl>\fR newline
                   1764:        \*M<>\fR        empty string
                   1765:        \*M<&lcase>\fR  any single lowercase letter
                   1766:        \*M<&ucase>\fR  any single uppercase letter
                   1767:        \*M<&digit>\fR  any single digit
                   1768: .sp 1
                   1769: .fi
                   1770: In addition, if the string between a \*M<\fR and a \*M>\fR
                   1771: begins and
                   1772: ends with a single quotation mark, it stands for
                   1773: any single character between the quotation marks. For example,
                   1774: .Ds
                   1775: <'xyz'>
                   1776: .De
                   1777: is equivalent to
                   1778: .Ds
                   1779: x|y|z
                   1780: .De
                   1781: Finally, if the name of a nonterminal symbol between the \*M<\fR and
                   1782: \*M>\fR begins with \*M?\fR, the user is queried during generation
                   1783: to supply a string for that nonterminal symbol. For example, in
                   1784: .Ds
                   1785: <expr>::=<?term>|<term>+<expr>
                   1786: .De
                   1787: if the first alternative is encountered during generation, the user is
                   1788: asked to provide a string for \*M<term>\fR.
                   1789: Note that this is a \fIstrongly\fR context-sensitive feature.
                   1790: .LP
                   1791: \fBGeneration Specifications:\fR
                   1792: A generation specification consists of a nonterminal symbol
                   1793: followed by a nonnegative integer. An example is
                   1794: .Ds
                   1795: <expr>10
                   1796: .De
                   1797: which specifies the generation of 10 \*M<expr>\fRs. If the
                   1798: integer is omitted, it is assumed to be 1. Generated sentences
                   1799: are written to standard output.
                   1800: .LP
                   1801: \fBGrammar Output Specifications:\fR
                   1802: A grammar output specification consists of a nonterminal symbol,
                   1803: followed by \*M\->\fR, followed by a file name. Such a specification
                   1804: causes the current definition of the nonterminal symbol to be
                   1805: written to the given file. If the file is omitted, standard output
                   1806: is assumed. If the nonterminal symbol is omitted, the entire grammar
                   1807: is written out. Thus,
                   1808: .Ds
                   1809: \->
                   1810: .De
                   1811: causes the entire grammar to be written to standard output.
                   1812: .LP
                   1813: \fBSource Specifications:\fR
                   1814: A source specification consists of \*M@\fR followed by a file name.
                   1815: Subsequent input is read from that file. When an end of file is encountered,
                   1816: input reverts to the previous file. Input files can be nested.
                   1817: .LP
                   1818: \fBOptions:\fR
                   1819: The following options are available:
                   1820: .RS
                   1821: .IP "\*M\-s\fI n\fR" .5i
                   1822: Set the seed for random generation to \fIn\fR.
                   1823: The default seed is 0.
                   1824: .IP "\*M\-l\fI n\fR"
                   1825: Terminate generation if the number of symbols remaining to be processed
                   1826: exceeds \fIn\fR. There is no default limit.
                   1827: .IP \*M\-t\fR
                   1828: Trace the generation of sentences. Trace output goes to standard error
                   1829: output.
                   1830: .RE
                   1831: .LP
                   1832: \fBDiagnostics:\fR
                   1833: Syntactically erroneous input lines are noted but are otherwise ignored.
                   1834: Specifications for a file that cannot be opened are noted and treated as
                   1835: erroneous.
                   1836: .PP
                   1837: If an undefined nonterminal symbol is encountered during generation,
                   1838: an error message that identifies the undefined symbol is produced,
                   1839: followed by the partial sentence generated to that point. Exceeding
                   1840: the limit of symbols remaining to be generated as specified by
                   1841: the \*M\-l\fR option is handled similarly.
                   1842: .LP
                   1843: \fBCaveats:\fR
                   1844: Generation may fail to terminate because of a loop in the rewriting
                   1845: rules or, more seriously, because of the progressive accumulation
                   1846: of nonterminal symbols. The latter problem can be identified
                   1847: by using the \*M\-t\fR option and controlled by using the \*M\-l\fR
                   1848: option. The problem often can be circumvented by duplicating alternatives
                   1849: that lead to fewer rather than more nonterminal symbols. For
                   1850: example, changing
                   1851: .Ds
                   1852: <term>::=<elem>|<elem>*<term>
                   1853: .De
                   1854: to
                   1855: .Ds
                   1856: <term>::=<elem>|<elem>|<elem>*<term>
                   1857: .De
                   1858: increases the probability of selecting \*M<elem>\fR from 1/2 to 2/3.
                   1859: See\*([<\*([[6\*(]]\*(>] for a discussion of the general
                   1860: problem.
                   1861: .LP
                   1862: \fBComments:\fR This program is an extension and elaboration of
                   1863: a program described in some detail in\*([<\*([[1\*(]]\*(>]. It illustrates
                   1864: many features of Icon, including a combination of string and
                   1865: list processing as well as extensive use of generators. The source
                   1866: code is worth studying.
                   1867: .PP
                   1868: There are many possible extensions to the program. One of the most
                   1869: useful would be a way to specify the probability of selecting
                   1870: an alternative.
                   1871: .NH 2
                   1872: Context-Sensitive Generation: \*Mcsgen
                   1873: .PP
                   1874: This program accepts a context-sensitive production grammar
                   1875: and generates randomly selected sentences from the corresponding
                   1876: language.
                   1877: See\*([<\*([[7\*(]]\*(>] for a discussion of such grammars.
                   1878: .PP
                   1879: Uppercase letters stand for nonterminal symbols and \*M\->\fR indicates the
                   1880: lefthand side can be rewritten by the righthand side. Other characters
                   1881: are considered to be terminal symbols. Lines beginning with \*M#\fR
                   1882: are considered to be comments and are ignored.
                   1883: A line consisting of a nonterminal symbol followed by a colon and
                   1884: a nonnegative integer \*Mi\fR is a generation specification for \fIi\fR
                   1885: instances of sentences for the language defined by the nonterminal
                   1886: (goal) symbol.
                   1887: An example of input to \*Mcsgen\fR is:
                   1888: .Ds
                   1889: #   a(n)b(n)c(n)
                   1890: #   Salomaa, p. 11.
                   1891: #   Attributed to M. Soittola.
                   1892: #
                   1893: X\->abc
                   1894: X\->aYbc
                   1895: Yb\->bY
                   1896: Yc\->Zbcc
                   1897: bZ\->Zb
                   1898: aZ\->aaY
                   1899: aZ\->aa
                   1900: X:10
                   1901: .De
                   1902: The output of \*Mcsgen\fR for this example is
                   1903: .Ds
                   1904: aaabbbccc
                   1905: aaaaaaaaabbbbbbbbbccccccccc
                   1906: abc
                   1907: aabbcc
                   1908: aabbcc
                   1909: aaabbbccc
                   1910: aabbcc
                   1911: abc
                   1912: aaaabbbbcccc
                   1913: aaabbbccc
                   1914: .De
                   1915: .PP
                   1916: A positive integer followed by a colon can be prefixed to a production
                   1917: to replicate that production, making its selection more likely. For
                   1918: example,
                   1919: .Ds
                   1920: 3:X\->abc
                   1921: .De
                   1922: is equivalent to
                   1923: .Ds
                   1924: X\->abc
                   1925: X\->abc
                   1926: X\->abc
                   1927: .De
                   1928: .LP
                   1929: \fBOption:\fR
                   1930: The \*M\-t\fR option writes a trace of the derivations to standard 
                   1931: error output.
                   1932: .LP
                   1933: \fBLimitations\fR:
                   1934: Nonterminal symbols can only be represented by single uppercase letters,
                   1935: and there is no way to represent uppercase letters as terminal symbols.
                   1936: .PP
                   1937: There can be only one generation specification and it must appear as
                   1938: the last line of input.
                   1939: .LP
                   1940: \fBComments:\fR
                   1941: Generation of context-sensitive strings is a slow process. It may not
                   1942: terminate, either because of a loop in the rewriting rules
                   1943: or because of the progressive accumulation of nonterminal symbols.
                   1944: The program avoids deadlock, in which there are no possible rewrites for
                   1945: a string in the derivation.
                   1946: .PP
                   1947: This program would be improved if the specification of nonterminal
                   1948: symbols were more general, as in \*Mrsg\fR.
                   1949: .NH 2
                   1950: Parenthesis-Balanced Strings: \*Mparens
                   1951: .PP
                   1952: This program produces parenthesis-balanced strings in which the
                   1953: parentheses are randomly distributed.
                   1954: .LP
                   1955: \fBOptions:\fR
                   1956: The following options are available:
                   1957: .RS
                   1958: .IP \*M\-b\0\fIn\fR .5i
                   1959: Bound the length of the strings to \fIn\fR left and right parentheses each. The default is 10.
                   1960: .IP \*M\-n\0\fIn\fR
                   1961: Produce \fIn\fR strings. The default is 10.
                   1962: .IP \*M\-l\0\fIs\fR
                   1963: Use the string \fIs\fR for the left parenthesis. The default is \*M(\fR .
                   1964: .IP \*M\-r\0\fIs\fR
                   1965: Use the string \fIs\fR for the right parenthesis. The default is \*M)\fR .
                   1966: .IP \*M\-v\fR
                   1967: Randomly vary the length of the strings between 0 and the bound.
                   1968: In the absence of this option, all strings are the exactly as long
                   1969: as the specified bound.
                   1970: .RE
                   1971: .PP
                   1972: For example, the output for
                   1973: .Ds
                   1974: parens -v -b 4 -l "begin " -r "end " 
                   1975: .De
                   1976: is
                   1977: .Ds
                   1978: begin end 
                   1979: begin end begin end 
                   1980: begin begin end end begin end 
                   1981: begin end begin begin end end 
                   1982: begin end 
                   1983: begin begin end end 
                   1984: begin begin begin end end end 
                   1985: begin end begin begin end end 
                   1986: begin end begin end 
                   1987: begin begin end begin end begin end end 
                   1988: .De
                   1989: .LP
                   1990: \fBComments:\fR This program was motivated by the need for test
                   1991: data for error repair schemes for block-structured programming
                   1992: langauges. 
                   1993: See\*([<\*([[8\*(]]\*(>]. A useful
                   1994: extension to this program would be some way of generating other
                   1995: text among the parentheses.
                   1996: In addition to the intended use of the program, it can produce
                   1997: a variety of interesting patterns, depending on the strings
                   1998: specified by \*M\-l\fR and \*M\-r\fR.
                   1999: .NH 2
                   2000: Shuffled Files: \*Mshuffile
                   2001: .PP
                   2002: This program writes a version of the input file with
                   2003: the lines shuffled.
                   2004: For example, the result of shuffling
                   2005: .Ds
                   2006:          On the Future!-how it tells
                   2007:          Of the rapture that impells
                   2008:         To the swinging and the ringing
                   2009:          Of the bells, bells, bells-
                   2010:       Of the bells, bells, bells, bells,
                   2011:                 Bells, bells, bells-
                   2012:   To the rhyming and the chiming of the bells!
                   2013: .De
                   2014: is
                   2015: .Ds
                   2016:   To the rhyming and the chiming of the bells!
                   2017:         To the swinging and the ringing
                   2018:                 Bells, bells, bells-
                   2019:          Of the bells, bells, bells-
                   2020:          On the Future!-how it tells
                   2021:       Of the bells, bells, bells, bells,
                   2022:          Of the rapture that impells
                   2023: .De
                   2024: .LP
                   2025: \fBOption:\fR
                   2026: The option \*M\-s\fI n\fR sets the seed for random generation to \fIn\fR.
                   2027: The default seed is 0.
                   2028: .LP
                   2029: \fBLimitation:\fR
                   2030: This program stores the input file in memory and shuffles pointers to
                   2031: the lines; there must be enough memory available to store the entire
                   2032: file.
                   2033: .ig
                   2034: .NH
                   2035: Turing Machines
                   2036: .NH
                   2037: Indexes
                   2038: ..
                   2039: .NH
                   2040: Text Tabulation
                   2041: .NH 2
                   2042: Character Tabulation:\*M tablc
                   2043: .PP
                   2044: This program tabulates characters and lists
                   2045: each character and the number of times it
                   2046: occurs. Characters are written using Icon's escape conventions.
                   2047: Line termination characters and other control characters are included in the tabulation.
                   2048: .LP
                   2049: \fBOptions:\fR
                   2050: The following options are available:
                   2051: .RS
                   2052: .IP \*M\-a\fP .5i
                   2053: Write the summary in alphabetical order of the characters. This is the
                   2054: default.
                   2055: .IP \*M\-n\fP
                   2056: Write the summary in numerical order of the counts.
                   2057: .IP \*M\-u\fP
                   2058: Write only the characters that occur just once.
                   2059: .RE
                   2060: .NH 2
                   2061: Word Tabulation: \*Mtablw
                   2062: .PP
                   2063: This program tabulates words and lists 
                   2064: number of times each word 
                   2065: occurs. A word is defined to be a string of consecutive
                   2066: upper- and lowercase letters with at most one interior occurrence
                   2067: of a dash or apostrophe.
                   2068: .LP
                   2069: \fBOptions:\fR
                   2070: The following options are available:
                   2071: .RS
                   2072: .IP \*M\-a\fP .5i
                   2073: Write the summary in alphabetical order of the words. This is the
                   2074: default.
                   2075: .IP \*M\-i\fR
                   2076: Ignore case distinctions among letters; uppercase letters are mapped into
                   2077: to corresponding lowercase letters on input. The default is to
                   2078: maintain case distinctions.
                   2079: .IP \*M\-n\fP
                   2080: Write the summary in numerical order of the counts.
                   2081: .IP "\*M\-l \fIn\fR"
                   2082: Tabulate only words longer than \fIn\fR characters. The default
                   2083: is to tabulate all words.
                   2084: .IP \*M\-u\fP
                   2085: Write only the words that occur just once.
                   2086: .RE
                   2087: .NH
                   2088: Mailing Labels
                   2089: .NH 2
                   2090: Produce Mailing Labels: \*Mlabels
                   2091: .PP
                   2092: This program produces labels using
                   2093: coded information taken from the input file.  In the input file, a line
                   2094: beginning with \*M#\fR is a label header.  Subsequent lines up to the
                   2095: next header or end-of-file are accumulated and output so as to be
                   2096: centered horizontally and vertically on 
                   2097: label forms.  Lines beginning with \*M*\fR are treated as comments
                   2098: and are ignored.
                   2099: .LP
                   2100: \fBOptions:\fR
                   2101: The following options are available:
                   2102: .RS
                   2103: .IP \*M\-c\ \fIn\fR .5i
                   2104: Print \fIn\fR copies of each label.
                   2105: .IP "\*M\-s\fP\0\fIs\fP"
                   2106: Select only those labels whose headers contain a character
                   2107: in \fIs\fP.
                   2108: .IP \*M\-t\fP
                   2109: Format for curved tape labels (the default is to format
                   2110: for rectangular mailing labels).
                   2111: .IP "\*M\-w\ \fIn\fR"
                   2112: Limit line width to \fIn\fR characters. The default width is 40.
                   2113: .IP "\*M\-l\ \fIn\fR"
                   2114: Limit the number of printed lines per label to \fIn\fR. The default
                   2115: is 8.
                   2116: .IP "\*M\-d\ \fIn\fR"
                   2117: Limit the depth of the label to \fIn\fR. The default is 9 for
                   2118: rectangular labels and 12 for tape labels (\*M\-t\fR).
                   2119: .IP \*M\-f\fR
                   2120: Print the first line of each selected entry instead of labels.
                   2121: .RE
                   2122: .PP
                   2123: Options are processed from left to right.
                   2124: If the number of printed lines is set to a value that exceeds the depth of the label, the
                   2125: depth is set to the number of lines.
                   2126: If the depth is set to a value that is less than the number of printed
                   2127: lines, the number of printed lines is set to the depth. Note that
                   2128: the order in which these options are specified may affect the
                   2129: results.
                   2130: .LP
                   2131: \fBPrinting Labels:\fR
                   2132: Label forms should be used with a pin-feed platen.  For mailing labels,
                   2133: the carriage
                   2134: should be adjusted so that the first character is printed at the
                   2135: leftmost position on the label and so that the first line of the
                   2136: output is printed on the topmost line of the label.
                   2137: For curved tape labels, some experimentation may be required
                   2138: to get the text positioned properly.
                   2139: .LP
                   2140: \fBDiagnostics:\fR
                   2141: If the limits on line width or the number of lines per label are exceeded,
                   2142: a label
                   2143: with an error message is written to standard error output.
                   2144: .NH 2
                   2145: Zip Code Sorting: \*Mzipsort
                   2146: .PP
                   2147: This program sorts labels produced by \*Mlabels\fR in ascending order of
                   2148: their postal zip codes.
                   2149: .LP
                   2150: \fBOption:\fR
                   2151: The option \*M\-d\ \fIn\fR sets the number of lines per label to \fIn\fR.
                   2152: The default is 9. This value must agree with the value used to format
                   2153: the labels.
                   2154: .LP
                   2155: \fBZip Codes:\fR
                   2156: The zip code must be the last nonblank string at the end of the label.
                   2157: It must consist of digits but may have an embedded dash for extended zip codes.
                   2158: If a label does not end with a legal zip code,
                   2159: it is placed after
                   2160: all labels with legal zip codes.
                   2161: In such a case, an error messages also is written to standard error
                   2162: output.
                   2163: .NH
                   2164: Laminated Files
                   2165: .NH 2
                   2166: Laminating Files: \*Mlam
                   2167: .PP
                   2168: This program laminates files named on the command line onto the standard output,
                   2169: producing a concatenation
                   2170: of corresponding lines from each file named.
                   2171: If the files are different lengths,
                   2172: empty lines are substituted for missing lines in the shorter files.
                   2173: A command line argument of the form
                   2174: \*M\- \fIs
                   2175: \fRcauses the string \fIs\fR to be inserted between the concatenated
                   2176: file lines.
                   2177: .PP
                   2178: Each command line
                   2179: argument is placed in the output line
                   2180: at the point that it appears in the argument list.
                   2181: For example, lines from \*Mfile1\fR and \*Mfile2\fR can be laminated
                   2182: with a colon between each line from \*Mfile1\fR and the corresponding
                   2183: line from \*Mfile2\fR by the command
                   2184: .Ds
                   2185: lam file1 \-: file2
                   2186: .De
                   2187: .PP
                   2188: File names and strings may appear in any order in the argument list.
                   2189: If
                   2190: \*M\-\fR
                   2191: is given for a file name,
                   2192: standard input is read at that point.
                   2193: If a file is named more than once,
                   2194: each of its lines will be duplicated on the output line,
                   2195: except that if standard input is named more than once,
                   2196: its lines will be read alternately.
                   2197: For example, each pair of lines from standard input can be
                   2198: joined onto one line with a space between them by the command
                   2199: .Ds
                   2200: lam \- "\-\0" \-
                   2201: .De
                   2202: .LP
                   2203: while the command
                   2204: .Ds
                   2205: lam file1 "\-\0" file1
                   2206: .De
                   2207: .LP
                   2208: replicates each line from \*Mfile1\fR.
                   2209: .NH 2
                   2210: Delaminating Files: \*Mdelam
                   2211: .PP
                   2212: This program delaminates standard input into several output files
                   2213: according to the specified fields.
                   2214: It writes the fields in each line to the
                   2215: corresponding output files as individual lines. If no data occurs in
                   2216: the specified position for a given input line an empty output line is
                   2217: written. This insures that all output files contain the same number of
                   2218: lines as the input file.
                   2219: .PP
                   2220: If \*M\-\fR is used for the input file, the standard input is read.
                   2221: If \*M\-\fR is used as an output file name, the corresponding field
                   2222: is written to the standard output.
                   2223: .PP
                   2224: The fields are defined by a list of field
                   2225: specifications, separated by commas, colons, or semicolons, of the
                   2226: following form:
                   2227: .Ds
                   2228: .ft I
                   2229: .ta .5i
                   2230: n      \fRthe character in column \fIn
                   2231: n\*M\-\fIm     \fRthe characters in columns \fIn\fR through \fIm
                   2232: n+m            m \fRcharacters beginning at column \fIn
                   2233: .ft R
                   2234: .De
                   2235: where the columns in a line are numbered from 1 to the length of the
                   2236: line.
                   2237: .PP
                   2238: The use of \*Mdelam\fR is illustrated by the following examples.
                   2239: The command
                   2240: .Ds
                   2241: delam 1\-10,5 x.txt y.txt
                   2242: .De
                   2243: reads standard input and writes characters 1 through 10 to file \*Mx.txt\fR and
                   2244: character 5 to file \*My.txt\fR.
                   2245: The command
                   2246: .Ds
                   2247: delam 10+5:1\-10:1\-10:80 mid x1 x2 end
                   2248: .De
                   2249: writes characters 10 through 14 to
                   2250: \*Mmid\fR, 1 through 10 to \*Mx1\fR and \*Mx2\fR, and character 80 to
                   2251: \*Mend\fR.
                   2252: The command
                   2253: .Ds
                   2254: delam 1\-80;1\-80 \- \-
                   2255: .De
                   2256: copies standard input to standard output, replicating the
                   2257: first eighty columns of each line twice.
                   2258: .NH 2
                   2259: Delaminating Files by Separators: \*Mdelamc
                   2260: .PP
                   2261: This program delaminates standard input into several output files
                   2262: according to the separator characters specified by the string
                   2263: following the \*M\-t\fR option.
                   2264: It writes the fields in each line to the
                   2265: corresponding output files as individual lines. If no data occurs in
                   2266: the specified position for a given input line an empty output line is
                   2267: written. This insures that all output files contain the same number of
                   2268: lines as the input file.
                   2269: .PP
                   2270: If \*M\-\fR is used as an output file name, the corresponding field
                   2271: is written to the standard output. If the \*M\-t\fR option is not used,
                   2272: an ascii horizontal tab character is assumed as the default
                   2273: field separator.
                   2274: .PP
                   2275: The use of \*Mdelamc\fR is illustrated by the following examples.
                   2276: The command
                   2277: .Ds
                   2278: delamc labels opcodes operands
                   2279: .De
                   2280: writes the fields of standard input, each of which
                   2281: is separated by a tab character, to the output files \*Mlabels\fR,
                   2282: \*Mopcodes\fR,
                   2283: and \*Moperands\fR.
                   2284: The command
                   2285: .Ds
                   2286: delamc \-t: scores names matric ps1 ps2 ps3
                   2287: .De
                   2288: writes the fields of standard input, each of which are separated
                   2289: by a colon, to the indicated output files.
                   2290: The command
                   2291: .Ds
                   2292: delamc \-t,: oldata f1 f2
                   2293: .De
                   2294: separates the fields using either a comma or a colon.
                   2295: .NH
                   2296: Icon Program Utilities
                   2297: .NH 2
                   2298: Icon Program Cross Reference: \*Mipxref
                   2299: .PP
                   2300: This program cross-references Icon programs. It lists
                   2301: the occurrences of each variable by line number. Variables are listed
                   2302: by procedure or separately as globals.
                   2303: The options specify the formatting of the
                   2304: output and whether or not to cross-reference quoted strings and
                   2305: non-alphanumerics. Variables that are followed by a left parenthesis
                   2306: are listed with an asterisk following the name.
                   2307: If a file is not specified, then standard input is cross-referenced.
                   2308: .LP
                   2309: \fBOptions:\fR
                   2310: The following options change the format defaults:
                   2311: .RS
                   2312: .IP "\*M\-c\fR \fIn\fR" 0.5i
                   2313: The column width per line number. The default is 4 columns wide.
                   2314: .IP "\*M\-l\fR \fIn\fR"
                   2315: The starting column (i.e. left margin) of the line numbers.
                   2316: The default is column 40.
                   2317: .IP "\*M\-w\fR \fIn\fR"
                   2318: The column width of the whole output line. The default is 80 columns wide.
                   2319: .RE
                   2320: .PP
                   2321: Normally only alphanumerics are cross-referenced. These options expand
                   2322: what is considered:
                   2323: .RS
                   2324: .IP \*M\-q\fR 0.5i
                   2325: Include quoted strings.
                   2326: .IP \*M\-x\fR
                   2327: Include all non-alphanumerics.
                   2328: .RE
                   2329: .LP
                   2330: \fBNote:\fR
                   2331: This program assumes the subject file is a valid Icon program. For example,
                   2332: quotes are expected to be matched.
                   2333: .NH 2
                   2334: Sort Icon Declarations: \*Mipsort
                   2335: .PP
                   2336: This program reads an Icon program and writes
                   2337: an equivalent program with the procedures
                   2338: sorted alphabetically. Global, link, and record declarations
                   2339: come first in the order they appear in the original program.
                   2340: The main procedure comes next followed by the remaining procedures
                   2341: in alphabetical order.
                   2342: .PP
                   2343: Comments and white space between declarations are attached to the next
                   2344: following declaration.
                   2345: .LP
                   2346: \fBLimitations:\fR
                   2347: This program only recognizes declarations that start at the beginning
                   2348: of a line.
                   2349: .PP
                   2350: Comments and interline white space between declarations may not come
                   2351: out as intended.
                   2352: .NH 2
                   2353: Icon Program Splitting: \*Mipsplit
                   2354: .PP
                   2355: This progam reads an Icon program and writes
                   2356: each procedure to a separate file. The output file names consist of
                   2357: the procedure name with \*M.icn\fR appended.
                   2358: If the \*M\-g\fR option is specified, any
                   2359: global, link, and record declarations
                   2360: are written to that file. Otherwise they are written in the file for
                   2361: the procedure that immediately follows them.
                   2362: .PP
                   2363: Comments and white space between declarations are attached to the next
                   2364: following declaration.
                   2365: .LP
                   2366: \fBNotes:\fR
                   2367: The program only recognizes declarations that start at the beginning
                   2368: of lines.
                   2369: Comments and interline white space between declarations may not come
                   2370: out as intended.
                   2371: .PP
                   2372: If the \*M\-g\fR option is not specified, any global, link, or
                   2373: record declarations that follow the last procedure are discarded.
                   2374: .NH
                   2375: Miscellaneous Utilities
                   2376: .NH 2
                   2377: Line Lengths: \*Mll
                   2378: .PP
                   2379: This program prints the lengths of the shortest and longest lines
                   2380: in files named on the command line.
                   2381: If there is no command line argument, the standard input is used.
                   2382: The argument \*M\-\fR may be used to explicitly specify the standard input.
                   2383: .NH 2
                   2384: Trimming Lines: \*Mtrim
                   2385: .PP
                   2386: This program copies lines from standard input to standard output, truncating
                   2387: the lines at \fIn\fR characters and removing any trailing blanks. The
                   2388: default value for \fIn\fR is 80.
                   2389: For example,
                   2390: .Ds
                   2391: trim 70 <grade.txt >grade.fix
                   2392: .De
                   2393: copies \*Mgrade.txt\fR to \*Mgrade.fix\fR, with lines longer than
                   2394: 70 characters truncated to 70 characters and the trailing blanks removed from
                   2395: all lines.
                   2396: .PP
                   2397: The \*M\-f\fR option causes all lines to be \fIn\fR characters long
                   2398: by adding blanks to short lines;
                   2399: otherwise, short lines are left as is.
                   2400: .NH 2
                   2401: Sorting Groups of Lines: \*Mgrpsort
                   2402: .PP
                   2403: This program sorts input containing ``records'' defined to be
                   2404: groups of consecutive lines. Output is written to standard output.
                   2405: Each input record is separated by one or more repetitions of a 
                   2406: demarcation line (a line beginning with the separator string).
                   2407: The first line of each record is used as the key.
                   2408: .PP
                   2409: If no separator string is specified on the command line,
                   2410: the default is the empty string. Because all input lines
                   2411: are trimmed of whitespace (blanks and tabs), empty lines are default
                   2412: demarcation lines. The separator string specified can be an initial
                   2413: substring of the string used to demarcate lines, in which case the
                   2414: resulting partition of the input file may be different
                   2415: from a partition created using the entire demarcation string.
                   2416: .PP
                   2417: The \*M\-o\fP option sorts the input file but does not produce the sorted records.
                   2418: Instead it lists the keys (in sorted order) and line numbers defining the
                   2419: extent of the record associated with each key.
                   2420: .PP
                   2421: The use of \*Mgrpsort\fR is illustrated by the following examples.
                   2422: The command
                   2423: .Ds
                   2424: grpsort "catscats" <x >y
                   2425: .De
                   2426: sorts the file \*Mx\fR, whose records are separated by
                   2427: lines containing the
                   2428: string \*M"catscats"\fR, into the file \*My\fR placing a single line
                   2429: of \*M"catscats"\fR between each output record. Similarly, the
                   2430: command
                   2431: .Ds
                   2432: grpsort "cats" <x >y
                   2433: .De
                   2434: sorts the file \*Mx\fR as before but assumes that any line beginning with the
                   2435: string \*M"cats"\fR delimits a new record. This may or may not divide the
                   2436: lines of the input file into a number of records different from the previous
                   2437: example.
                   2438: In any case, the output records will be separated by a single line of \*M"cats"\fR.
                   2439: Another example is
                   2440: .Ds
                   2441: grpsort \-o <bibliography >bibkeys
                   2442: .De
                   2443: which sorts the file \*Mbibliography\fR and produces a sorted list of
                   2444: the keys and the extents of the associated records in \*Mbibkeys\fR.
                   2445: Each output key line is of the form:
                   2446: .ne 10
                   2447: .Ds
                   2448: [s\-e] key
                   2449: .De
                   2450: where
                   2451: .Ds
                   2452: .ta .6i
                   2453: .ss 4
                   2454: \*Ms\fR        is the line number of the key line
                   2455: \*Me\fR        is the line number of the last line
                   2456: \*Mkey\fR      is the actual key of the record
                   2457: .De
                   2458: .ds CH \s10Procedures\s0
                   2459: .bp
                   2460: .SH
                   2461: Introduction
                   2462: .PP
                   2463: Collections of translated procedures are in the distribution directory \*Mprocs\fR.
                   2464: These files can be linked into other programs.
                   2465: .PP
                   2466: For example, to include the procedures in \*Mgener.icn\fR in
                   2467: an Icon program, the following link declaration can be used\s-2\u2\d\s0:
                   2468: .Ds
                   2469: link "/ipl/procs/gener"
                   2470: .De
                   2471: .FS
                   2472: \s-2\u2\d\s0\^In DOS, backslashes can be used in place of slashes in such link
                   2473: declarations, but they must be escaped, as in
                   2474: .Ds
                   2475: link "\e\eipl\e\eprocs\e\egener"
                   2476: .De
                   2477: .FE
                   2478: .NH 0
                   2479: Math Procedures: \*Mmath
                   2480: .LP
                   2481: The following procedures compute standard trigonometric functions.
                   2482: The arguments are in radians.
                   2483: .RS
                   2484: .IP \*Msin(x)\fR 1i
                   2485: sine of \*Mx\fR
                   2486: .IP \*Mcos(x)\fR
                   2487: cosine of \*Mx\fR
                   2488: .IP \*Mtan(x)\fR
                   2489: tangent of \*Mx\fR
                   2490: .IP \*Masin(x)\fR
                   2491: arc sine of \*Mx\fR in the range \-\(*p/2 to \(*p/2
                   2492: .IP \*Macos(x)\fR
                   2493: arc cosine of \*Mx\fR in the range 0 to \(*p
                   2494: .IP \*Matan(x)\fR
                   2495: arc tangent of \*Mx\fR in the range \-\(*p/2 to \(*p/2
                   2496: .IP \*Matan2(y,x)\fR
                   2497: arc tangent of \*Mx/y\fR in the range \-\(*p to \(*p
                   2498: .RE
                   2499: .LP
                   2500: The following procedures convert from degrees to radians and conversely:
                   2501: .RS
                   2502: .IP \*Mdtor(d)\fR 1i
                   2503: radian equivalent of \*Md\fR
                   2504: .IP \*Mrtod(r)\fR
                   2505: degree equivalent of \*Mr\fR
                   2506: .RE
                   2507: .LP
                   2508: The following
                   2509: additional procedures are available:
                   2510: .RS
                   2511: .IP \*Msqrt(x)\fR 1i
                   2512: square root of \*Mx\fR
                   2513: .IP \*Mexp(x)\fR
                   2514: exponential function of \*Mx\fR
                   2515: .IP \*Mlog(x)\fR
                   2516: natural logarithm of \*Mx\fR
                   2517: .IP \*Mlog10(x)\fR
                   2518: base-10 logarithm of \*Mx\fR
                   2519: .IP \*Mfloor(x)\fR
                   2520: largest integer not greater than \*Mx\fR
                   2521: .IP \*Mceil(x)\fR
                   2522: smallest integer nor less than \*Mx\fR
                   2523: .RE
                   2524: .LP
                   2525: \fBFailure Conditions:\fR
                   2526: \*Masin(x)\fR and \*Macos(x)\fR fail if the absolute value of \*Mx\fR is
                   2527: greater than one. \*Msqrt(x)\fR, \*Mlog(x)\fR, and \*Mlog10(x)\fR
                   2528: fail if \*Mx\fR is less than zero.
                   2529: .NH
                   2530: Bit Operations: \*Mbitops
                   2531: .LP
                   2532: The following procedures perform operations on characters strings of zeros and
                   2533: ones (``bit strings'').
                   2534: .RS
                   2535: .IP \*Mand(b1,\*bb2)\fR 1i
                   2536: logical ``and'' of \*Mb1\fR and \*Mb2\fR
                   2537: .IP \*Mbitstring(i)\fR
                   2538: convert integer \*Mi\fR to bit string
                   2539: .IP \*Mbsum(b1,\*bb2)\fR
                   2540: arithmetic sum of \*Mb1\fR and \*Mb2\fR
                   2541: (used by other procedures)
                   2542: .IP \*Mdecimal(b)\fR
                   2543: convert \*Mb\fR to integer
                   2544: .IP \*Mexor(b1,\*bb2)\fR
                   2545: ``exclusive-or'' of \*Mb1\fR and \*Mb2\fR
                   2546: .IP \*Mneg(b)\fR
                   2547: negation of \*Mb\fR
                   2548: .IP \*Mor(b1,\*bb2)\fR
                   2549: logical ``or'' of \*Mb1\fR and \*Mb2\fR
                   2550: .RE
                   2551: .LP
                   2552: \fBNote:\fR
                   2553: If \*Mi\fR in \*Mbitstring(i)\fR is negative, the value produced is
                   2554: the corresponding unsigned 32-bit bit string.
                   2555: .LP
                   2556: \fBBugs:\fR
                   2557: Integer values that exceed those allowable in Icon may produce bogus
                   2558: results or spurious diagnostics.
                   2559: .NH
                   2560: Radix Conversions: \*Mradcon
                   2561: .LP
                   2562: The following procedures convert numbers from one radix to another. The letters
                   2563: from \*Ma\fR to \*Mz\fR are used for ``digits'' greater than 9. All the
                   2564: conversion procedures fail if the conversion cannot be made.
                   2565: .RS
                   2566: .IP \*Mexbase10(i,\*bj)\fR 1i
                   2567: convert base-10 integer \*Mi\fR to base \*Mj\fR
                   2568: .IP \*Minbase10(s,\*bi)\fR
                   2569: convert base-\*Mi\fR integer \*Ms\fR to base 10
                   2570: .IP \*Mradcon(s,\*bi,\*bj)\fR
                   2571: convert base-\*Mi\fR integer \*Ms\fR to base \*Mj\fR
                   2572: .RE
                   2573: .LP
                   2574: \fBLimitation:\fR
                   2575: The maximum base allowed is 36.
                   2576: .ig
                   2577: .NH
                   2578: Formatting Numbers: \*Mnumbers
                   2579: ..
                   2580: .NH
                   2581: Complex Arithmetic: \*Mcomplex
                   2582: .LP
                   2583: The following procedures perform operations on complex numbers.
                   2584: .RS
                   2585: .IP \*Mcomplex(r,\*bi)\fR 1i
                   2586: create complex number with real part \*Mr\fR
                   2587: and imaginary part \*Mi\fR
                   2588: .IP \*Mcpxadd(x1,\*bx2)\fR
                   2589: add complex numbers \*Mx1\fR and \*Mx2\fR
                   2590: .IP \*Mcpxdiv(x1,\*bx2)\fR
                   2591: divide complex number \*Mx1\fR by complex number \*Mx2\fR
                   2592: .IP \*Mcpxmul(x1,\*bx2)\fR
                   2593: multiply complex number \*Mx1\fR by complex number \*Mx2\fR
                   2594: .IP \*Mcpxsub(x1,\*bx2)\fR
                   2595: subtract complex number \*Mx2\fR from complex number \*Mx1\fR
                   2596: .IP \*Mcpxstr(x)\fR
                   2597: convert complex number \*Mx\fR to string representation
                   2598: .IP\*Mstrcpx(s)\fR
                   2599: convert string representation \*Ms\fR of complex number
                   2600: to complex number
                   2601: .RE
                   2602: .NH
                   2603: Collated Strings: \*Mcollate
                   2604: .LP
                   2605: These procedures collate (interleave) respective characters of two
                   2606: strings and decollate such strings by selecting every other character of a string.
                   2607: produce a string consisting of
                   2608: interleaved characters of \*Ms1\fR and \*Ms2\fR.
                   2609: .RS
                   2610: .IP \*Mcollate(s1,\*bs2)\fR 1i
                   2611: collate the characters of \*Ms1\fR and \*Ms2\fR.
                   2612: For example,
                   2613: .sp .5
                   2614:      \*Mcollate("abc",\*b"def")\fR
                   2615: .sp .5
                   2616: produces \*M"adbecf"\fR.
                   2617: .IP \*Mdecollate(s,\*bi)\fR
                   2618: produce a string consisting of
                   2619: every other character of \*Ms\fR. If \*Mi\fR
                   2620: is odd, the odd-numbered characters are selected, while if \*Mi\fR
                   2621: is even, the even-numbered characters are selected.
                   2622: .RE
                   2623: .LP
                   2624: \fBDiagnostics:\fR
                   2625: Run-time error 208 occurs if the arguments to \*Mcollate\fR are not
                   2626: of the same size.
                   2627: .NH
                   2628: Emphasized Text: \*Mbold
                   2629: .LP
                   2630: These procedures produce text with interspersed characters suitable for
                   2631: printing to produce the effect of boldface (by overstriking) and
                   2632: underscoring (using backspaces).
                   2633: .RS
                   2634: .IP \*Mbold(s)\fR 1i
                   2635: bold version of \*Ms
                   2636: .IP \*Muscore(s)\fR
                   2637: underscored version of \*Ms
                   2638: .RE
                   2639: .NH
                   2640: Shuffling: \*Mshuffle
                   2641: .LP
                   2642: The procedure \*Mshuffle(x)\fR shuffles a string or list. In the case
                   2643: that \*Mx\fR is a string, a corresponding string with the characters
                   2644: randomly rearranged is produced. In the case that \*Mx\fR is a list,
                   2645: the values in the list are randomly rearranged.
                   2646: .NH
                   2647: Segmented Strings: \*Msegment
                   2648: .LP
                   2649: The procedure \*Msegment(s,\*bc)\fR generates
                   2650: consecutive substrings of \*Ms\fR consisting of characters that
                   2651: respectively do/do not occur in \*Mc\fR.
                   2652: For example,
                   2653: .Ds
                   2654: segment("Not a sentence.",\*b&lcase ++ &ucase)
                   2655: .De
                   2656: generates
                   2657: .Ds
                   2658: "Not"
                   2659: " "
                   2660: "a"
                   2661: " "
                   2662: "sentence"
                   2663: "."
                   2664: .De
                   2665: .NH
                   2666: String Utilities: \*Mstrutil
                   2667: .LP
                   2668: These procedures perform simple operations on strings.
                   2669: .RS
                   2670: .IP \*Mcompress(s,\*bc)\fR 1i
                   2671: compress consecutive occurrences of characters in \*Mc\fR that occur in \*Ms\fR
                   2672: .IP \*Mdelete(s,\*bc)\fR
                   2673: delete all occurrences of characters in \*Mc\fR that occur in \*Ms\fR
                   2674: .IP \*Mrotate(s,\*bi)\fR
                   2675: rotate \*Ms\fR \*Mi\fR characters to the left (negative \*Mi\fR produces
                   2676: rotation to the right); the default value of \*Mi\fR is 1
                   2677: .RE
                   2678: .NH
                   2679: Structure Utilities: \*Mstructs
                   2680: .LP
                   2681: These procedures manipulate trees and acyclic graphs (dags).
                   2682: The structures are represented with lists.
                   2683: See\*([<\*([[1\*(]]\*(>].
                   2684: .RS
                   2685: .IP \*Mdepth(t)\fR 1i
                   2686: compute maximum depth of tree \*Mt\fR
                   2687: .IP \*Meq(x,\*by)\fR
                   2688: compare list structures \*Mx\fR and \*My\fR
                   2689: .IP \*Mldag(s)\fR
                   2690: construct a dag from the string \*Ms\fR
                   2691: .IP \*Mltree(s)\fR
                   2692: construct a tree from the string \*Ms\fR
                   2693: .IP \*Mstree(t)\fR
                   2694: construct a string from the tree \*Mt\fR
                   2695: .IP \*Mtcopy(t)\fR
                   2696: copy tree \*Mt\fR
                   2697: .IP \*Mteq(t1,\*bt2)\fR
                   2698: compare trees \*Mt1\fR and \*Mt2\fR
                   2699: .IP \*Mvisit(t)\fR
                   2700: visit, in preorder, the nodes of the tree \*Mt\fR
                   2701: .RE
                   2702: .LP
                   2703: \fBNote:\fR
                   2704: The procedure \*Mldag\fR has a second argument that is used on internal
                   2705: recursive calls; a second argument must not be supplied by the user.
                   2706: .NH
                   2707: Icon Literal Escapes: \*Mescape
                   2708: .LP
                   2709: The procedure \*Mescape(s)\fR produces a string in which Icon
                   2710: quoted literal escape conventions in \*Ms\fR are replaced by the corresponding
                   2711: characters.
                   2712: For example, \*Mescape("\e\e143\e\e141\e\e164")\fR produces the string \*M"cat"\fR.
                   2713: .NH
                   2714: Images of Icon Values: \*Mimage
                   2715: .LP
                   2716: The procedure \*MImage(x)\fR produces a string
                   2717: image of the value \*Mx\fR. The value produced is a generalization of
                   2718: the value produced by the Icon function \*Mimage(x)\fR, providing detailed
                   2719: information about structures.
                   2720: .PP
                   2721: Tags are used to uniquely identify
                   2722: structures. A tag consists of a letter identifying the type followed
                   2723: by an integer. The tag letters are \*ML\fR for lists, \*MR\fR for
                   2724: records, \*MS\fR for sets, and \*MT\fR for tables. The first time a structure is encountered,
                   2725: it is imaged as the tag followed by a colon, followed by a representation
                   2726: of the structure. If the same structure is encountered again, only the
                   2727: tag is given.
                   2728: .PP
                   2729: An example is
                   2730: .de In
                   2731: .in 3n
                   2732: ..
                   2733: .Ds
                   2734: a := \^["x"]
                   2735: push(a,\*ba)
                   2736: t := table()
                   2737: push(a,\*bt)
                   2738: t\^[a] := t
                   2739: t\^["x"] := \^[\^]
                   2740: t\^[t] := a
                   2741: write(Image(t))
                   2742: .De
                   2743: which produces
                   2744: .Ds
                   2745: T1:\^["x"\->L1:\^[\^],\*bL2:\^[T1,\*bL2,\*b"x"]\^\->T1,\*bT1\->L2]
                   2746: .De
                   2747: Note that a table is represented as a list of entry and assigned
                   2748: values separated by \*M\->\fR.
                   2749: .NH
                   2750: List Mapping: \*Mlmap
                   2751: .LP
                   2752: The procedure
                   2753: \*Mlmap(a1,\*ba2,\*ba3)\fR maps elements of \*Ma1\fR according to \*Ma2\fR and \*Ma3\fR.
                   2754: This procedure is the analog for lists of the built-in string-mapping
                   2755: function \*Mmap(s1,\*bs2,\*bs3)\fR. Elements in \*Ma1\fR that are the
                   2756: same as elements in \*Ma2\fR are mapped into the corresponding
                   2757: elements of \*Ma3\fR. For example, given the lists
                   2758: .Ds
                   2759: a1 := [1,\*b2,\*b3,\*b4]
                   2760: a2 := [4,\*b3,\*b2,\*b1]
                   2761: a3 := ["a",\*b"b",\*b"c",\*b"d"]
                   2762: .De
                   2763: then
                   2764: .Ds
                   2765: lmap(a1,\*ba2,\*ba3)
                   2766: .De
                   2767: changes \*Ma1\fR to
                   2768: .Ds
                   2769: ["d",\*b"c",\*b"b",\*b"a"]
                   2770: .De
                   2771: Note that the value of \*Ma1\fR is modified.
                   2772: .PP
                   2773: Lists that are mapped can have any kinds of elements. The operation
                   2774: .Ds
                   2775: x =\^=\^= y
                   2776: .De
                   2777: is used to determine if elements \*Mx\fR and \*My\fR are equivalent.
                   2778: .PP
                   2779: All cases in \*Mlmap\fR are handled as they are in \*Mmap\fR,
                   2780: except that no defaults are provided for omitted arguments. As with
                   2781: \*Mmap\fR, \*Mlmap\fR can be used for transposition as well as
                   2782: substitution.
                   2783: .LP
                   2784: \fBWarning:\fR
                   2785: If \*Mlmap\fR is called with the same lists \*Ma2\fR and \*Ma3\fR
                   2786: as in the immediately preceding call, the same mapping is performed,
                   2787: even if the values in \*Ma2\fR and \*Ma3\fR have been changed. This
                   2788: improves performance, but it may cause unexpected effects.
                   2789: .LP
                   2790: \fBComments:\fR
                   2791: It is easy to change \*Mlmap\fR to produce a new list instead of
                   2792: modifying \*Ma1\fR; this is a good exercise for beginning Icon
                   2793: programmers. The ``caching'' of the mapping table based on
                   2794: \*Ma2\fR and \*Ma3\fR also can be removed easily to avoid
                   2795: the potential problem mentioned in the warning above.
                   2796: .NH
                   2797: Snapshots of Scanning: \*Msnapshot
                   2798: .LP
                   2799: The procedure \*Msnapshot()\fR writes a snapshot of the state of string
                   2800: scanning, showing the value of \*M&subject\fR and \*M&pos\fR. For
                   2801: example,
                   2802: .Ds
                   2803: "((a+b)\-delta)/(c*d))" ? {
                   2804:    tab(bal('+\-/*'))
                   2805:    snapshot()
                   2806:    }
                   2807: .De
                   2808: produces
                   2809: .nf
                   2810: .CS
                   2811: .in .5i
                   2812: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   2813: |                                   |
                   2814: | &subject = "((a+b)\-delta)/(c*d))" |
                   2815: |                          |        |
                   2816: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   2817: .in 0
                   2818: .CE
                   2819: .LP
                   2820: Note that the bar showing the \*M&pos\fR is positioned under the
                   2821: \*M&pos\fRth character (actual positions are between characters).
                   2822: If \*M&pos\fR is at the end of \*M&subject\fR, the bar is positioned
                   2823: under the quotation mark delimiting the subject. For example,
                   2824: .Ds
                   2825: "abcdefgh" ? (tab(0) & snapshot())
                   2826: .De
                   2827: produces
                   2828: .nf
                   2829: .CS
                   2830: .in .5i
                   2831: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   2832: |                       |
                   2833: | &subject = "abcdefgh" |
                   2834: |                     | |
                   2835: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   2836: .in 0
                   2837: .CE
                   2838: .LP
                   2839: Escape sequences are handled properly. For example,
                   2840: .Ds
                   2841: "abc\etdef\enghi" ? (tab(upto('\en')) & snapshot())
                   2842: .De
                   2843: produces
                   2844: .nf
                   2845: .CS
                   2846: .in .5i
                   2847: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   2848: |                            |
                   2849: | &subject = "abc\etdef\enghi" |
                   2850: |                     |      |
                   2851: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
                   2852: .in 0
                   2853: .CE
                   2854: .LP
                   2855: .NH
                   2856: Miscellaneous Generators: \*Mgener
                   2857: .LP
                   2858: These procedures generate sequences of results.
                   2859: .RS
                   2860: .IP \*Mhex()\fR 1i
                   2861: sequence of hexadecimal codes for numbers from 0 to 255
                   2862: .IP \*Mlabel(s,\*bi)\fR
                   2863: sequence of labels with prefix \*Ms\fR starting at \*Mi\fR
                   2864: .IP \*Moctal()\fR
                   2865: sequence of octal codes for numbers from 0 to 255
                   2866: .IP \*Mstar(s)\fR
                   2867: sequence consisting of the closure of \*Ms\fR starting with the
                   2868: empty string and continuing in lexical order as given in \*Ms\fR
                   2869: .RE
                   2870: .NH
                   2871: Result Sequences: \*Mseqimage
                   2872: .LP
                   2873: The procedure \*MSeqimage\^{e,\*bi,\*bj}\fR produces a string image
                   2874: of the result sequence for the expression \*Me\fR. The first \*Mi\fR
                   2875: results are printed. If \*Mi\fR is omitted,
                   2876: there is no limit. If there are more than \*Mi\fR results for
                   2877: \*Me\fR, ellipses are provided in the image after the first \*Mi\fR.
                   2878: If \*Mj\fR is specified, at most \*Mj\fR results from the end
                   2879: of the sequence are printed after
                   2880: the ellipses.
                   2881: If \*Mj\fR is omitted, only the first \*Mi\fR results are produced.
                   2882: .LP
                   2883: For example, the expressions
                   2884: .Ds
                   2885: Seqimage\^{1 to 12}
                   2886: Seqimage\^{1 to 12\*b,10}
                   2887: Seqimage\^{1 to 12\*b,6\*b,3}
                   2888: .De
                   2889: produce, respectively,
                   2890: .Ds
                   2891: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
                   2892: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...}
                   2893: {1, 2, 3, 4, 5, 6, ..., 10, 11, 12}
                   2894: .De
                   2895: .LP
                   2896: \fBWarning:\fR
                   2897: If \*Mj\fR is not omitted and \*Me\fR has a infinite result
                   2898: sequence, \*MSeqimage\fR does not terminate.
                   2899: .NH
                   2900: SNOBOL4 Pattern Matching: \*Mpatterns
                   2901: .LP
                   2902: These procedures
                   2903: provide procedural equivalents for most SNOBOL4 patterns and
                   2904: some extensions. See\*([<\*([[9\*(]-11\*(]]\*(>].
                   2905: Procedures and their pattern equivalents are:
                   2906: .RS
                   2907: .IP \*MAny(s)\fR 1i
                   2908: \*MANY(S)\fR
                   2909: .IP \*MArb()\fR
                   2910: \*MARB\fR
                   2911: .IP \*MArbno(p)\fR
                   2912: \*MARBNO(P)\fR
                   2913: .IP \*MArbx(i)\fR
                   2914: \*MARB(I)\fR
                   2915: .IP \*MBal()\fR
                   2916: \*MBAL\*M
                   2917: .IP \*MBreak(s)\*M
                   2918: \*MBREAK(S)\fR
                   2919: .IP \*MBreakx(s)\fR
                   2920: \*MBREAKX(S)\fR
                   2921: .IP \*MCat(p1,\*bp2)\fR
                   2922: \*MP1 P2\fR
                   2923: .IP \*MDiscard(p)\fR
                   2924: \*M/P\fR
                   2925: .IP \*MExog(s)\fR
                   2926: \*M\eS\fR
                   2927: .IP \*MFind(s)\*M
                   2928: \*MFIND(S)\fR
                   2929: .IP \*MLen(i)\fR
                   2930: \*MLEN(I)\fR
                   2931: .IP \*MLimit(p,\*bi)\fR
                   2932: \*MP \e i\fR
                   2933: .IP \*MLocate(p)\fR
                   2934: \*MLOCATE(P)\fR
                   2935: .IP \*MMarb()\fR
                   2936: \*M\fRlongest-first\*M ARB\fR
                   2937: .IP \*MNotany(s)\fR
                   2938: \*MNOTANY(S)\fR
                   2939: .IP \*MPos(i)\fR
                   2940: \*MPOS(I)\fR
                   2941: .IP \*MReplace(p,\*bs)\fR
                   2942: \*MP \(== S\fR
                   2943: .IP \*MRpos(i)\fR
                   2944: \*MRPOS(I)\fR
                   2945: .IP \*MRtab(i)\fR
                   2946: \*MRTAB(I)\fR
                   2947: .IP \*MSpan(s)\*M
                   2948: \*MSPAN(S)\fR
                   2949: .IP \*MString(s)\fR
                   2950: \*MS\fR
                   2951: .IP \*MSucceed()\*M
                   2952: \*MSUCCEED\fR
                   2953: .IP \*MTab(i)\fR
                   2954: \*MTAB(I)\fR
                   2955: .IP \*MXform(f,\*bp)\*M
                   2956: \*MF(P)\fR
                   2957: .RE
                   2958: .PP
                   2959: The following procedures relate to the application and control of
                   2960: pattern matching:
                   2961: .RS
                   2962: .IP \*MApply(s,\*bp)\fR 1i
                   2963: \*MS ? P\fR
                   2964: .IP \*MMode()\fR
                   2965: \fRanchored or unanchored matching (see \*MAnchor\fR and \*MFloat\fR)
                   2966: .IP \*MAnchor()\fR
                   2967: \*M&ANCHOR = 1 \fR if \*MMode := Anchor
                   2968: .IP \*MFloat()\*M
                   2969: \*M&ANCHOR = 0 \fR if \*MMode := Float\fR
                   2970: .RE
                   2971: .LP
                   2972: In addition to the procedures above, the following expressions can be
                   2973: used:
                   2974: .RS
                   2975: .IP \*Mp1()\ |\ p2()\fR 1i
                   2976: \*MP1 | P2\fR
                   2977: .IP \*Mv\ <\-\ p()\fR
                   2978: \*MP . V \fR (approximate)
                   2979: .IP \*Mv\ :=\ p()\fR
                   2980: \*MP $ V \fR (approximate)
                   2981: .IP \*Mfail\fR
                   2982: \*MFAIL\fR
                   2983: .IP \*M=s\fR
                   2984: \*MS\fR  (in place of \*MString(s)\fR)
                   2985: .IP \*Mp1()\ ||\ p2()\fR
                   2986: \*MP1 P2 \fR (in place of \*MCat(p1,\*bp2)\fR)
                   2987: .RE
                   2988: .LP
                   2989: Using this system, most SNOBOL4 patterns can be satisfactorily transliterated
                   2990: into Icon procedures and expressions. For example, the pattern
                   2991: .Ds
                   2992: SPAN("0123456789") $ N "H" LEN(*N) $ LIT
                   2993: .De
                   2994: can be transliterated into
                   2995: .Ds
                   2996: (n <\- Span('0123456789')) || ="H" ||
                   2997:    (lit <\- Len(n))
                   2998: .De
                   2999: Concatenation of components is necessary to preserve the pattern-matching properties
                   3000: of SNOBOL4.
                   3001: See the documents referenced above for details and limitations.
                   3002: .LP
                   3003: \fBCaveats\fR:
                   3004: Simulating SNOBOL4 pattern matching using the procedures above
                   3005: is inefficient.
                   3006: .NH
                   3007: Defined Control Operations: \*Mpdco
                   3008: LPP
                   3009: These procedures
                   3010: use co-expressions to used to model the built-in control
                   3011: structures of Icon and also provide new ones. See\*([<\*([[12\*(]]\*(>].
                   3012: .RS
                   3013: .IP \*MAlt\^{e1,\*be2}\fR 1.5i
                   3014: models \*Me1 | e2\fR
                   3015: .IP \*MColseq\^{e1,\\*be2,\ \*(El}\fR
                   3016: produces results of \*Me1\fR, \*Me2\fR, \*(El alternately
                   3017: .IP \*MComseq\^{e1,\*be2}\fR
                   3018: compares result sequences of \*Me1\fR and \*Me2\fR
                   3019: .IP \*MCond\^{e1,\*be2,\ \*(El}\fR
                   3020: models the generalized Lisp conditional
                   3021: .IP \*MEvery\^{e1,\*be2}\fR
                   3022: models \*Mevery e1 do e2\fR
                   3023: .IP \*MGalt\^{e1,\*be2,\ \*(El}\fR
                   3024: models generalized alternation: \*Me1 | e2 | \*(El\fR
                   3025: .IP \*MLcond\^{e1,\*be2,\ \*(El}\fR
                   3026: models the Lisp conditional
                   3027: .IP \*MLimit\^{e1,\*be2}\fR
                   3028: models \*Me1 \e e2\fR
                   3029: .IP \*MRanseq\^{e1,\*be2,\ \*(El}\fR
                   3030: produces results of \*Me1\fR, \*Me2\fR, \*(El at random
                   3031: .IP \*MRepalt\^{e}\fR
                   3032: models \*M|e\fR
                   3033: .IP \*MResume\^{e1,\*be2,\*be3}\fR
                   3034: models \*Mevery e1 \e e2 do e3\fR
                   3035: .IP \*MSelect\^{e1,\*be2}\fR
                   3036: produces results from \*Me1\fR by position according to \*Me2\fR
                   3037: .RE
                   3038: .LP
                   3039: \fBComments\fR:
                   3040: Because of the handling of the scope of local identifiers in co-expressions,
                   3041: expressions in programmer-defined control operations cannot communicate
                   3042: through local identifiers.
                   3043: Some constructions, such
                   3044: as \*Mbreak\fR and \*Mreturn\fR, cannot be used in arguments to programmer-defined
                   3045: control operations.
                   3046: .NH
                   3047: Defined Control Regimes: \*Mpdae
                   3048: .LP
                   3049: These procedures
                   3050: use co-expressions to model the built-in argument
                   3051: evaluation regime of Icon and also provide new ones.
                   3052: See\*([<\*([[13\*(]]\*(>].
                   3053: .RS
                   3054: .IP \*MAllpar\^{e1,\*be2,\ \*(El}\fR 1.5i
                   3055: parallel evaluation with last result used for short sequences
                   3056: .IP \*MExtract\^{e1,\*be2,\ \*(El}\fR
                   3057: extract results of even-numbered arguments according to
                   3058: odd-numbered values
                   3059: .IP \*MLifo\^{e1,\*be2,\ \*(El}\fR
                   3060: models standard Icon ``lifo'' evaluation
                   3061: .IP \*MParallel\^{e1,\*be2,\ \*(El}\fR
                   3062: parallel evaluation terminating on shortest sequence
                   3063: .IP \*MReverse\^{e1,\*be2,\ \*(El}\fR
                   3064: left-to-right reversal of lifo evaluation
                   3065: .IP \*MRotate\^{e1,\*be2,\ \*(El}\fR
                   3066: parallel evaluation with shorter sequences re-evaluated
                   3067: .IP \*MSimple\^{e1,\*be2,\ \*(El}\fR
                   3068: simple evaluation with only success or failure
                   3069: .RE
                   3070: .LP
                   3071: \fBComments:\fR
                   3072: Because of the handling of the scope of local identifiers in co-expressions,
                   3073: expressions in programmer-defined argument evaluation regimes cannot communicate
                   3074: through local identifiers.
                   3075: Some constructions, such
                   3076: as \*Mbreak\fR and \*Mreturn\fR, cannot be used in arguments to programmer-defined
                   3077: argument evaluation regimes.
                   3078: .LP
                   3079: At most 10 arguments can be used in the invocation of a programmer-defined
                   3080: argument evaluation regime. This limit can be increased by
                   3081: modifying \*MCall\fR, a utility procedure that is included.
                   3082: .rm CH
                   3083: .bp
                   3084: .[]
                   3085: .[-
                   3086: .ds [F 1
                   3087: .ds [A R\*(p]\*(a]E\*(p] Griswold
                   3088: .as [A \*(n]M\*(p]\*(a]T\*(p] Griswold
                   3089: .ds [T The Icon Programming Language
                   3090: .ds [I Prentice-Hall, Inc.
                   3091: .ds [C Englewood Cliffs, NJ
                   3092: .ds [D 1983
                   3093: .][
                   3094: .[-
                   3095: .ds [F 2
                   3096: .ds [A R\*(p]\*(a]E\*(p] Griswold
                   3097: .as [A \*(c]W\*(p]\*(a]H\*(p] Mitchell
                   3098: .as [A \*(m]J\*(p] O'Bagy
                   3099: .ds [T \fIVersion 6.0 of Icon\fR
                   3100: .ds [R The Univ. of Arizona Tech. Rep. 86-10
                   3101: .ds [D May 1986
                   3102: .][
                   3103: .[-
                   3104: .ds [F 3
                   3105: .ds [A R\*(p]\*(a]E\*(p] Griswold
                   3106: .ds [T \fIThe Translation and Execution of Icon Programs under MS-DOS\fR
                   3107: .ds [R The Univ. of Arizona Tech. Rep.
                   3108: .ds [D Dec. 1985
                   3109: .][
                   3110: .[-
                   3111: .ds [F 4
                   3112: .ds [A G\*(p]\*(a]M\*(p] Townsend
                   3113: .ds [T \fIUsing Version 6.0 of Icon Under VMS\fR
                   3114: .ds [R The Univ. of Arizona Tech. Rep.
                   3115: .ds [D May 1986
                   3116: .][
                   3117: .[-
                   3118: .ds [F 5
                   3119: .ds [A R\*(p]\*(a]E\*(p] Griswold
                   3120: .ds [T \fIProgramming in Icon; Problems and Solutions from the Icon Newsletter\fR
                   3121: .ds [R The Univ. of Arizona Tech. Rep. 86-2
                   3122: .ds [D Jan. 1986
                   3123: .][
                   3124: .[-
                   3125: .ds [F 6
                   3126: .ds [A C\*(p]\*(a]S\*(p] Wetherwell
                   3127: .ds [T ``Probablistic Languages: A Review and Some Open Questions''
                   3128: .ds [J Computing Surveys
                   3129: .ds [V 12
                   3130: .ds [N 4
                   3131: .nr [P 1
                   3132: .ds [P 362-379
                   3133: .ds [D 1980
                   3134: .][
                   3135: .[-
                   3136: .ds [F 7
                   3137: .ds [A A\*(p] Salomaa
                   3138: .ds [T Formal Languages
                   3139: .ds [I Academic Press
                   3140: .ds [D 1973
                   3141: .][
                   3142: .[-
                   3143: .ds [F 8
                   3144: .ds [A D\*(p]\*(a]B\*(p] Anderson
                   3145: .as [A \*(n]M\*(p]\*(a]R\*(p] Sleep
                   3146: .ds [T ``Uniform Random Generation of Balanced Parenthesis Strings''
                   3147: .ds [J ACM Trans. Prog. Lang. and Systems
                   3148: .ds [V 2
                   3149: .ds [N 1
                   3150: .nr [P 1
                   3151: .ds [P 122-128
                   3152: .ds [D 1980
                   3153: .][
                   3154: .[-
                   3155: .ds [F 9
                   3156: .ds [A R\*(p]\*(a]E\*(p] Griswold
                   3157: .ds [T \fIPattern Matching in Icon\fR
                   3158: .ds [R The Univ. of Arizona Tech. Rep. 80-25
                   3159: .ds [d Oct. 1980
                   3160: .][
                   3161: .[-
                   3162: .ds [F 10
                   3163: .ds [A R\*(p]\*(a]E\*(p] Griswold
                   3164: .ds [T \fIModels of String Pattern Matching\fR
                   3165: .ds [R The Univ. of Arizona Tech. Rep. 81-6
                   3166: .ds [D May 1981
                   3167: .][
                   3168: .[-
                   3169: .ds [F 11
                   3170: .ds [A A\*(p]\*(a]C\*(p] Fleck
                   3171: .ds [T ``Formal Models for String Patterns''
                   3172: .ds [B Current Trends in Programming Methodology; Data Structuring
                   3173: .ds [I Prentice-Hall, Inc.
                   3174: .ds [C Englewood Cliffs, NJ
                   3175: .ds [V IV
                   3176: .ds [D 1978
                   3177: .nr [P 1
                   3178: .ds [P 216-240
                   3179: .][
                   3180: .[-
                   3181: .ds [F 12
                   3182: .ds [A R\*(p]\*(a]E\*(p] Griswold
                   3183: .as [A \*(n]M\*(p] Novak
                   3184: .ds [T ``Programmer-Defined Control Operations''
                   3185: .ds [J Computer J.
                   3186: .ds [V 26
                   3187: .ds [N 2
                   3188: .ds [D May 1983
                   3189: .nr [P 1
                   3190: .ds [P 175-183
                   3191: .][
                   3192: .[-
                   3193: .ds [F 13
                   3194: .ds [A M\*(p] Novak
                   3195: .as [A \*(n]R\*(p]\*(a]E\*(p] Griswold
                   3196: .ds [T \fIProgrammer-Defined Argument Evaluation Regimes\fR
                   3197: .ds [R The Univ. of Arizona Tech. Rep. 82-16
                   3198: .ds [D Dec. 1982
                   3199: .][

unix.superglobalmegacorp.com

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