diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-15 22:46:56 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-15 22:46:56 +0000 |
commit | f02e90b27e37f91d4409842dd21cd00c999c805d (patch) | |
tree | 26117d12dadf2a15cc57bfc8b34c221ae0378dec /quadnames.c | |
parent | d464a1d3a62d620b6336131c355467bdc273e3c5 (diff) |
Implement quad names for variables
Diffstat (limited to 'quadnames.c')
-rw-r--r-- | quadnames.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/quadnames.c b/quadnames.c new file mode 100644 index 0000000..b765e58 --- /dev/null +++ b/quadnames.c @@ -0,0 +1,77 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> + +#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; + } +}
\ No newline at end of file |