diff options
-rw-r--r-- | apl9.h | 2 | ||||
-rw-r--r-- | concurrency.c | 6 | ||||
-rw-r--r-- | main.c | 16 | ||||
-rw-r--r-- | quadnames.c | 89 | ||||
-rw-r--r-- | tests/chain.apl | 3 |
5 files changed, 102 insertions, 14 deletions
@@ -329,6 +329,8 @@ Array *runtrain(Function *, int, Array *, Array *, Array *); /* quadnames.c */ void initquadnames(void); Datum *quadnamedatum(QuadnameDef); +void setquotequad(Datum *); +Array *runfile(Array *); /* error.c */ ErrorGuard *newerrorguard(Array *, Statement *); diff --git a/concurrency.c b/concurrency.c index 31464f7..3eb6685 100644 --- a/concurrency.c +++ b/concurrency.c @@ -86,6 +86,7 @@ void messagesend(Array *a, int id) { ThreadData *td = nil; + ThreadData *selftd = getthreaddata(); lock(&threadlock); for(int i = 0; i < nthreads && td == nil; i++) if(threads[i]->id == id) @@ -94,7 +95,10 @@ messagesend(Array *a, int id) if(td != nil){ qlock(&td->lock); Mail *newmail = emalloc(sizeof(Mail)); - newmail->contents = fnSame(a); + newmail->contents = allocarray(AtypeArray, 1, 2); + newmail->contents->shape[0] = 2; + newmail->contents->arraydata[0] = mkscalarint(selftd->id); + newmail->contents->arraydata[1] = fnSame(a); newmail->next = 0; if(td->lastmail != nil) td->lastmail->next = newmail; @@ -7,6 +7,8 @@ #include "apl9.h" Biobuf *stdin; +static int booted = 0; +static Rune *startfile = L"runtime/start.apl"; void threadmain(int argc, char *argv[]) @@ -46,16 +48,22 @@ restart: goto restart; } + if(!booted){ + booted = 1; + Array *path = mkrunearray(startfile); + runfile(path); + freearray(path); + } + while(!off){ checkmem("main loop"); - if(needsnewline){ + /* if(needsnewline){ print("\n"); needsnewline = 0; - } - print("\t"); + } */ Datum *result = evalline(nil, stdin, 1); if(result && !result->shy) - print("%S\n", ppdatum(result)); + setquotequad(result); freedatum(result); /* print("Unfreed arrays: %d\n", arrayalloccounts); diff --git a/quadnames.c b/quadnames.c index e3d3ca8..90a76ff 100644 --- a/quadnames.c +++ b/quadnames.c @@ -6,9 +6,13 @@ #include "apl9.h" Datum *getquotequad(void); -void setquotequad(Datum *); +/* void setquotequad(Datum *); in apl9.h */ Datum *getquad(void); void setquad(Datum *); +Datum *getquotequadrawio(void); +void setquotequadrawio(Datum *); +Datum *getquadrawio(void); +void setquadrawio(Datum *); Datum *getio(void); void setio(Datum *); Datum *getpp(void); @@ -19,8 +23,10 @@ Datum *geta(void); Datum *getd(void); Datum *geten(void); Datum *getself(void); +Datum *getsession(void); +void setsession(Datum *); -Array *runfile(Array *); +/* Array *runfile(Array *); in apl9.h */ Array *quadem(Array *); Array *quadsignal1(Array *); Array *quadsignal2(Array *, Array *); @@ -34,10 +40,13 @@ Array *quadtasks2(Array *, Array *); int needsnewline = 0; static Rune *quadquotebuf = nil; static Lock quadlock; +static Array *session = nil; QuadnameDef quadnames[] = { {L"⍞", NameTag, getquotequad, setquotequad, nil, nil}, {L"⎕", NameTag, getquad, setquad, nil, nil}, + {L"⍞RAWIO", NameTag, getquotequadrawio, setquotequadrawio, nil, nil}, + {L"⎕RAWIO", NameTag, getquadrawio, setquadrawio, nil, nil}, {L"⎕IO", NameTag, getio, setio, nil, nil}, {L"⎕PP", NameTag, getpp, setpp, nil, nil}, {L"⎕DIV", NameTag, getdiv, setdiv, nil, nil}, @@ -45,6 +54,7 @@ QuadnameDef quadnames[] = { {L"⎕D", NameTag, getd, nil, nil, nil}, {L"⎕EN", NameTag, geten, nil, nil, nil}, {L"⎕SELF", NameTag, getself, nil, nil, nil}, + {L"⎕SESSION", NameTag, getsession, setsession, nil, nil}, {L"⎕RUN", FunctionTag, nil, nil, runfile, nil}, {L"⎕EM", FunctionTag, nil, nil, quadem, nil}, {L"⎕SIGNAL", FunctionTag, nil, nil, quadsignal1, quadsignal2}, @@ -99,6 +109,42 @@ quadnamedatum(QuadnameDef q) Datum * getquotequad(void) { + return getquotequadrawio(); +} + +void +setquotequad(Datum *d) +{ + Rune *str = ppdatum(d); + Array *strarray = mkrunearray(str); + if(session) + rundfn(L"0::⍞RAWIO←⍶ ⋄ ⍺ ⍈ ⍵", d, nil, strarray, session); + else + setquotequadrawio(d); + free(str); + freearray(strarray); +} + +/* ⎕ */ +Datum * +getquad(void) +{ + return getquadrawio(); +} + +void +setquad(Datum *d) +{ + if(session) + rundfn(L"0::⎕RAWIO←⍶ ⋄ ⍶ ⍈ ⍵", d, nil, nil, session); + else + setquadrawio(d); +} + +/* ⍞RAWIO */ +Datum * +getquotequadrawio(void) +{ lock(&quadlock); int sizemax = 512; int size; @@ -130,9 +176,16 @@ getquotequad(void) } void -setquotequad(Datum *new) +setquotequadrawio(Datum *new) { + if(new->tag == ArrayTag && GetType(new->array) == AtypeRune){ + for(int i = 0; i < GetSize(new->array); i++) + print("%C", new->array->runedata[i]); + return; + } lock(&quadlock); + + Rune *str = ppdatum(new); if(needsnewline && quadquotebuf != nil){ if(quadquotebuf){ @@ -151,9 +204,9 @@ setquotequad(Datum *new) unlock(&quadlock); } -/* ⎕ */ +/* ⎕RAWIO */ Datum * -getquad(void) +getquadrawio(void) { print("⎕:\n\t"); Datum *result = evalline(nil, nil, 1); @@ -162,8 +215,14 @@ getquad(void) } void -setquad(Datum *new) +setquadrawio(Datum *new) { + if(new->tag == ArrayTag && GetType(new->array) == AtypeRune){ + for(int i = 0; i < GetSize(new->array); i++) + print("%C", new->array->runedata[i]); + print("\n"); + return; + } lock(&quadlock); needsnewline = 0; print("%S\n", ppdatum(new)); @@ -261,6 +320,24 @@ getself(void) return d; } +/* ⎕SELF */ +Datum * +getsession(void) +{ + Datum *d = allocdatum(ArrayTag, 0); + d->array = fnSame(session); + return d; +} + +void +setsession(Datum *new) +{ + if(new->tag != ArrayTag + || GetRank(new->array) != 0 + || GetType(new->array) != AtypeInt) + throwerror(nil, EDomain); + session = fnSame(new->array); +} /* ⎕RUN */ Array * diff --git a/tests/chain.apl b/tests/chain.apl index 62bc1a9..af09a2b 100644 --- a/tests/chain.apl +++ b/tests/chain.apl @@ -1,6 +1,3 @@ -send←⍈ ⍝ I can't type those easily so give them names -recv←⍇ - worker←{ msg←{1 ⍵}recv ⍬ ⍵≡⍬: ⎕←'DONE' |