summaryrefslogtreecommitdiff
path: root/functions.c
blob: ddd55321af0e6cb0a852fc2a778b48eb3b379807 (plain) (blame)
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;
}