#include #include #include #include "apl9.h" Datum *getquad(void); int setquad(Datum); Datum *getio(void); int setio(Datum); QuadnameDef quadnames[] = { {L"⎕", NameTag, getquad, setquad, nil, nil}, {L"⎕IO", NameTag, getio, setio, nil, nil}, {nil, 0, nil, nil, nil, nil} /* MUST BE LAST */ }; Datum quadnamedatum(QuadnameDef q) { Datum d; d.tag = q.tag; switch(q.tag){ case NameTag: d.symbol = getsym(currentsymtab, q.name); d.symbol->getfn = q.get; d.symbol->setfn = q.set; d.symbol->undefined = 0; break; case FunctionTag: case MonadicOpTag: case DyadicOpTag: default: print("Can't use quad names with type=%d\n", q.tag); exits("quadname"); } return d; } /* ⎕ */ Datum * getquad(void) { Rune *input = prompt(L"⎕:\n\t"); Datum *result = evalline(input); /* TODO check that the expression doesn't fail */ return result; } int setquad(Datum new) { print("%S\n", ppdatum(new)); return 1; } /* ⎕IO */ Datum * getio(void) { Datum *d = mallocz(sizeof(Datum), 1); d->tag = ArrayTag; d->array = mkscalarint(globalIO()); return d; } int setio(Datum new) { if(new.tag != ArrayTag || new.array->rank != 0 || new.array->type != AtypeInt || (new.array->intdata[0] != 0 && new.array->intdata[0] != 1)){ print("⎕IO: domain error\n"); return 0; }else{ currentsymtab->io = new.array->intdata[0]; return 1; } }