Annotation of researchv10dc/cmd/icon/tests/seqtest.icn, revision 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.