JavaScript
Abnormal programming
Comments 39
UFO landed and left these words here
+11
Если в коде, производительность которого хоть кому-то интересна, происходит такое, оверхед — меньшая из проблем.
0

Собственно какие проблемы то, кроме того, что нельзя перегружать методы базовых классов? Если оборачивать их обёртками, то и проблем, получается, нет?

0
Если оборачивать, то да, на первый план выходят тысячи оверхеда. Или не тысячи. Тут уж смотря как обернуть.
0

Тогда выходит, что тема статьи — не надо шутить с методами встроенных объектов. И не смоллтолком вымощена дорога в ад, и даже не конструкцией из смоллтолка, а желанием реализовать её точь в точь, как там.


Связывать смоллтолк с преисподней в таком контексте это примерно как писать, что генной инжеренией вымощена дорога в ад потому, что генном модифицированными продуктами кормят скотину, а ещё её кормят антибиотиками и потом антибиотики вместе с отходами выбрасывают в окружающую среду, отчего бактерии приобретают к ним невосприимчивость. И, если бы не генная инжерения — вырастить столько скотины не получилось бы, а значит из-за ГМО бактерии, невосприимчивые к антибиотикам нас всех убьют.

+1
Я полностью согласен с тем, что вы написали, и нигде не утверждал обратного)
-1

Да, я заметил, но у вас название статьи плохо бьётся с её содержимым.

+1
Я что-то посмотрел и так вышло, что это единственный коммент, на который я не ответил. Нехорошо получилось. Так что спасибо =)
+4
Вы так классно пишете, прочитал с огромным удовольствием :)
Спасибо!
+3
Жаль в js нет перезагрузки операторов, вот так бы началось веселье!!!
+2
Неистово плюсую ваши слова. К счастью или к сожалению, W3C не спешит исправлять этот фатальный недостаток. Впрочем, пока можно использовать это.
+1
Она понемногу появляется, можно например перезагружать оператор for-of через переопределения Symbol.iterator, можно перезагружать оператор точка (получение свойства) через прокси и т.д. Все к этому движется в основном благодаря символам, арифметические операции выполняются по другим правилам (если встречается объект он приводится с помощью Symbol.toPrimitive к примитиву) но возможно они введут новый символ который будет создавать контекст для операции (что-то по типу того как делается в фейковой перегрузке операторов, только не глобальный контекст, а именно локальный для операции).
+1
Прикольно было бы как в Lua. Если у операнда есть метод, соответствующий перекрываемому оператору, то вместо стандартной операции вызывается он. В Lua не совсем так, но для JS — самое то. По символу на каждый оператор.
+1
Да, я тоже мечтаю именно о такой реализации, но пока основная загвоздка в механизме работы арифметических операций, пока операнды приводятся к примитивам независимо друг от друга ничего об операции не зная и до выполнения операции, это хорошо работает для примитивов, но плохо сочетается с перезагрузкой, поэтому нужна новая схема применения операторов. Мне кажется через контекст операции это реализуется проще всего. Сначала каждый из операндов регистрирует себя в контексте операции (сейчас с помощью Symbol.toPrimitive можно регистрироваться в глобальном контексте), а затем во время вычисления операции нужно проверять — если контекст не пустой, то уже зная операцию вызывать нужный переопределенный метод для операндов из контекста (сейчас этого шага нет и операция просто проходит с примитивами, а в случае с фейковой перезагрузкой нужно иметь какой-то оберточный метод который будет проводить данную операцию для возвращения результата из контекста). Это кажется наименее затратной схемой которая минимально меняет правила применения операндов и видимо не особо повлияет на производительность для операций с примитивами (добавится простая проверка пустоты контекста).
0
Не понял, что за зверь «контекст операции». Допустим, на вход операции поступило два операнда. Базовая функция операции проверяет наличие нужного метода у первого операнда, если нет — у второго, если нет у обоих — приводит оба к примитивам и ищет правила уже для примитивов.
0
Сейчас контекста операции нет и работает это не так, просто независимо друг от друга операнды без знания операции приводятся к примитивам, а затем происходит операция. Если проверять как говорите вы — прийдется сильно менять существующую схему работы. Как оно будет реализовано в итоге и будет ли пока загадка, я просто предположил как это может быть сделано дешево, с минимальными изменениями и добавлением дополнительного контекста.
+3
А почему вы times назвали for? Ну типа я не рубист, но 10..times(countdown) более человекочитаемо чем 10..for(countdown).
0
Ну, тематика псто — замена стандартных управляющих конструкций своими велосипедами. Конструкции times в js нет, потому назвал for. Абсолютно согласен, что ваш вариант читаемее.
+2
Только не бросай не надо смотреть в сторону Forth.
Там тоже плохому научат…

Жду с нетерпением
0

Сейчас чего только нет поверх JS, уверен, что и Forth найдётся...

0
Совершенно неправильный «Форт». Вместо определения словаря для слов, там большущая цепочка вида else if (token == "drop")
+4
Да, улыбнуло классно! Главное, чтоб действительно никто такое не стал всерьез использовать :) А то ведь даже enum BOOLEAN {TRUE, FALSE, FILE_NOT_FOUND} способен найти своих поклонников…
UFO landed and left these words here
0
Однако там есть ещё более забавная вещь: автоматическое приведение типов. Каждый раз, когда мы пытаемся использовать простое значение как объект (скажем, получить доступ к его свойству), оно «оборачивается» в соответствующую объектную обёртку.
Это не приведение типов, это боксинг/анбоксинг, приведение типов это когда мы хотим объек со строкой или строку с числом сложить.

(2 * 2 == 5).ifThenElse(
    //надеюсь, в 2017 году стрелочные функции уже никого не смущают
    () => alert("Freedom is Slavery"),
    () => alert("O brave new world!")
)
А зачем это так реализовывать если есть достаточно много красивых функциональных библиотек для js? Разница будет только в том, что вы монаду объявите явно
If(2 * 2 === 5).fold(
    () => alert("O brave new world!"),
    () => alert("Freedom is Slavery")
);
0
Это не приведение типов, это боксинг/анбоксинг, приведение типов это когда мы хотим объек со строкой или строку с числом сложить.
У Флэнагана это называлось приведением типов. Судя по результатам беглого гугления, правы скорее вы, чем он. Но, перефразируя Ньютона, «если я соврамши, то только потому, что стоял на плечах гигантов».

А зачем это так реализовывать
Потому что могу)
0
Потому что могу)

Так наверняка можете и что-то более производительное и рабочее сделать тут главное не превращать все в монады, а оборачивать. Если решите поиграться — смотрите на спецификацию FantasyLand.
0
Пока что я придерживаюсь мнения, что экосистеме JS будет лучше без ещё одной либы)
+1
Просто никому ее не показывайте и вред будет минимальным =)
+1
«Ага!!!» — укоризненно сказали суровые сибирские лесорубы и ушли рубить лес топорами…
0
Sirion, а вы не перепутали профессию? Литературный талант заметен невооруженным глазом.
0
Ну, цитируя Олега нашего Дивова, «писатель – это прежде всего крепкая задница, железная сила воли и умение концентрироваться». А я натура увлекающаяся и отвлекающаяся.
Only logged in users are able to leave comments. , please.