Как стать автором
Обновить

Комментарии 39

НЛО прилетело и опубликовало эту надпись здесь
Если в коде, производительность которого хоть кому-то интересна, происходит такое, оверхед — меньшая из проблем.

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

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

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


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

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

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

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

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

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

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

(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")
);
Это не приведение типов, это боксинг/анбоксинг, приведение типов это когда мы хотим объек со строкой или строку с числом сложить.
У Флэнагана это называлось приведением типов. Судя по результатам беглого гугления, правы скорее вы, чем он. Но, перефразируя Ньютона, «если я соврамши, то только потому, что стоял на плечах гигантов».

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

Так наверняка можете и что-то более производительное и рабочее сделать тут главное не превращать все в монады, а оборачивать. Если решите поиграться — смотрите на спецификацию FantasyLand.
Пока что я придерживаюсь мнения, что экосистеме JS будет лучше без ещё одной либы)
Просто никому ее не показывайте и вред будет минимальным =)
«Ага!!!» — укоризненно сказали суровые сибирские лесорубы и ушли рубить лес топорами…
Sirion, а вы не перепутали профессию? Литературный талант заметен невооруженным глазом.
Ну, цитируя Олега нашего Дивова, «писатель – это прежде всего крепкая задница, железная сила воли и умение концентрироваться». А я натура увлекающаяся и отвлекающаяся.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории