kopia lustrzana https://github.com/backface/turtlestitch
removed code for APL-style scalars from evaluator
rodzic
e8fc99ac2a
commit
5503138bbd
153
src/threads.js
153
src/threads.js
|
@ -560,7 +560,6 @@ Process.prototype.enableLiveCoding = false; // experimental
|
||||||
Process.prototype.enableSingleStepping = false; // experimental
|
Process.prototype.enableSingleStepping = false; // experimental
|
||||||
Process.prototype.enableCompiling = false; // experimental
|
Process.prototype.enableCompiling = false; // experimental
|
||||||
Process.prototype.flashTime = 0; // experimental
|
Process.prototype.flashTime = 0; // experimental
|
||||||
Process.prototype.enableAPLscalars = false; // very experimental
|
|
||||||
// Process.prototype.enableJS = false;
|
// Process.prototype.enableJS = false;
|
||||||
|
|
||||||
function Process(topBlock, receiver, onComplete, yieldFirst) {
|
function Process(topBlock, receiver, onComplete, yieldFirst) {
|
||||||
|
@ -2297,9 +2296,6 @@ Process.prototype.doSetGlobalFlag = function (name, bool) {
|
||||||
case 'mirror video':
|
case 'mirror video':
|
||||||
stage.mirrorVideo = bool;
|
stage.mirrorVideo = bool;
|
||||||
break;
|
break;
|
||||||
case 'APL scalars':
|
|
||||||
this.toggleAPLscalars(bool);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2321,8 +2317,6 @@ Process.prototype.reportGlobalFlag = function (name) {
|
||||||
.data[3] > 0;
|
.data[3] > 0;
|
||||||
case 'mirror video':
|
case 'mirror video':
|
||||||
return stage.mirrorVideo;
|
return stage.mirrorVideo;
|
||||||
case 'APL scalars':
|
|
||||||
return Process.prototype.enableAPLscalars;
|
|
||||||
default:
|
default:
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
@ -3546,7 +3540,7 @@ Process.prototype.reportTypeOf = function (thing) {
|
||||||
|
|
||||||
// Process math primtives - hyper-dyadic
|
// Process math primtives - hyper-dyadic
|
||||||
|
|
||||||
Process.prototype.hyperDyadicSimple = function (baseOp, a, b) {
|
Process.prototype.hyperDyadic = function (baseOp, a, b) {
|
||||||
// enable dyadic operations to be performed on lists and tables
|
// enable dyadic operations to be performed on lists and tables
|
||||||
var len, i, result;
|
var len, i, result;
|
||||||
if (this.enableHyperOps) {
|
if (this.enableHyperOps) {
|
||||||
|
@ -3572,7 +3566,7 @@ Process.prototype.hyperDyadicSimple = function (baseOp, a, b) {
|
||||||
return baseOp(a, b);
|
return baseOp(a, b);
|
||||||
};
|
};
|
||||||
|
|
||||||
Process.prototype.hyperZipSimple = function (baseOp, a, b) {
|
Process.prototype.hyperZip = function (baseOp, a, b) {
|
||||||
// enable dyadic operations to be performed on lists and tables
|
// enable dyadic operations to be performed on lists and tables
|
||||||
var len, i, result;
|
var len, i, result;
|
||||||
if (a instanceof List) {
|
if (a instanceof List) {
|
||||||
|
@ -3595,97 +3589,6 @@ Process.prototype.hyperZipSimple = function (baseOp, a, b) {
|
||||||
return baseOp(a, b);
|
return baseOp(a, b);
|
||||||
};
|
};
|
||||||
|
|
||||||
Process.prototype.hyperDyadicAPL = function (baseOp, a, b) {
|
|
||||||
// enable dyadic operations to be performed on lists and tables
|
|
||||||
// treat single-item lists as scalars
|
|
||||||
var len, a_info, b_info, i, result;
|
|
||||||
if (this.enableHyperOps) {
|
|
||||||
a_info = this.examine(a);
|
|
||||||
b_info = this.examine(b);
|
|
||||||
if (a_info.isScalar && b_info.isScalar &&
|
|
||||||
(a_info.rank !== b_info.rank)) {
|
|
||||||
// keep the shape of the higher rank
|
|
||||||
return this.hyperZip(
|
|
||||||
baseOp,
|
|
||||||
a_info.rank > b_info.rank ? a : a_info.scalar,
|
|
||||||
b_info.rank > a_info.rank ? b : b_info.scalar
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (a_info.rank > 1) {
|
|
||||||
if (b_info.rank > 1) {
|
|
||||||
if (a.length() !== b.length()) {
|
|
||||||
// test for special cased scalars in single-item lists
|
|
||||||
if (a_info.isScalar) {
|
|
||||||
return this.hyperDyadic(baseOp, a_info.scalar, b);
|
|
||||||
}
|
|
||||||
if (b_info.isScalar) {
|
|
||||||
return this.hyperDyadic(baseOp, a, b_info.scalar);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// zip both arguments ignoring out-of-bounds indices
|
|
||||||
a = a.asArray();
|
|
||||||
b = b.asArray();
|
|
||||||
len = Math.min(a.length, b.length);
|
|
||||||
result = new Array(len);
|
|
||||||
for (i = 0; i < len; i += 1) {
|
|
||||||
result[i] = this.hyperDyadic(baseOp, a[i], b[i]);
|
|
||||||
}
|
|
||||||
return new List(result);
|
|
||||||
}
|
|
||||||
if (a_info.isScalar) {
|
|
||||||
return this.hyperZip(baseOp, a_info.scalar, b);
|
|
||||||
}
|
|
||||||
return a.map(each => this.hyperDyadic(baseOp, each, b));
|
|
||||||
}
|
|
||||||
if (b_info.rank > 1) {
|
|
||||||
if (b_info.isScalar) {
|
|
||||||
return this.hyperZip(baseOp, a, b_info.scalar);
|
|
||||||
}
|
|
||||||
return b.map(each => this.hyperDyadic(baseOp, a, each));
|
|
||||||
}
|
|
||||||
return this.hyperZip(baseOp, a, b);
|
|
||||||
}
|
|
||||||
return baseOp(a, b);
|
|
||||||
};
|
|
||||||
|
|
||||||
Process.prototype.hyperZipAPL = function (baseOp, a, b) {
|
|
||||||
// enable dyadic operations to be performed on lists and tables
|
|
||||||
// treat single-item lists as scalars
|
|
||||||
var len, i, result,
|
|
||||||
a_info = this.examine(a),
|
|
||||||
b_info = this.examine(b);
|
|
||||||
if (a instanceof List) {
|
|
||||||
if (b instanceof List) {
|
|
||||||
if (a.length() !== b.length()) {
|
|
||||||
// test for special cased scalars in single-item lists
|
|
||||||
if (a_info.isScalar) {
|
|
||||||
return this.hyperZip(baseOp, a_info.scalar, b);
|
|
||||||
}
|
|
||||||
if (b_info.isScalar) {
|
|
||||||
return this.hyperZip(baseOp, a, b_info.scalar);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// zip both arguments ignoring out-of-bounds indices
|
|
||||||
a = a.asArray();
|
|
||||||
b = b.asArray();
|
|
||||||
len = Math.min(a.length, b.length);
|
|
||||||
result = new Array(len);
|
|
||||||
for (i = 0; i < len; i += 1) {
|
|
||||||
result[i] = this.hyperZip(baseOp, a[i], b[i]);
|
|
||||||
}
|
|
||||||
return new List(result);
|
|
||||||
}
|
|
||||||
return a.map(each => this.hyperZip(baseOp, each, b));
|
|
||||||
}
|
|
||||||
if (b instanceof List) {
|
|
||||||
return b.map(each => this.hyperZip(baseOp, a, each));
|
|
||||||
}
|
|
||||||
return baseOp(a, b);
|
|
||||||
};
|
|
||||||
|
|
||||||
Process.prototype.hyperDyadic = Process.prototype.hyperDyadicSimple;
|
|
||||||
Process.prototype.hyperZip = Process.prototype.hyperZipSimple;
|
|
||||||
|
|
||||||
Process.prototype.dimensions = function (data) {
|
Process.prototype.dimensions = function (data) {
|
||||||
var dim = [],
|
var dim = [],
|
||||||
cur = data;
|
cur = data;
|
||||||
|
@ -3710,58 +3613,6 @@ Process.prototype.rank = function(data) {
|
||||||
return rank;
|
return rank;
|
||||||
};
|
};
|
||||||
|
|
||||||
Process.prototype.isScalar = function (data) {
|
|
||||||
return this.dimensions.every(n => n === 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
Process.prototype.scalar = function (data) {
|
|
||||||
var cur = data;
|
|
||||||
while (cur instanceof List) {
|
|
||||||
cur = cur.at(1);
|
|
||||||
}
|
|
||||||
return cur;
|
|
||||||
};
|
|
||||||
|
|
||||||
Process.prototype.examine = function (data) {
|
|
||||||
var cur = data,
|
|
||||||
meta = {
|
|
||||||
rank: 0,
|
|
||||||
isScalar: true,
|
|
||||||
scalar: null
|
|
||||||
};
|
|
||||||
while (cur instanceof List) {
|
|
||||||
meta.rank += 1;
|
|
||||||
if (cur.length() !== 1) {
|
|
||||||
meta.isScalar = false;
|
|
||||||
}
|
|
||||||
cur = cur.at(1);
|
|
||||||
}
|
|
||||||
meta.scalar = cur;
|
|
||||||
return meta;
|
|
||||||
};
|
|
||||||
|
|
||||||
Process.prototype.toggleAPLscalars = function (flag) {
|
|
||||||
/*
|
|
||||||
very experimental. I don't like it and mark this feature for
|
|
||||||
removal. treating (even deep) single-item lists as scalars
|
|
||||||
must be a misfeature in APL introduced for convenience or to
|
|
||||||
work around some obvious design flaw. -jens
|
|
||||||
*/
|
|
||||||
if (!isNil(flag)) {
|
|
||||||
Process.prototype.enableAPLscalars = !!flag; // coerce to bool
|
|
||||||
} else {
|
|
||||||
Process.prototype.enableAPLscalars =
|
|
||||||
!Process.prototype.enableAPLscalars;
|
|
||||||
}
|
|
||||||
if (Process.prototype.enableAPLscalars) {
|
|
||||||
Process.prototype.hyperDyadic = Process.prototype.hyperDyadicAPL;
|
|
||||||
Process.prototype.hyperZip = Process.prototype.hyperZipAPL;
|
|
||||||
} else {
|
|
||||||
Process.prototype.hyperDyadic = Process.prototype.hyperDyadicSimple;
|
|
||||||
Process.prototype.hyperZip = Process.prototype.hyperZipSimple;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Process math primtives - arithmetic
|
// Process math primtives - arithmetic
|
||||||
|
|
||||||
Process.prototype.reportSum = function (a, b) {
|
Process.prototype.reportSum = function (a, b) {
|
||||||
|
|
Ładowanie…
Reference in New Issue