Skip to content

Commit d3453e7

Browse files
authoredDec 5, 2024··
Merge pull request #121 from aya-lang/cleanup-2024dec4
Standard Library Cleanup & A Few Fixes
2 parents 1bde0bf + 7149ceb commit d3453e7

File tree

9 files changed

+85
-51
lines changed

9 files changed

+85
-51
lines changed
 

‎examples/genetic.aya

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ struct dna {data fitness}
1515
.# over the length of the array
1616
def dna::calc_fitness {target::dna self,
1717
.# Leave the fitness on the stack
18-
target.data self.data .= .E \W\ / $ self.:fitness;
18+
target.data self.data {=} .& .E \W\ / $ self.:fitness;
1919
}
2020

2121
.# Apply a random mutation to the dna

‎examples/plot/iris.aya

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ df.["Species"] :~ :species;
99
plot.plot! :plt;
1010
"Iris Dataset" plt.:title;
1111
"sepal length" plt.x.:label;
12-
"sepal width" plt.y.:label;
12+
"sepal width" plt.y.:label;
1313

1414
species :# {s_name : sp_df,
15-
"Species" {s_name =} df.filter_on_col :sp_df;
16-
sp_df.["Sepal.Length"] sp_df.["Sepal.Width"] {, s_name:label } plt.scatter
15+
df.[df.["Species"] s_name .=] :sp_df;
16+
sp_df.["Sepal.Length"] sp_df.["Sepal.Width"] {, s_name:label } plt.scatter
1717
};
1818

1919
plt.view

‎src/aya/instruction/op/DotOps.java

+22-16
Original file line numberDiff line numberDiff line change
@@ -726,35 +726,41 @@ public void execute(BlockEvaluator blockEvaluator) {
726726
}
727727
}
728728

729-
// = 61 new OP_Dot_Equals(),
729+
// = - 61
730730
class OP_Dot_Equals extends Operator {
731-
731+
732732
public OP_Dot_Equals() {
733733
init(".=");
734-
arg("LL|AL|LA", "element-wise equivalence");
734+
arg("AA", "equality (vectorized)");
735+
vect();
735736
}
736737

738+
private static NumberListOp NUML_OP = new NumberListOp() {
739+
public NumberList ln(NumberList a, Number b) { return a.eq(b);}
740+
public NumberList nl(Number a, NumberList b) { return b.eq(a);}
741+
public NumberList ll(NumberList a, NumberList b) { return a.eq(b);}
742+
public NumberList l(NumberList a) { throw new UnimplementedError(); }
743+
};
744+
737745
@Override
738746
public void execute(final BlockEvaluator blockEvaluator) {
739-
final Obj a = blockEvaluator.pop();
740747
final Obj b = blockEvaluator.pop();
741-
742-
if (a.isa(DICT) && b.isa(DICT)) {
743-
blockEvaluator.push(a.equiv(b) ? Num.ONE : Num.ZERO);
744-
} else if (a.isa(LIST) && b.isa(LIST)) {
745-
blockEvaluator.push(asList(a).equalsElementwise(asList(b)));
746-
} else if ( a.isa(LIST) ) {
747-
blockEvaluator.push(asList(a).equalsElementwise(b));
748-
} else if ( b.isa(LIST) ) {
749-
blockEvaluator.push(asList(b).equalsElementwise(a));
750-
} else {
751-
throw new TypeError(this, a, b);
752-
}
748+
final Obj a = blockEvaluator.pop();
749+
blockEvaluator.push(exec2arg(blockEvaluator.getContext(), a, b));
753750
}
754751

752+
@Override
753+
public Obj exec2arg(ExecutionContext context, final Obj a, final Obj b) {
754+
Obj res;
755+
// First apply standard vectorization rules
756+
if ((res = VectorizedFunctions.vectorize2arg(context, this, a, b, NUML_OP)) != null) return res;
757+
// Vectorization rules applied, return standard equals
758+
return Num.fromBool(a.equiv(b));
759+
}
755760
}
756761

757762

763+
758764
// ? - 63
759765
class OP_Dot_Conditional extends Operator {
760766

‎src/aya/variable/VariableData.java

+11-8
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ class Scope {
5151
private final Dict OBJ_NUM = new Dict();
5252
private final Dict OBJ_CHAR = new Dict();
5353
private final Dict OBJ_BLOCK = new Dict();
54-
private final Dict BUILTINS = new Dict();
54+
55+
// Builtins are static across all threads
56+
private static final Dict BUILTINS = new Dict();
5557

5658
public final Dict OBJ_NIL = new Dict();
5759

@@ -72,7 +74,6 @@ public VariableData duplicateWithGlobals() {
7274
v.OBJ_CHAR.update(this.OBJ_CHAR);
7375
v.OBJ_BLOCK.update(this.OBJ_BLOCK);
7476
v.OBJ_NIL.update(this.OBJ_NIL);
75-
v.BUILTINS.update(this.BUILTINS);
7677

7778
return v;
7879
}
@@ -93,12 +94,14 @@ public void initGlobals() {
9394
OBJ_NUM.set(SymbolConstants.KEYVAR_META, OBJ_NUM);
9495
OBJ_STR.set(SymbolConstants.KEYVAR_META, OBJ_STR);
9596

96-
BUILTINS.set(SymbolConstants.CHAR, OBJ_CHAR);
97-
BUILTINS.set(SymbolConstants.SYM, OBJ_SYM);
98-
BUILTINS.set(SymbolConstants.BLOCK, OBJ_BLOCK);
99-
BUILTINS.set(SymbolConstants.LIST, OBJ_LIST);
100-
BUILTINS.set(SymbolConstants.NUM, OBJ_NUM);
101-
BUILTINS.set(SymbolConstants.STR, OBJ_STR);
97+
if (BUILTINS.size() == 0) {
98+
BUILTINS.set(SymbolConstants.CHAR, OBJ_CHAR);
99+
BUILTINS.set(SymbolConstants.SYM, OBJ_SYM);
100+
BUILTINS.set(SymbolConstants.BLOCK, OBJ_BLOCK);
101+
BUILTINS.set(SymbolConstants.LIST, OBJ_LIST);
102+
BUILTINS.set(SymbolConstants.NUM, OBJ_NUM);
103+
BUILTINS.set(SymbolConstants.STR, OBJ_STR);
104+
}
102105

103106
_var_sets.add(new Scope(globals));
104107
}

‎std/canvas.aya

+1-1
Original file line numberDiff line numberDiff line change
@@ -182,5 +182,5 @@ def canvas::text {self,
182182

183183
def canvas::get_pixels {self : data image^,
184184
self.id :{graphics.get_pixels} :data;
185-
data.data data.width data.height image!
185+
data.r data.g data.b data.a data.width data.height data.meta image!
186186
}

‎std/csv.aya

+10-9
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,26 @@ def csv::read { arg : csv^ ,
2929
}
3030

3131
def csv::_read_kw {kwargs::dict : csv^
32-
clabel(1)
33-
rlabel(nil)
34-
filename(nil)
35-
csv_str(nil)
32+
clabel(1) .# bool
33+
rlabel(::nil) .# bool
34+
filename(::nil) .# str
35+
csv_str(::nil) .# str
3636
dlm(",")
3737
data
38-
colnames(nil)
39-
rownames(nil),
38+
colnames(::nil) .# ::list
39+
rownames(::nil) .# ::list
40+
,
4041
kwargs ~
4142

42-
(csv_str nil = filename nil = &) {"csv.read: Must provide either filename or csv_str" .D} ?
43+
(csv_str ::nil = filename ::nil = &) {"csv.read: Must provide either filename or csv_str" .D} ?
4344

4445
.# Open the file and read into data
45-
filename nil =! {filenameP G :csv_str;} ?
46+
filename ::nil =! {filenameP G :csv_str;} ?
4647

4748
csv_str dlm csv.parse :data;
4849

4950
.# Attempt to auto-detect rlabel if it is not specified
50-
rlabel nil = {
51+
rlabel ::nil = {
5152
data.[0].[0] "" = {
5253
1 :rlabel;
5354
} {

‎std/dataframe.aya

+32-12
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ class dataframe
44
export ::dataframe
55

66
def dataframe::__init__ {kwargs::dict self :
7-
data(nil)
8-
colnames(nil)
9-
index(nil),
7+
data(::nil)
8+
colnames(::nil)
9+
index(::nil),
1010

1111
kwargs ~
1212

@@ -15,20 +15,20 @@ def dataframe::__init__ {kwargs::dict self :
1515
[] self.:_data;
1616

1717
.# Create using data
18-
data nil =! {:numrows numcols,
18+
data ::nil =! {:numrows numcols,
1919
data E :numrows;
2020
data .TE :numcols;
2121
data self.:_data;
2222

2323
.# Column names
24-
colnames nil = {
24+
colnames ::nil = {
2525
numcols self.M._gen_colnames
2626
} {
2727
colnames
2828
} .? self.:_colnames;
2929

3030
.# Row names
31-
index nil = {
31+
index ::nil = {
3232
numrows .R
3333
} {
3434
index
@@ -103,20 +103,40 @@ def dataframe::_get_col {colname self : colindex,
103103
self._data :# { colindex I }
104104
}
105105

106-
def dataframe::_numgetindex {index::num self : dataframe^,
107-
{,
108-
[self._data.[index]] :data;
109-
[self._index.[index]] :index;
110-
self._colnames :colnames;
111-
} dataframe!
106+
def dataframe::_numgetindex {index::num self : dataframe^ idx,
107+
.# Lookup the index in _index
108+
self._index index N :idx;
109+
110+
idx 0 :> {
111+
{,
112+
[self._data.[idx]] :data;
113+
[self._index.[idx]] :index;
114+
self._colnames :colnames;
115+
} dataframe!
116+
} {
117+
"Index $num does not exist in df._index" .D
118+
} .?
112119
}
113120

114121
def dataframe::__getindex__ { index self : dataframe^,
122+
.# If input is a number, look up that row, return a dataframe
123+
.# If input is a string, look up that column, return a list
124+
.# If input is a list, use it as a row mask, return a dataframe
115125
{
116126
(index :T ::num =) {
117127
index self._numgetindex
118128
} (index :T ::str =) {
119129
index self._get_col
130+
} (index :T ::list =) {
131+
index E self._data E = {
132+
{,
133+
self._data index .i :data;
134+
self._index index .i :index;
135+
self._colnames :colnames;
136+
} dataframe!
137+
} {
138+
"List length must match row length" .D
139+
} .?
120140
} {
121141
"Unsupported index: $index" .D
122142
}

‎std/image.aya

+4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ def image::pixels {self,
3232
[self.r self.g self.b self.a] .T
3333
}
3434

35+
def image::pixels_rgb {self,
36+
[self.r self.g self.b] .T
37+
}
38+
3539
def image::channels {self,
3640
[self.r self.g self.b self.a]
3741
}

‎test/dot_ops.aya

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{[1 2 3 [1 2]] 1 .= [ 1 0 0 [ 1 0 ] ] } test.test
2-
{"abc" "Abc" .= [0 1 1]} test.test
2+
{"abc" "Abc" {=} .& [0 1 1]} test.test
33

44
{ [1 2 3 4] [2 3] .- [ 1 2 ] } test.test
55
{ [1 2 3 4] 2 .- [ 1 2 4 ] } test.test

0 commit comments

Comments
 (0)