Показать сообщение отдельно
  #4 (permalink)  
Старый 28.02.2017, 10:40
Аватар для Paguo-86PK
Профессор
Отправить личное сообщение для Paguo-86PK Посмотреть профиль Найти все сообщения от Paguo-86PK
 
Регистрация: 16.09.2009
Сообщений: 253

Сообщение от 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, что коротко и понятно)
Не просил бы помощи, если бы задача была проще.
Нужно мне именно так, как я описал выше. И никак иначе

Последний раз редактировалось Paguo-86PK, 02.03.2017 в 00:22.
Ответить с цитированием