Дима
Просто method без with никак
Oleg
Генерить если то можно и без стрикта
Oleg
Хотя это конечно очень костыль
Sergey
можно конечно ко всем вызовам добавлять что-то вроде $LOCAL.
Дима
Sergey
но если не читать, то минификация и ок
Дима
const goal = () => console.log('And we have a winner') const methodMissing = property => () => console.log('you called ' + property + ' but it doesn\'t exist!') const getter = (object, prop) => Reflect.has(object, prop) ? Reflect.get(object, prop) : methodMissing(prop) const proxyParams = { get: getter } class Some { constructor() { return new Proxy(this, proxyParams) } anyMethod() { goal() } } const value = new Some value.anyMethod2() value.anyMethod()
Дима
> you called anyMethod2 but it doesn't exist! > And we have a winner
Oleg
Впрочем про генерить - можно и просто проверять наличие, если нет ничего - вызывать метод дефолтовый, и никаких трайкатчев
Oleg
Кейс?
Oleg
Где нельзя
Дима
Гляньте сначала пример)
Дима
Зря что ли писал 😒
Oleg
Уже читаю
Sergey
Кейс?
динамическое наследование
Sergey
я тоже читаю
Oleg
Годнота
Sergey
мне кажется или если выпилить proxy тоже будет работать кроме methodMissing
Sergey
https://repl.it/EjIZ/1
Дима
так там кроме methodMissing и нет ничего)
Oleg
Эм
Sergey
https://repl.it/EjIZ/2
Oleg
Ну так будет просто вызов же
Oleg
Не?
Oleg
Если выпилить
Дима
Это иллюстрация форварда на метод при отсутствии метода
Sergey
это да работает
Sergey
прям гуд)
Sergey
https://repl.it/EjIZ/3
Sergey
но вот так ((
Дима
А тут я объясню ход мысли
Дима
В прокси где getter мы вызываем методы обернутые в with
Дима
В with такой же враппер-любого-метода, но не выводящий сообщение в консоль, а резолвящий на свой метод
Дима
Но with в js — всё ¯\_(ツ)_/¯
Дима
А так бы работало
Sergey
видимо придется что-то вроде $LC.callMethod(‘demo’, [‘arg1’, ‘arg2’])
Дима
Если при транспиляции просто бахнуть ко всем методам внутри классов this, то проблема будет исчерпана
Sergey
ну теоретически можно
Sergey
правда это всё же не всегда this
Sergey
придется во все классы пихать Proxy
Sergey
это достаточно медленно
Sergey
можно транспайлить swift в js
Sergey
почти 1 к 1
Sergey
и java тоже
Дима
придется во все классы пихать Proxy
Достаточно написать один раз wrapper
Дима
Дима
правда это всё же не всегда this
ну я как самый примитивный способ рассматриваю, просто отталкиваться от этого
Дима
это достаточно медленно
Если класс без таких выкрутасов, то проски можно не пихать или наоборот отозвать
Дима
Proxy бывают revocable
Sergey
Proxy бывают revocable
отключить проксю?
Дима
Да
Oleg
Ленивое создание ещё можно добавить и сборку мусора
Sergey
ну вот и получится небольшой рантайм
Sergey
не совсем транспайлинг
Дима
ну а как ещё
Дима
Даже в бабеле в сложных случаях рантайм есть
Sergey
ну да, в случае regenerator
Дима
А это js->js
Sergey
да, надо попробовать с прокси
Sergey
я кстати собираю babel ast и затем просто запускаю бабель на этом всём
Sergey
так что можно будет настроить транспиляцию хоть в es5
Дима
Ну да
Дима
Я свой синтаксис когда писал, я немного от обратного пошёл, у меня всё транспилируется в минимально необходимую структуру и она уже работает как нужный объект
Дима
Свой AST накостылял короч 😄
Sergey
ну а по другому никак
Sergey
я когда делал первый раз парсил язык в своё ast а затем преобразовывал его в babel
Sergey
Sergey
но то что генерит opal это грустно
Дима
Ето обман, чтобы набрать $klassы
Дима
🌚
Дима
Я когда первый язык делал бабеля не было
Дима
Вообще на delphi с этим была проблема))
Дима
😄
Sergey
delphi?
Sergey
он тут причем?
Дима
Ну я на delphi 7 написал интерпретатор delphi 7 😄
Sergey
О_О
Sergey
долго писал?
Дима
С восмой версии в делфях дженерики были, как щас помню как обидно было