Cинтаксис add(2)(3) на JavaScript Повідомлення-посилання

Стоїть завдання реалізувати можливість такого синтаксису на JavaScript: var a = add(2)(3); //5. При чому, потрібно щоб add приймала довільну кількість параметрів (дужок). Логічно, що вона не має впливати на жодні інші математичні чи нематематичні операції та притримуватися пріоритету ((add(2)(3)(4) + add(1) - add(2)(3)); //5, (+('2' + add(0)) + add(1)); //21).

Коментарі (8)

RSS згорнути / розгорнути
+
0
А де то на практиці застосувати?
avatar

volopav

  • 18 березня 2010, 16:46
+
0
та хіба ж то не цікаво? ) як на мене, цікавий приклад використання не зовсім очевидних можливостей самого javascript, який дозволяє розширити бачення та поглибити знання мови, шо ніколи не буває зайвим. + такий собі триб*ют до знову модних функціональних мов, розминка для розуму і приклад агрегації трішки іншим способом ) мені ота концепція сподобалась, і я нашвидкоруч спробував розширити дотнетівський System.Collections.Generic.List<T> на c#, і нічо вроді таке собі вийшло, гарненько навіть )

internal class ChainedList<T> : List<T>
{

	public delegate AddAllDelegate AddAllDelegate(T item);

	public new ChainedList<T> Add(T item)
	{
		base.Add(item);
		return this;
	}

	public AddAllDelegate AddAll(T item)
	{
		base.Add(item);
		return AddAll;
	}

}

private static void Main()
{
	var list = new ChainedList<string> { "sub-zero", "zero" };
	list.Add("a lot of stuff").Add("again a lot of stuff");
	list.AddAll("one")("two")("three")("four");
	list.ForEach(Console.WriteLine);
}

список ініціалізаторів, на жаль, працює лише з конструкторами, а базовий Add() повертає void, і тому його ніяк не можна склеїти в ланцюжок (шо інколи дуже хочеться), тому можна замістити Add() новим методом, який можна було би склеювати, а можна і зробити зручніший як практично так і візуально метод, як, до прикладу, AddAll()

p.s. можна було би ше додати шось типу

public ChainedList<T> AddSequence(params T[] items)
{
	items.ToList().ForEach(base.Add);
	return this;
}


але то вже таке )
avatar

cyba

  • 18 березня 2010, 19:28
+
0
такі збочення потрібні, щоб оминути обмеження в строго типізованих мовах, а використання такого джаваскріпті є дурним тоном. Для С це є спрощенням, а для джаваскріпта — ускладненням.

Джаваскріптове лаконічне рішення виглядає так:
function add() {
    var sum = 0;
    for(var i = 0; i < arguments.length; i++) {
        sum += arguments[i];
    }
    return sum;
}

//Можна викликати функцію з будь-якою кількістю параметрів
add(1);
add(2, 5, 4324, -43);
avatar

volopav

  • 18 березня 2010, 20:36
+
0
1) збочення? дайте сюда функціональщиків! :D
2) про C мови не було, хоча в ньому таке ж можна
2.1) шарповий AddSequence приймає довільну к-сть параметрів — params же, йомайо
2.2) навіть ніразу не динамічний і зі всіх боків статичний C вміє приймати в функції довільну к-сть параметрів різних типів, і той же: int printf(const char *format, ...). те, якою ціною «динамічність» досягається в тому ж printf() — питання техніки і не більше
3) це ускладнення змушує мізки розминатися, а не бачити мову лише з одного боку

автору статті — окреме дякую ше раз за свого роду пост-фільтр
avatar

cyba

  • 19 березня 2010, 09:47
+
0
Під С я мав на увазі С#. Мій промах, але можна було б догатися.

Стаття про джаваскріпт, тому я запитав, де те, про що писав автор застосувати на практиці в джаваскріпті, а ти мені чогось втулив приклад сішарпу — для чого?

Те, що для тебе є не зовсім очевидними можливостями самого javascript для мене є очевидними можливостями і я знаю плюси і мінуси цих можливостей. Саме тому я запитав автора сферу застосування такого підходу, бо все ж таки не все знаю. Може бути, що в воно ідеально підходить для вирішення деяких задач і мені якраз цікаво про них почути. Про написання коду заради самого коду я знаю.
avatar

volopav

  • 19 березня 2010, 14:27
+
0
ну та, звідки ж мені знати про arguments.length
avatar

cyba

  • 19 березня 2010, 14:58
+
0
upd: практичне, застосування, йопт

>> If you know the answers, located in Sydney and looking for a job, drop me a line.
avatar

cyba

  • 19 березня 2010, 15:21
+
0
Ну як на мене, то це цяцька, але дуже хороша цяцька в тому плані, що розкриває одну з дуже сильних сторін джаваскріпта.
Подібним способом можна, наприклад, отримати статичні «приватні» змінні:

var fibo = (function(){
	var next = 1;
	var current = 0;
	var previous = 0;
	return function(){
		previous = current;
		current = next;
		next = current + previous;
		return current;
	};
})();
/* функція кожного наступного виклику буде повертати наступне число Фібоначчі */

Або ж таким способом можна плодити, наприклад, ітератори. Або придумати ще якийсь приклад. Можна підміняти функцію на іншу. Фантазії немає меж ;)
avatar

kunik

  • 19 березня 2010, 23:05

Тільки зареєстровані й авторизовані користувачі можуть залишати коментарі.