summaryrefslogtreecommitdiff
path: root/quadnames.c
diff options
context:
space:
mode:
Diffstat (limited to 'quadnames.c')
-rw-r--r--quadnames.c77
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