1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
#include <u.h>
#include <libc.h>
#include <bio.h>
#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, /* ≡ */
0, /* ≢ */
0, /* ∨ */
0, /* ∧ */
0, /* ⍲ */
0, /* ⍱ */
0, /* ↑ */
0, /* ↓ */
fnEnclose, /* ⊂ */
0, /* ⊃ */
fnNest, /* ⊆ */
0, /* ⌷ */
0, /* ⍋ */
0, /* ⍒ */
0, /* ⍳ */
0, /* ⍸ */
0, /* ∊ */
0, /* ⍷ */
0, /* ∪ */
0, /* ∩ */
0, /* ~ */
fnRavel, /* , */
0, /* ⍪ */
0, /* ⍴ */
0, /* ⌽ */
0, /* ⊖ */
0, /* ⍉ */
0, /* ⍎ */
0, /* ⍕ */
};
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;
}
Array *
fnNest(Array *right)
{
if(simplearray(right))
return fnEnclose(right);
else
return right;
}
Array *
fnEnclose(Array *right)
{
if(simplescalar(right))
return right;
else{
Array *res = mkarray(AtypeArray, 0, 1);
res->arraydata[0] = right;
return res;
}
}
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;
}
|