#include #include #include #include "apl9.h" Rune primfuncnames[] = L"+-×÷*⍟⌹○!?|⌈⌊⊥⊤⊣⊢=≠≤<>≥≡≢∨∧⍲⍱↑↓⊂⊃⊆⌷⍋⍒⍳⍸∊⍷∪∩~,⍪⍴⌽⊖⍉⍎⍕"; fnmonad monadfunctiondefs[] = { 0, /* + */ 0, /* - */ 0, /* × */ 0, /* ÷ */ 0, /* * */ 0, /* ⍟ */ 0, /* ⌹ */ 0, /* ○ */ 0, /* ! */ 0, /* ? */ 0, /* | */ 0, /* ⌈ */ 0, /* ⌊ */ 0, /* ⊥ */ 0, /* ⊤ */ 0, /* ⊣ */ 0, /* ⊢ */ 0, /* = */ 0, /* ≠ */ 0, /* ≤ */ 0, /* < */ 0, /* > */ 0, /* ≥ */ 0, /* ≡ */ fnTally, /* ≢ */ 0, /* ∨ */ 0, /* ∧ */ 0, /* ⍲ */ 0, /* ⍱ */ 0, /* ↑ */ 0, /* ↓ */ fnEnclose, /* ⊂ */ 0, /* ⊃ */ fnNest, /* ⊆ */ 0, /* ⌷ */ 0, /* ⍋ */ 0, /* ⍒ */ 0, /* ⍳ */ 0, /* ⍸ */ 0, /* ∊ */ 0, /* ⍷ */ 0, /* ∪ */ 0, /* ∩ */ 0, /* ~ */ fnRavel, /* , */ 0, /* ⍪ */ fnShape, /* ⍴ */ 0, /* ⌽ */ 0, /* ⊖ */ 0, /* ⍉ */ 0, /* ⍎ */ 0, /* ⍕ */ }; /* Monadic functions */ Array * fnTally(Array *right) { return mkscalarint(right->rank==0 ? 1 : right->shape[0]); } Array * fnEnclose(Array *right) { if(simplescalar(right)) return right; else{ Array *res = mkarray(AtypeArray, 0, 1); res->arraydata[0] = right; return res; } } Array * fnNest(Array *right) { if(simplearray(right)) return fnEnclose(right); else return right; } Array * fnRavel(Array *right) { Array *res = duparray(right); res->rank = 1; res->shape = realloc(res->shape, sizeof(int) * 1); res->shape[0] = res->size; return res; } Array * fnShape(Array *right) { Array *res = mkarray(AtypeInt, 1, right->rank); res->shape[0] = right->rank; for(int i = 0; i < right->rank; i++) res->intdata[i] = right->shape[i]; return res; } /* Dyadic functions */ Array * fnCatenateFirst(Array *left, Array *right) { /* not even close to being right, but it works for stranding :) */ if(left->rank == 0) left = fnRavel(left); if(right->rank == 0) right = fnRavel(right); /* assume two vectors of same type for now */ Array *res = mkarray(left->type, 1, left->size+right->size); res->shape[0] = left->shape[0] + right->shape[0]; memcpy(res->rawdata, left->rawdata, datasizes[res->type]*left->size); memcpy(res->rawdata+datasizes[res->type]*left->size, right->rawdata, datasizes[res->type]*right->size); return res; }