Сообщение от Rise
|
Paguo-86PK, можно сразу передавать функцию:
var BUG = function(formula) {
var adjust = 7;
this.Bug = function(n) {
while (n--) {
console.log("OUTSIDE: Adjust is " + adjust + ", N is " + n);
console.log("RESULT is " + formula(adjust, n));
}
return this;
};
};
var Bugs = new BUG(function(x, y) {
return x * y;
});
Bugs.Bug(5);
|
Eсли бы всё было так просто
Вы с эмуляторами сталкивались?
Пишу сейчас собственный под
РАДИО-86РК, где нудная цепочка "switch(машинный_код) case инструкция№1 ... case инструкция№255" заменена на массив.
Т.е. имеется структура регистров
var Register =
function(x) {
return {
id : "",
fx : 0,
hi : (x >> 8) & 255,
lo : x & 255,
start : x & 65535,
get reset() {
this.lo = this.start & 255,
this.hi = this.start >> 8;
return this.lo | (this.hi << 8);
},
get h() {
return this.hi;
},
set h(x) {
this.fx = (x >> 8) & 1;
this.hi = (x &= 255);
this.fx |= (x & 128) | (!x ? 64 : 0);
x ^= x >> 4;
x ^= x << 2;
x ^= x >> 1;
this.fx |= x & 4;
//console.log(this.id + ":" + (this.lo | (this.hi << 8)).toHex(-4));
},
get l() {
return this.lo;
},
set l(x) {
this.fx = (x >> 8) & 1;
this.lo = (x &= 255);
this.fx |= (x & 128) | (!x ? 64 : 0);
x ^= x >> 4;
x ^= x << 2;
x ^= x >> 1;
this.fx |= x & 4;
//console.log(this.id + ":" + (this.lo | (this.hi << 8)).toHex(-4));
},
get x() {
//console.log(this.id + ":" + (this.lo | (this.hi << 8)).toHex(-4));
return this.lo | (this.hi << 8);
},
set x(x) {
this.lo = x & 255, this.hi = (x >> 8) & 255;
//console.log(this.id + ":" + (this.lo | (this.hi << 8)).toHex(-4));
},
get m() {
//console.log(this.id + "[" + (this.lo | (this.hi << 8)).toHex(-4) + "]:" + (ram[this.lo | (this.hi << 8)] & 255).toHex(-2));
return ram[this.lo | (this.hi << 8)] & 255;
},
set m(x) {
ram[this.lo | (this.hi << 8)] = x & 255;
//console.log(this.id + "[" + (this.lo | (this.hi << 8)).toHex(-4) + "]=" + (ram[this.lo | (this.hi << 8)] & 255).toHex(-2));
},
get n() {
var x = this.lo | (this.hi << 8);
this.lo = (this.lo + 1) & 255;
this.hi = !this.lo ? (this.hi + 1) & 255 : this.hi;
return ram[x];
},
set n(x) {
this.hi = !this.lo ? (this.hi - 1) & 255 : this.hi;
this.lo = (this.lo - 1) & 255;
ram[this.lo | (this.hi << 8)] = x & 255;
},
get w() {
var x = this.lo | (this.hi << 8), d;
this.lo = (this.lo + 2) & 255;
this.hi = this.lo < 2 ? (this.hi + 1) & 255 : this.hi;
d = ram[x] + 256 * ram[(x + 1) & 65535];
//console.log("[" + x.toHex(-4) + "]:" + d.toHex(-4));
return d;
},
set w(x) {
this.hi = this.lo < 2 ? (this.hi - 1) & 255 : this.hi;
this.lo = (this.lo - 2) & 255;
ram[this.lo | (this.hi << 8)] = x & 255;
ram[(this.lo + (this.hi << 8) + 1) & 65535] = (x >> 8) & 255;
//console.log("[" + (this.lo | (this.hi << 8)).toHex(-4) + "]=" + x.toHex(-4));
},
}
};
В основном цикле эмулятора, когда просто через eval пропускается нечто типа "r.a.h = r.b.l" - полный порядок. А если всё красиво обернуть в функции { r.a.h = r.b.l; }, то никак не получается заставить видеть r-структуру.
Вы сами понимаете, что подготовить все 256 функций к вызовам и потом их вызывать - куда быстрее, чем каждый раз интерпретировать eval'ом тысячи команд за раз.
P.S.: Сейчас нашёл более-менее работающий способ: Все 256 функций при инициализации прописываю прямо внутри операционного цикла, к которому насильно привязываю ещё и регистры с памятью.
Некрасиво, обвёрнуто в with(this), но заработало…
А передавать всё через аргументы - пробовал в прошлом году. Огороды скобок и некоторые вещи сделать нельзя.
(у меня R$1 разворачивается в r.a.l, что раньше было R$1(R$1()+R$2()) как r.a.l(r.a.l()+r.b.h()) и тяжело визуально наблюдалось. сейчас - просто R$1+=R$2 за r.a.l+=r.b.h, что коротко и понятно)
Не просил бы помощи, если бы задача была проще.
Нужно мне именно так, как я описал выше. И никак иначе