pythonic JS

pilot

function map(fn){
var args = new Array;
for(i=1;i<arguments.length;i++)
args.push(arguments[i]);
fn.apply(null,args);
};

function range(start,end,step){
if(!step)step=1;
var res = new Array;
for(var i=start;i<end;i+=step){
res.push(i);
}
return res;
};

function filter(fn,data){
res = new Array;
for(var i=0;i<data.length;i++){
if (fn(data[i] res.push(data[i]);
}
return res;
};

function reduce(fn,data,initial){
var res = null;

if (initial == null){
res = data[0];
} else {
res = fn(initial,data[0]);
}

for(var i=1;i<data.length;i++){
res = fn(res,data[i]);
}
return res;
}

function in_(element,data){
for (var i=0;i<data.length;i++){
if (element == data[i]){
return true;
}
}
return false;
}


Как дополнить и улучшить? (Например, 'arguments' deprecated с JS 1.3)
Проверки длин массивов не считаем

tipnote

Гы А я-то наивно пытаюсь писать поменьше на js - побольше на питоне, генерирующему js.

pilot

Здесь хочется, на самом деле, чтобы функции, передаваемые map, filter и reduce, могли использовать переменные контекста вызвваемой функции, как в питоне.
Python
>>>str = 'Hello ';
>>>map(lambda x: str+x, ['world!','all!'])
['Hello world!', 'Hello all!']

Функцией apply, похоже, можно замутить такое. Не соображу "как".

pilot

Это можно сделать если ты пишешь на JS кусочки кода.
А мне надо приложение с минимумом HTML и максимумом JS.
Т.е. с логикой довольно хитрой.
Вряд ли ее получится сгенерить.
А ты чем генеришь?

tipnote

Сообщение удалил

tipnote

Это можно сделать если ты пишешь на JS кусочки кода.
А мне надо приложение с минимумом HTML и максимумом JS.
Т.е. с логикой довольно хитрой.
Вряд ли ее получится сгенерить.
А ты чем генеришь?

Да не, я некорректно выразился. Я стараюсь всю логику (вычисления к примеру) написать на питоне и максимально переиспользовать уже раз написанные js куски забитые в шаблоны. А вообще можно попытаться похимичить с simplejson чтобы с питона получать js.

pilot

> а воспользоваться window.имя_переменной не катит?

function Sample(samples){
var prefix = 'Sample:';
map(function(x){alert(prefix+x);},samples);
}

var prefix = '';
var samples = new Array;
samples[0] = new Sample(['Hello', 'world!']);

И как тут?

pilot

Функцией apply, похоже, можно замутить такое. Не соображу "как".
В JS встроена какая-то реализация этого:
function Hello(world){
var hello = 'hello ';
this.hello = function{alert(hello+world);};
}

var hello = new Hello('world!');
hello.hello;

pilot

'arguments' deprecated с JS 1.3
Deprecated только свойство объекта Function. А объект такой внутри function в ECMAScript есть.
map какой хотел:
function map(fn){
var args = new Array;
for(i=1;i<arguments.length;i++)
args.push(arguments[i]);
fn.apply(this.caller,args);
};

Тогда:

var hello = '!';
function test{
var hello = 'hello ';
var x = 'world!';
map(function(x){alert(hello+x);},['all!']);
};

Работает. Но только в SpiderMonkey (http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_ReferenceFunction:caller)
Видимо, в IE & Opera не работает. Для IE есть аналоги?

Dasar

мы тебе не мешаем?
приведенный тобой скрипт работает в ie и в opera-е. что я делают не так?

Dasar

Вернее работает так как ты хочешь или такое:

function map(fn){
for(i=1;i<arguments.length;i++)
fn.apply(this.caller,[arguments[i]]);
};

function test{
var hello = 'hello ';
map(function(x){alert(hello+x);},'World', 'all!');
};

test;

или такое

function map(fn){
for(i in arguments[1])
fn.apply(this.caller,[arguments[1][i]]);
};

function test{
var hello = 'hello ';
map(function(x){alert(hello+x);},['World', 'all!']);
};

test;

pilot

ОО, ты прав.
Я не заметил что у меня в map'е не то делается _вообще_.
А this.caller не нужен на самом деле, вместо него null точно так же работает (про это в предыдущем посте).
Пока причесывал свой map — сломал. Поэтому тот map который здесь вообще неправильный.

pilot

ОО, ты прав.
Только на самом деле я хочу так (чтобы возвращалась последовательность применений функции, чтобы количество аргументов не было ограничено):
function map(fn){
var res = new Array;
var arr = new Array;
for(i=0;i< arguments[1].length;i++){
for(j=1;j<arguments.length;j++)
arr[j-1] = arguments[j][i];
res.push(fn.apply(null,arr;
};
return res;
};

function test{
var prefix = 'el: ';
alert(map(function(x,y){return prefix+x+y;},['foo','bar'], ['bar','foo'];
};

test;

Еще бы как-нибудь искать минимальную длину аргументов прилично...
Оставить комментарий
Имя или ник:
Комментарий: