Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Век живи, век учись и максимусом помрёшь (https://javascript.ru/forum/offtopic/46477-vek-zhivi-vek-uchis-i-maksimusom-pomrjosh.html)

Tim 11.04.2014 11:53

Век живи, век учись и максимусом помрёшь
 
var myString = function () {
    /*
        многостройчный
        текст
        вот

        вроде всё просто но сам бы не догадался

        оно мне и не нужно, ибо кофескрипт.... но всё равно интересная штука
    */
}.toString().match(/\*((.|[\r\n])*)\*/)[1];

alert(myString);



p.s.: делимся интересными трюками

monolithed 11.04.2014 13:21

Tim,
https://github.com/monolithed/__doc__ :)

Tim 11.04.2014 14:13

/** @namespace Function.prototype.__doc__ */
Object.defineProperty(Function.prototype, '__doc__', {
	/** @this Function */
	get: function ( ) {
		'use strict';

		var comment = this.toString(),
		    __doc__ = '';

		if (comment = comment.match(/\/\*[!*]([^S\/]+)\*\//))
			__doc__ = comment[1];

		return __doc__;
	}
});


monolithed,
Да так интереснее


+++
ой, блин

https://avatars0.githubusercontent.com/u/803674?s=400

monolithed это ты??? о_0

monolithed 11.04.2014 14:17

Цитата:

Сообщение от Tim
monolithed это ты??? о_0

Это тайна покрытая мраком :D

Sweet 11.04.2014 14:47

monolithed,
function test() {
  /** S */
}

console.log(test.__doc__);
Отчего не любишь "S"?:)

Sweet 11.04.2014 14:59

Вообще, мне кажется более уместной такая регулярка:
/\/\*[!*]([\s\S]+?)\*\//

kobezzza 11.04.2014 15:11

Tim, чёт я не понял, а зачем этот хак может в принципе понадобится? это же какой то ад :)

Gozar 11.04.2014 15:30

Цитата:

Сообщение от kobezzza
это же какой то ад

+100500

Tim 11.04.2014 15:55

kobezzza, Gozar,
Я знаю, не провоцируйте холивар пож-та, лучше кусок интересного кода запостите

Maxmaxmaximus21 11.04.2014 16:44

fuck = "насиловать"

text = "
Этот текст написан на кофескрипте
Если хочется сахара то используйте его, а не пытайтесь #{fuck} js
"

и кстати, нет НИ ОДНОЙ логической причины прерывать строку красной строкой, совершенно очевидно что если кавычка не закрылась и идет красная строка, то эта красная строка часть текста. Я воспринмиаю эту нелепость как укоренившеюся ошибку парсера js.

monolithed 11.04.2014 16:52

Цитата:

Сообщение от Sweet
Отчего не любишь "S"?

Спасибо, поправлю!

monolithed 11.04.2014 17:47

Цитата:

Сообщение от Sweet
Вообще, мне кажется более уместной такая регулярка:
/\/\*[!*]([\s\S]+?)\*\//

На этом тесте валится:
test('/***.../', function () {
	var test = function () {
		/***/
		/*!*/
		/**/
		//
	};

	equal(test.__doc__, '');
});

monolithed 11.04.2014 17:54

Цитата:

Сообщение от kobezzza
чёт я не понял, а зачем этот хак может в принципе понадобится? это же какой то ад

Цитата:

Сообщение от Gozar
+100500

Для работы с Docstring:

Цитата:

Docstring is a string literal specified in source code that is used, like a comment, to document a specific segment of code.
Собственно, моя имплементация, представлена по ссылке выше.

В Python например, пошли еще дальше, и включили работу с Docstring в REPL.

# *.py
def function ():
   ''' Empty function '''
   ...

➜ python
python> help()
help> print

function ()
    'Empty function'

Sweet 11.04.2014 18:28

Цитата:

Сообщение от monolithed
На этом тесте валится

Действительно. Тогда я бы сделал так:
/\/\*[!*]([\s\S]*?)\*\//
:)
Она и с флагом g вроде корректно ищет.

monolithed 11.04.2014 18:49

Цитата:

Сообщение от Sweet
Действительно. Тогда я бы сделал так:
/\/\*[!*]([\s\S]*?)\*\//

Ага, так и сделал :)

Octane 14.04.2014 21:14

Цитата:

Сообщение от Tim
лучше кусок интересного кода запостите

Когда-то давно, когда только появились записи о arrow-функциях, видел такой пример:
function F(args, body) {
	return new Function(args, "return " + body);
}

array.map(F("x", "x * x"));

array.filter(F("x", "x % 2"));

array.sort(F("a, b", "Math.sign(a - b)"));

if (array.every(F("x", "x === true"))) {
    …
}

Но так и не решаюсь использовать в реальном коде из-за предрассудков о кодогенерации :-?

kobezzza 14.04.2014 21:20

Цитата:

Но так и не решаюсь использовать в реальном коде из-за предрассудков о кодогенерации
В данном контексте они (предрассудки) оправданы :)

DjDiablo 15.04.2014 00:01

Цитата:

Но так и не решаюсь использовать в реальном коде из-за предрассудков о кодогенерации
Предпочтительно по моему просто заранее объявить методы, не очень красиво генерировать одну и ту же функцию столько раз сколько она потребуется.

DjDiablo 15.04.2014 00:10

Интересно а оправдан ли чем то вот такой подход (просто в голову стукнуло).
Здесь кодогенерация сведена к минимуму, а расходы памяти такие же как если бы все функции были бы объявлены заранее.

function F(args, body) {
    F.cache=F.cache||{};
    F.cache[args+body]=F.cache[args+body]||new Function(args, "return " + body);
    return F.cache[args+body];
}
      
alert(F("x,y","x+y")(1, 2));

Octane 15.04.2014 00:39

Кстати IE11 сам умеет оптимизировать, цикл с деятком тысяч итераций вызывает F за несколько миллисекунд, если тело не меняется.

Aetae 15.04.2014 08:30

Я лично против "кода в строке", в любом его виде. Попахивает.

И так для вас ввели:
Пример: JavaScript 1.8
alert( (function(x,y)x+y)(1,2) );
что ещё надо то?)

kobezzza 15.04.2014 09:24

Цитата:

Сообщение от Aetae (Сообщение 307747)
Я лично против "кода в строке", в любом его виде. Попахивает.

И так для вас ввели:
Пример: JavaScript 1.8
alert( (function(x,y)x+y)(1,2) );
что ещё надо то?)

alert(((x, y) => x + y)(1, 2));


Правд нативно это тока в ФФ, но я уже больше года юзаю трансляторы и всё не нарадуюсь :)

kobezzza 15.04.2014 09:33

Цитата:

Сообщение от DjDiablo (Сообщение 307736)
Интересно а оправдан ли чем то вот такой подход (просто в голову стукнуло).
Здесь кодогенерация сведена к минимуму, а расходы памяти такие же как если бы все функции были бы объявлены заранее.

function F(args, body) {
    F.cache=F.cache||{};
    F.cache[args+body]=F.cache[args+body]||new Function(args, "return " + body);
    return F.cache[args+body];
}
      
alert(F("x,y","x+y")(1, 2));

Есть кейсы где оправдан, но твой пример не учитывает слишком много нюансов.

В своём Collection я уже давно ввёл поддержку строковых сокращений для фильтров в дополнение к простым функциям:

$C([1,2,3]).get(':el > 2');


Или же:

$C().addFilter({
    'filter1': function () {},
    'filter2': function () {},
    'filter3': function () {},
    'filter4': 'filter3 || filter2'
});

$C([1,2,3]).get('filter1 && filter2 || filter4');


Первый вариант на практике оказался очень удобным применительно в шаблонах:
https://github.com/kobezzza/Snakeskin#foreach-1

но в JS с введением Arrow Function от него мало проку.

А вот второй вариант оказался очень удобным и я регулярно его использую.

Maxmaxmaximus42 16.04.2014 01:05

а я юзаю кофесткрипт, меня тим перубедил и он был прав, и даже круглые скобки не ставлю теперь

Octane 30.04.2014 23:10

Как смотрите на то, чтобы маркировать тип переменной с помощью меток?
function example1() {
	integer:var index;
	string:var name;
}

function example2() {
	integer:var index;
	integer:var count;
	string:var name;
	string:var value;
}

function example3() {
	integer:var index, count;
	string:var name, value;
}

function example4() {
	integer:var index = 1, count;
	string:var name, value = "none";
}

UglifyJS может автоматически поудалять эти метки, для продакшион версии.

kobezzza 01.05.2014 09:34

Не выдумывай и юзай JSDoc или Dart/TypeScript :)

DjDiablo 01.05.2014 13:00

Цитата:

Сообщение от kobezzza (Сообщение 309989)
Не выдумывай и юзай JSDoc или Dart/TypeScript :)

Точнее и не скажешь)

Octane 02.05.2014 20:53

Цитата:

Сообщение от DjDiablo
Не выдумывай

так не интересно ничего не выдумывать :)

Недавно адаптировал скрипт для работы в браузере, ну и чтобы работало в IE8, убирал из скрипта NFE, например:
document.addEventListener("click", function callback(event) {
     document.removeEventListener("click", callback);
     …
});

нужно переделать в:
function callback(event) {
     document.removeEventListener("click", callback);
     …
}
document.addEventListener("click", callback);
Но это муторно все функции переделывать в FD, иногда имена совпадают, не всегда нужны эти функции в общем скопе и т.д.
arguments.callee использовать нельзя, потому что весь код в strict режиме исполняется в нормальных браузерах.
Можно облегчить себе жизнь, написав функцию, наподобие bind, но выполняющую привязку только для первого аргумента, и в качестве значения этого аргумента должна отправляться ссылка на bound-функцию:
function nfe(targetFunc) {
    function boundFunc() {
        Array.prototype.unshift.call(arguments, boundFunc);
        return targetFunc.apply(this, arguments);
    }
    return boundFunc;
}

Теперь можно делать так:
document.addEventListener("click", nfe(function (callback, event) {
    document.removeEventListener("click", callback);
    …
}));

или так:
setTimeout(nfe(function (onTime) {
    …
    setTimeout(onTime, 100);
}), 100);


Часовой пояс GMT +3, время: 02:09.