Annotation of researchv10dc/cmd/icon/tests/seqtest.icn, revision 1.1.1.1

1.1       root        1: procedure Gk(k)
                      2: local i, m_
                      3: i := 0
                      4: m_ := table(0)
                      5: 
                      6: suspend m_[C_([i +:= |1,k])] := i - m_[C_([m_[C_([i - k,k])],k])]
                      7: end
                      8: procedure Q()
                      9: local i, m_
                     10: i := 0
                     11: m_ := table(0)
                     12: suspend m_[i +:= 1] := 1
                     13: suspend m_[i +:= 1] := 1
                     14: suspend m_[i +:= |1] := m_[i - m_[i - 1]] + m_[i - m_[i - 2]]
                     15: end
                     16: procedure Fib()
                     17: local i, m_
                     18: i := 0
                     19: m_ := table(0)
                     20: suspend m_[i +:= 1] := 1
                     21: suspend m_[i +:= 1] := 1
                     22: suspend m_[i +:= |1] := m_[i - 1] + m_[i - 2]
                     23: end
                     24: procedure G()
                     25: local i, m_
                     26: i := 0
                     27: m_ := table(0)
                     28: 
                     29: suspend m_[i +:= |1] := i - m_[m_[i - 1]]
                     30: end
                     31: procedure Fibs()
                     32: local i, m_
                     33: i := 0
                     34: m_ := table("")
                     35: suspend m_[i +:= 1] := "a"
                     36: suspend m_[i +:= 1] := "b"
                     37: suspend m_[i +:= |1] := m_[i - 1] || m_[i - 2]
                     38: end
                     39: procedure Unop_(op,X)                  # op(X)
                     40:    local e, a, i, s 
                     41:    if S_(X) then {
                     42:       a := copy(X.a)
                     43:       i := *X.a
                     44:       e := create !a | Pre_(X.e,i)
                     45:       return Sequence([],create |Unop_(op,@e))
                     46:       }
                     47:    else suspend op(X)
                     48: end
                     49: 
                     50: procedure Binop_(op,X1,X2)             # op(X1,X2)
                     51:    local e1, e2, a1, a2, i1, i2, s1, s2
                     52:    if not S_(X1 | X2) then suspend op(X1,X2)
                     53:    else {
                     54:       s1 := Seq_(X1)
                     55:       s2 := Seq_(X2)
                     56:       a1 := copy(s1.a)
                     57:       a2 := copy(s2.a)
                     58:       i1 := *s1.a
                     59:       i2 := *s2.a
                     60:       e1  := create !a1 | Pre_(s1.e,i1)
                     61:       e2  := create !a2 | Pre_(s2.e,i2)
                     62:       return Sequence([],create |Binop_(op,@e1,@e2))
                     63:       }
                     64: end
                     65: 
                     66: procedure Triop_(op,X1,X2,X3)          # op(X1,X2,X2)
                     67:    local e1, e2, e3, a1, a2, a3, i1, i2, i3, s1, s2, s3
                     68:    if not S_(X1 | X2 | X3) then suspend op(X1,X2,X3)
                     69:    else {
                     70:       s1 := Seq_(X1)
                     71:       s2 := Seq_(X2)
                     72:       s3 := Seq_(X3)
                     73:       a1 := copy(s1.a)
                     74:       a2 := copy(s2.a)
                     75:       a3 := copy(s3.a)
                     76:       i1 := *s1.a
                     77:       i2 := *s2.a
                     78:       i3 := *s3.a
                     79:       e1  := create !a1 | Pre_(s1.e,i1)
                     80:       e2  := create !a2 | Pre_(s2.e,i2)
                     81:       e3  := create !a3 | Pre_(s3.e,i3)
                     82:       return Sequence([],create |Triop_(op,@e1,@e2,@e3))
                     83:       }
                     84: end
                     85: 
                     86: procedure Quadop_(op,X1,X2,X3,X4)      # op(X1,X2,X3,X4)
                     87:    local e1, e2, e3, e4, a1, a2, a3, a4, i1, i2, i3, i4, s1, s2, s3, s4
                     88:    if not S_(X1 | X2 | X3 | X4) then suspend op(X1,X2,X3,X4)
                     89:    else {
                     90:      s1 := Seq_(X1)
                     91:      s2 := Seq_(X2)
                     92:      s3 := Seq_(X3)
                     93:      s4 := Seq_(X4)
                     94:      a1 := copy(s1.a)
                     95:      a2 := copy(s2.a)
                     96:      a3 := copy(s3.a)
                     97:      a4 := copy(s4.a)
                     98:      i1 := *s1.a
                     99:      i2 := *s2.a
                    100:      i3 := *s3.a
                    101:      i4 := *s4.a
                    102:      e1  := create !a1 | Pre_(s1.e,i1)
                    103:      e2  := create !a2 | Pre_(s2.e,i2)
                    104:      e3  := create !a3 | Pre_(s3.e,i3)
                    105:      e4  := create !a4 | Pre_(s4.e,i4)
                    106:      return Sequence([],create |Quadop_(op,@e1,@e2,@e3,@e4))
                    107:      }
                    108: end
                    109: 
                    110: procedure P_(a)                                # limited evaluation
                    111:    return case *a of {
                    112:       2 :  Unop_(a[1],a[2])
                    113:       3 :  Binop_(a[1],a[2],a[3])
                    114:       4 :  Triop_(a[1],a[2],a[3],a[4])
                    115:       5 :  Quadop_(a[1],a[2],a[3],a[4],a[5])
                    116:       default :  stop("Too many arguments in parallel evaluation")
                    117:       }
                    118: end
                    119: 
                    120: record Sequence(a,e)   # sequence data type
                    121: record Undef() # for unique "undefined" value
                    122: 
                    123: global Phi, Iplus, Iplus_, Izero, Undef_, X_, Genseq_, GenJ_
                    124: 
                    125: procedure At(X)                                # element generation for sequences
                    126:    every i := seq() do 
                    127:       if s := Ref_(X,i) then suspend s
                    128:       else fail
                    129: end
                    130: 
                    131: procedure C_(a)                                # identifying "subscript" for
                    132:    local s                             # recurrence lookup
                    133:    s := a[1]
                    134:    every s ||:= "." || image(a[2 to *a])
                    135:    return s
                    136: end
                    137: 
                    138: procedure Cat_(X1,X2)                  # concatenation of X1 and X2
                    139:    local s1, s2, e1, e2, i1, i2, a1, a2
                    140:    s1 := Seq_(X1)
                    141:    s2 := Seq_(X2)
                    142:    e1 := s1.e
                    143:    i1 := *s1.a
                    144:    e2 := s2.e
                    145:    i2 := *s2.a
                    146:    a2 := copy(s2.a)
                    147:    return Sequence(copy(s1.a),create Pre_(e1,i1) | !a2 | Pre_(e2,i2))
                    148: end
                    149: 
                    150: procedure Collapse_(X)                 # generate scalars from X
                    151:    if S_(X) then
                    152:       suspend Collapse_(Gen_(X))
                    153:   else return X
                    154: end
                    155: 
                    156: procedure Expr_(X)                     # return refreshed co-expression for X
                    157:    if type(X) == "Sequence" then return ^X.e | &null
                    158:    else if /X then return Phi.e
                    159:    else return create X
                    160: end
                    161: 
                    162: procedure Gen_(X,v)                    # generate elements of X
                    163:    local i, x
                    164:    if X_[\v] === Undef_ then fail      # termination heuristic
                    165:    if not S_(X) then return X          # note: does not fail if X null-valued
                    166:    every i := seq() do {
                    167:       if x := X.a[i] then              # produce stored values first
                    168:          suspend x
                    169:       else {                           # transfer remaining values
                    170:          put(X.a,@X.e) | fail
                    171:          if x := X.a[i] then suspend x else fail
                    172:          }
                    173:       if X_[\v] === Undef_ then fail   # termination heuristic
                    174:       }
                    175: end
                    176: 
                    177: procedure Generic_(p,X)                        # apply p to X
                    178:    if /X then fail
                    179:    return if S_(X) then every p(Gen_(X)) else p(X)
                    180: end
                    181: 
                    182: procedure Init_()
                    183:    GenJ_ := Gen_
                    184:    Undef_ := Undef()
                    185:    X_ := table()
                    186:    Iplus := Sequence([],create seq(1))
                    187:    Iplus_ := Sequence([],create seq(1))
                    188:    Izero := Sequence([],create seq(0))
                    189:    Izero_ := Sequence([],create seq(0))
                    190:    Phi := Sequence([], create &fail)
                    191:    Genseq_ := Iplus_
                    192: end
                    193: 
                    194: procedure Lim_(X,i)                    # limit X to i elements
                    195:    local e, s, a, n
                    196: 
                    197:    if i < 1 then return .Phi
                    198:    s := Seq_(X)
                    199:    a := copy(s.a)
                    200:    n := *s.a
                    201:    return Sequence([],create (!a | Pre_(s.e,n)) \ i)
                    202: 
                    203: end
                    204: 
                    205: procedure Post_(e,i)                   # limit X to at most i values
                    206:    e := ^e
                    207:    suspend |@e \ i
                    208: end
                    209: 
                    210: procedure Pp_(v)                       # push/pop undefined marker
                    211:    X_[\v] := &null
                    212:    suspend
                    213:    X_[\v] := &null
                    214:    fail
                    215: end
                    216: 
                    217: procedure Pre_(e,i)                    # skip first i values of X
                    218:    e := ^e
                    219:    every 1 to i
                    220:       do @e | fail
                    221:    suspend |@e
                    222: end
                    223: 
                    224: procedure Qq_(v)                       # pop/push undefined marker
                    225:    X_[\v] := &null
                    226:    suspend
                    227:    X_[\v] := &null
                    228:    fail
                    229: end
                    230: 
                    231: procedure Red_(X,op)                   # reduction of X over op
                    232:    local x, y, i
                    233:    i := 1
                    234:    suspend x := Ref_(X,i)
                    235:    while y := Ref_(X,i +:= 1) do
                    236:       suspend (x := op(x,y))           # op(x,y) may fail, not changing x
                    237: end
                    238: 
                    239: procedure Ref_(X,i,v)                  # X!i
                    240:    local x
                    241:    if i < 1 then {
                    242:       X_[\v] := Undef_                 # termination heuristic
                    243:       fail
                    244:       }
                    245:    if not S_(X) then                   # J: coerce to a sequence
                    246:       X := Sequence([],create X)
                    247:    if i > *X.a then
                    248:       every 1 to i - *X.a do
                    249:          put(X.a,@X.e) | {
                    250:             X_[\v] := Undef_           # termination heuristic
                    251:             fail
                    252:             }
                    253:    return X.a[i]                       # note that this is not dereffed
                    254: end
                    255: 
                    256: procedure S_(x)                                # is X a sequence?
                    257:    return type(x) == "Sequence"
                    258: end
                    259: 
                    260: procedure Seq_(X)                      # coerce X to a unit sequence
                    261:    if type(X) == "Sequence" then return X
                    262:    else if /X then return Phi
                    263:    else return Sequence([],create X)
                    264: end
                    265: 
                    266: procedure Shift_(X,i)                  # shift X left by i elements
                    267:    local e,a,n,s
                    268:    if i < 1 then return .Phi
                    269:    s := Seq_(X)
                    270:    a := copy(s.a)
                    271:    n := *a
                    272:    if n > i then {
                    273:       e := create a[i+1 to n] | Pre_(s.e,n)
                    274:       return Sequence([],create |@e)
                    275:       }
                    276:    else
                    277:       return Sequence([], create Pre_(s.e,i))
                    278: end
                    279: global Fibseq, Abc, U, L
                    280: procedure main();
                    281: Init_()
                    282: Abc := Sequence([], create ("") | ("a") | ("b") | ("c") | ("aa") | ("ab") | ("ac") | ("ba") | ("bb") | ("bc") | ("ca") | ("cb") | ("cc") | ("aaa"));
                    283: Fibseq := Sequence([], create (Fib()));
                    284: U := Sequence([], create ("A") | ("B") | ("C"));
                    285: L := Sequence([], create ("a") | ("b"));
                    286: sec1();
                    287: sec1();
                    288: sec1();
                    289: sec2_0();
                    290: sec2_0();
                    291: sec2_0();
                    292: sec2_1();
                    293: sec2_1();
                    294: sec2_1();
                    295: sec2_3();
                    296: sec2_3();
                    297: sec2_3();
                    298: sec2_4();
                    299: sec2_4();
                    300: sec2_4();
                    301: sec3_1();
                    302: sec3_1();
                    303: sec3_1();
                    304: sec3_2();
                    305: sec3_2();
                    306: sec3_2();
                    307: sec3_3();
                    308: sec3_3();
                    309: sec3_3();
                    310: sec4();
                    311: sec4();
                    312: sec4();
                    313: sec5();
                    314: sec5();
                    315: sec5();
                    316: end
                    317: procedure sec1();
                    318: write("{x, {y}}: ",Image(Sequence([], create ("x") | (Sequence([], create ("y"))))));
                    319: write("|{{1,2}}|: ",Length(Sequence([], create (Sequence([], create (1) | (2))))));
                    320: write("F!6: ",Ref_((Fibseq),6,));
                    321: write("{1,2,3} -> {6,7,8,9}: ",Image(Cat_((Sequence([], create (1) | (2) | (3))),(Sequence([], create (6) | (7) | (8) | (9)))),10));
                    322: write("F sub 3:5: ",Image(Subseq(Fibseq,3,5)));
                    323: write("F sub 5:inf: ",Image(Shift_((Fibseq),4)));
                    324: end
                    325: procedure sec2_0();
                    326: write("Fibonacci sequence: ",Image(Fibseq,10));
                    327: write("closure of a,b,c: ",Image(Abc,10));
                    328: write("[i]: ",Image(Sequence([],create (Pp_("i") &
                    329: i := Gen_(Genseq_,"i") & 1(GenJ_((i) ,"i"),Qq_("i"))))));
                    330: write("[i - 1]: ",Image(Sequence([],create (Pp_("i") &
                    331: i := Gen_(Genseq_,"i") & 1(GenJ_((Binop_("-",i,1)) ,"i"),Qq_("i"))))));
                    332: write("[i ^ 2]: ",Image(Sequence([],create (Pp_("i") &
                    333: i := Gen_(Genseq_,"i") & 1(GenJ_((Binop_("^",i,2)) ,"i"),Qq_("i"))))));
                    334: write("[i mod 3]: ",Image(Sequence([],create (Pp_("i") &
                    335: i := Gen_(Genseq_,"i") & 1(GenJ_((Binop_("%",i,3)) ,"i"),Qq_("i"))))));
                    336: write("[a to i]: ",Image(Sequence([],create (Pp_("i") &
                    337: i := Gen_(Genseq_,"i") & 1(GenJ_((repl("a",i)) ,"i"),Qq_("i"))))));
                    338: write("[1]: ",Image(Sequence([],create (Pp_("i") &
                    339: i := Gen_(Genseq_,"i") & 1(GenJ_((1) ,"i"),Qq_("i"))))));
                    340: write("[aa]: ",Image(Sequence([],create (Pp_("i") &
                    341: i := Gen_(Genseq_,"i") & 1(GenJ_(("aa") ,"i"),Qq_("i"))))));
                    342: end
                    343: procedure sec2_1();
                    344: write("[Iplus:i]: ",Image(Sequence([],create (Pp_("i") &
                    345: i := Gen_(.Iplus,"i") & 1(GenJ_((i) ,"i"),Qq_("i"))))));
                    346: write("[Izero:i]: ",Image(Sequence([],create (Pp_("i") &
                    347: i := Gen_(.Izero,"i") & 1(GenJ_((i) ,"i"),Qq_("i"))))));
                    348: write("[Fibseq:i]: ",Image(Sequence([],create (Pp_("i") &
                    349: i := Gen_(Fibseq,"i") & 1(GenJ_((i) ,"i"),Qq_("i"))))));
                    350: write("[[i ^ 2]:F]: ",Image(Sequence([],create (Pp_("i") &
                    351: i := Gen_(Sequence([],create (Pp_("i") &
                    352: i := Gen_(Genseq_,"i") & 1(GenJ_((Binop_("^",i,2)) ,"i"),Qq_("i")))),"i") & 1(GenJ_((Ref_((Fibseq),i,"i")) ,"i"),Qq_("i"))))));
                    353: write("[[i ** 2]:F]: ",Image(Sequence([],create (Pp_("i") &
                    354: i := Gen_(Sequence([], create (1) | (4) | (9) | (16)),"i") & 1(GenJ_((Ref_((Fibseq),i,"i")) ,"i"),Qq_("i"))))));
                    355: write("[{1,3,5}:Abc!i]: ",Image(Sequence([],create (Pp_("i") &
                    356: i := Gen_(Sequence([], create (1) | (3) | (5)),"i") & 1(GenJ_((Ref_((Abc),i,"i")) ,"i"),Qq_("i"))))));
                    357: write("Iplus \\ 4: ",Image(Lim_((.Iplus) ,4),10));
                    358: write("[Iplus \\ 4:Abc!i]: ",Image(Sequence([],create (Pp_("i") &
                    359: i := Gen_(Lim_((.Iplus) ,4),"i") & 1(GenJ_((Ref_((Abc),i,"i")) ,"i"),Qq_("i")))),10));
                    360: end
                    361: procedure sec2_2();
                    362: write("[{i,i}]: ",Image(Sequence([],create (Pp_("i") &
                    363: i := Gen_(Genseq_,"i") & 1(GenJ_((Sequence([], create (i) | (i))) ,"i"),Qq_("i"))))));
                    364: end
                    365: procedure sec2_3();
                    366: k := 100;
                    367: write("[lambda(j)k + j]: ",Image(Sequence([],create (Pp_("j") &
                    368: j := Gen_(Genseq_,"j") & 1(GenJ_((Binop_("+",k,j)) ,"j"),Qq_("j"))))));
                    369: write("[F:lambda(j)k + j]: ",Image(Sequence([],create (Pp_("j") &
                    370: j := Gen_(Fibseq,"j") & 1(GenJ_((Binop_("+",k,j)) ,"j"),Qq_("j"))))));
                    371: write("[Abc:lambda(s)s || s]: ",Image(Sequence([],create (Pp_("s") &
                    372: s := Gen_(Abc,"s") & 1(GenJ_((Binop_("||",s,s)) ,"s"),Qq_("s"))))));
                    373: end
                    374: procedure sec2_4();
                    375: write("[lambda(i)[lambda(j) U!i || L!j]: ",Image(Sequence([],create (Pp_("i") &
                    376: i := Gen_(Genseq_,"i") & 1(GenJ_((Sequence([],create (Pp_("j") &
                    377: j := Gen_(Genseq_,"j") & 1(GenJ_((Binop_("||",Ref_((U),i,"i"),Ref_((L),j,"j"))) ,"j"),Qq_("j"))))) ,"i"),Qq_("i"))))));
                    378: write("[lambda(i)[lambda(j) U!j || L!i]: ",Image(Sequence([],create (Pp_("i") &
                    379: i := Gen_(Genseq_,"i") & 1(GenJ_((Sequence([],create (Pp_("j") &
                    380: j := Gen_(Genseq_,"j") & 1(GenJ_((Binop_("||",Ref_((U),j,"j"),Ref_((L),i,"i"))) ,"j"),Qq_("j"))))) ,"i"),Qq_("i"))))));
                    381: write("[Izero:lambda(j)[(Iplus %% j) \\ (j + 1):i]]: ",Image(Sequence([],create (Pp_("j") &
                    382: j := Gen_(.Izero,"j") & 1(GenJ_((Sequence([],create (Pp_("i") &
                    383: i := Gen_(Lim_(((Shift_((.Iplus),j))) ,(Binop_("+",j,1))),"i") & 1(GenJ_((i) ,"i"),Qq_("i"))))) ,"j"),Qq_("j"))))));
                    384: end
                    385: procedure sec3_1();
                    386: I := Sequence([], create (1) | (2) | (3) | (4) | (5) | (6));
                    387: J := Sequence([], create (100) | (200) | (300) | (400) | (500) | (600));
                    388: write("I + J: ",Image(Binop_("+",I,J)));
                    389: write("{a, ab, c} || {c, b, a}: ",Image(Binop_("||",Sequence([], create ("a") | ("ab") | ("c")),Sequence([], create ("c") | ("b") | ("a")))));
                    390: write("Abc || Abc: ",Image(Binop_("||",Abc,Abc)));
                    391: write("{1,2,3,4} + {1,4}: ",Image(Binop_("+",Sequence([], create (1) | (2) | (3) | (4)),Sequence([], create (1) | (4)))));
                    392: write("{a, ab, c} || {x}: ",Image(Binop_("||",Sequence([], create ("a") | ("ab") | ("c")),Sequence([], create ("x")))));
                    393: end
                    394: procedure sec3_2();
                    395: I := Sequence([], create (1) | (2) | (0) | (0) | (45) | (0));
                    396: write("[if I!i = 0 then {0} else {1}]: ",Image(Sequence([],create (Pp_("i") &
                    397: i := Gen_(Genseq_,"i") & 1(GenJ_((if Binop_("=",Ref_((I),i,"i"),0) then Sequence([], create (0)) else Sequence([], create (1))) ,"i"),Qq_("i"))))));
                    398: write("[if I!i = 0 then 0 else 1]: ",Image(Sequence([],create (Pp_("i") &
                    399: i := Gen_(Genseq_,"i") & 1(GenJ_((if Binop_("=",Ref_((I),i,"i"),0) then 0 else 1) ,"i"),Qq_("i"))))));
                    400: end
                    401: procedure sec3_3();
                    402: write("Red(Iplus \\ 5,+): ",Image(Red(Lim_((.Iplus) ,5),"+")));
                    403: write("[Red(F \\ i,+)]: ",Image(Sequence([],create (Pp_("i") &
                    404: i := Gen_(Genseq_,"i") & 1(GenJ_((Red(Lim_((Fibseq) ,i),"+")) ,"i"),Qq_("i"))))));
                    405: write("[Red(Abc \\ (i + 1),||)]: ",Image(Sequence([],create (Pp_("i") &
                    406: i := Gen_(Genseq_,"i") & 1(GenJ_((Red(Lim_((Abc) ,(Binop_("+",i,1))),"||")) ,"i"),Qq_("i"))))));
                    407: end
                    408: procedure sec4();
                    409: write("[if Iplus!i mod 2 = 0 then Iplus!i]: ",Image(Sequence([],create (Pp_("i") &
                    410: i := Gen_(Genseq_,"i") & 1(GenJ_((if Binop_("=",Binop_("%",Ref_((.Iplus),i,"i"),2),0) then Ref_((.Iplus),i,"i")) ,"i"),Qq_("i"))))));
                    411: write("[if |Abc!i| mod 2 = 0 then Abc!i]: ",Image(Sequence([],create (Pp_("i") &
                    412: i := Gen_(Genseq_,"i") & 1(GenJ_((if Binop_("=",Binop_("%",Unop_("*",(Ref_((Abc),i,"i"))),2),0) then Ref_((Abc),i,"i")) ,"i"),Qq_("i"))))));
                    413: write("[if i mod 2 = 1 then F!(i + 1) else F!(i - 1)]: ",Image(Sequence([],create (Pp_("i") &
                    414: i := Gen_(Genseq_,"i") & 1(GenJ_((if Binop_("=",Binop_("%",i,2),1) then Ref_((Fibseq),(Binop_("+",i,1)),) else Ref_((Fibseq),(Binop_("-",i,1)),)) ,"i"),Qq_("i")))),10));
                    415: write("[if i mod 2 = 1 then Iplus!i + Iplus!(i + 1)]: ",Image(Sequence([],create (Pp_("i") &
                    416: i := Gen_(Genseq_,"i") & 1(GenJ_((if Binop_("=",Binop_("%",i,2),1) then Binop_("+",Ref_((.Iplus),i,"i"),Ref_((.Iplus),(Binop_("+",i,1)),))) ,"i"),Qq_("i"))))));
                    417: I := Sequence([], create (0) | (1) | (2) | (3) | (0) | (2) | (0) | (5));
                    418: write("[if I!i = 0 then i]: ",Image(Sequence([],create (Pp_("i") &
                    419: i := Gen_(Genseq_,"i") & 1(GenJ_((if Binop_("=",Ref_((I),i,"i"),0) then i) ,"i"),Qq_("i"))))));
                    420: end
                    421: procedure sec5();
                    422: write("[Fib(i)]: ",Image(Sequence([],create (Pp_("i") &
                    423: i := Gen_(Genseq_,"i") & 1(GenJ_((Fib()) ,"i"),Qq_("i"))))));
                    424: write("[Fibs(i)]: ",Image(Sequence([],create (Pp_("i") &
                    425: i := Gen_(Genseq_,"i") & 1(GenJ_((Fibs()) ,"i"),Qq_("i"))))));
                    426: write("[G(i - 1)]: ",Image(Sequence([], create (0 | G()))));
                    427: write("[Izero:G(i)]: ",Image(Sequence([], create (0 | G()))));
                    428: write("[Izero:Gk(i,2)]: ",Image(Sequence([], create (Gk(2)))));
                    429: end
                    430: procedure Compress(X)                  # compression of X to scalar sequence
                    431:    return Sequence([],create Collapse_(Copy(X)))
                    432: end
                    433: 
                    434: procedure Copy(X)                      # copy X
                    435:    local e, i 
                    436:    i := *X.a
                    437:    return Sequence(copy(X.a),create Pre_(X.e,i))
                    438: end
                    439: 
                    440: procedure Compose(f,X1,X2,X3,X4)       # apply f in parallel
                    441:    local a
                    442: end
                    443: 
                    444: procedure Empty(X)                     # is X an empty sequence?
                    445:    if /X then return Phi
                    446:    if not(S_(X)) | (*X.a > 0) | put(X.a,@X.e) then fail
                    447:    else return Phi
                    448: end
                    449: 
                    450: procedure Image(X,i,r)                 # image of X to i values
                    451:    local s, t, j
                    452:    if S_(X) then {
                    453:       /i := 5
                    454:       /r := 0
                    455:       if r >= i then return "{...}"
                    456:       j := 0
                    457:       s := "{"
                    458:       every t := (Gen_(X) \ i) do {
                    459:          s ||:= Image(t,i,r +:= 1) || ","
                    460:          j +:= 1
                    461:          }
                    462:       if j = 0 then return "{}"
                    463:       if Ref_(X,i + 1) then s ||:= "...,"
                    464:       s[-1] := "}"
                    465:       return s
                    466:       }
                    467:    else return image(X)
                    468: end
                    469: 
                    470: 
                    471: procedure ImageW(X,i,r)                        # image of X to i values
                    472:    local s, t, j
                    473:    if S_(X) then {
                    474:       /i := 5
                    475:       /r := 0
                    476:       if r >= i then return "{...}"
                    477:       j := 0
                    478:       s := "{"
                    479:       every t := (Gen_(X) \ i) do {
                    480:          s ||:= write(ImageW(t,i,r +:= 1)) || ","
                    481:          j +:= 1
                    482:          }
                    483:       if j = 0 then return "{}"
                    484:       if Ref_(X,i + 1) then s ||:= "...,"
                    485:       s[-1] := "}"
                    486:       return s
                    487:       }
                    488:    else return image(X)
                    489: end
                    490: 
                    491: procedure Index(X)                     # current size of X
                    492:    if not S_(X) then return 1
                    493:    return *X.a
                    494: end
                    495: 
                    496: procedure Last(X)                      # produce all values of X
                    497:    if not S_(X) then return X
                    498:    return X.a[Length(X)]
                    499: end
                    500: 
                    501: procedure Length(X)                    # length of X
                    502:    if not S_(X) then return 1
                    503:    while put(X.a,@X.e)
                    504:    return *X.a
                    505: end
                    506: 
                    507: procedure Next(X)                      # produce next value of X
                    508:    local x
                    509:    if not S_(X) then fail
                    510:    if x := @X.e then {
                    511:       put(X.a,x)
                    512:       return x
                    513:       }
                    514: end
                    515: 
                    516: procedure Print(X,i)                   # write the image of a stream
                    517:        Write(Image(X,i))
                    518:        return X
                    519: end
                    520: 
                    521: procedure Read(f)                      # sequence from file f
                    522:    return Sequence([],create read(!f))
                    523: end
                    524: 
                    525: procedure Red(X,op)                    # reduction of X over op
                    526:    local S
                    527: 
                    528:    S := Seq_(X)
                    529:    a := copy(S.a)
                    530:    e := S.e
                    531:    return Sequence([], create Red_(Sequence([], create !a | |@e),op))
                    532: end
                    533: 
                    534: procedure Run(X,i)                     # force computation of next i elements
                    535: 
                    536:    if not S_(X) then return X
                    537:    every 1 to i do 
                    538:       put(X.a,@X.e) | fail
                    539:    return X   
                    540: end
                    541: 
                    542: procedure Subseq(X,i,j)                        # subsequence of X from i to j
                    543:    return Lim_(Shift_(X,i-1),j - i + 1)
                    544: end
                    545: 
                    546: procedure Trace(X,i)                   # image of X, returning X
                    547:    write(Image(X,i))
                    548:    return X
                    549: end
                    550: 
                    551: procedure Write(X)                     # write elements in X with linefeeds
                    552:    return Generic_(write,X)
                    553: end
                    554: 
                    555: procedure Writes(X)                    # write elements in X without linefeeds
                    556:    return Generic_(writes,X)
                    557: end

unix.superglobalmegacorp.com

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