Обновить

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

Но как язык для больших приложений

Странно, что ориентируясь на этот критерий, вы проигнорировали вопрос типизации. Ведь, скорее общепринетая точка зрения, что для больших приложений динамическая типизация подходит хуже статической.
В обзор, наверно, стоило добавить Teal и Haxe, например.

вы проигнорировали вопрос типизации

Это не столько проигнорированный критерий, сколько осознанная необходимость, здесь lua "машинный" язык, по отношению к lattelua. Было бы странно добавлять типизацию, при том что итог компиляции все тот же динамический lua.
Иными словами: типизация - это инструмент, а не цель. Примеры: SmallTalk, Erlang, Ruby да в конце концов Python с его огромной кодовой базой.

стоило добавить Teal и Haxe, например

Лично мне понравился Lua++

Typescript тихо смеётся в сторонке )

Typescript тихо смеётся в сторонке )

Это истерика, не смех. И все мы знаем почему)

А смешно знаете что, то что в ветке о производительности статических ЯПов, упоминается средство контроля дисциплины разработчика (typescript)

Ага)

Я хотел обратить внимание на то что вы решили не делать типы, а вон кто то решил сделать)

И тайпскрипт сейчас же факто стандарт

Ага, всё так, только псевдо-статический тайпскрипт противоречит общепринятой точке зрения, что для больших приложений статическая типизация подходит лучше динамической. Тайпскрипт типизировали явно для других целей.

Для каких же ?)

Тут как в песне - если надо объяснять, то не надо объяснят ...

Типизация языка и типизация рантайма – вещи связанные, но не слишком.
Для больших приложенией важнее типизация именно языка. То есть типизация на уровне взаимодействия человек-инструменты в процессе создания, а не типизация в процессе выполнения.

Типизация – действительно, инструмент. Чем больше и сложнее приложение, тем нужнее этот инструмет, чтобы разработка не захлебнулась.
Возможно ли разрабатывать "большие-сложные" без него? Да, используя другие механизмы защиты от чрезмерной сложности. Но эти механизмы сложнее и требоовательнее к разработчикам и с практической точки зрения относятся скорее к исключениям.

TypeScript – это как раз такой практический ответ на запрос "писать большое-сложное под динамическую среду".

И Luau

То есть теперь фигурные скобки обозначают

  • таблицы

  • генераторы таблиц

  • области видимиости функций

  • области стурктурного связывания переменных

успехов не запутаться во всём этом.

Конечно, какой-то странный набор фишек получился.

Если функция не имеет аргументов, ее можно вызвать с помощью оператора !, вместо пустых круглых скобок. ! вызов - предпочтительный способ вызова функций без аргументов.

А это вот вдвойне странно. Я сначала подумал там элвис оператор подменили на буратино, а это оказывается тоже вызов функции. Чем поясняется идиоматичность такого способа?

То есть теперь фигурные скобки обозначают

А что вас смущает, сударь никогда не слышал про Golang, JavaScript, Scala, Julia

А это вот вдвойне странно
Чем поясняется идиоматичность такого способа?

Так исторически сложилось) наследство от MoonScript. Я только могу предположить, что Leafo вдохновлялся ассоциацией ! с "выполнить"

По началу самому это казалось неуклюжим, а по итогу, как не крути, это удобно

Скалу и жюлиа не трогал. Зато плюсы как главный язык. Это тот в котором больше 10 различных способов создать новый объект. Что как вы понимаете ни разу не играет в угоду понятности языка.

Lua исходно задумывался, чтобы быть простым и понятным, но от чего-то эта кофейная луна почему-то решила уйти от этого. Ванильная Lua уже поддерживал multiple returns аналогично go. Зачем в lattelua добавлять для этого оборачивание в фигурные скобки - непонятно. Оно и с точки зрения парсера сложнее - приходится обрабатывать специальный случай таблицы, насколько я понимаю - и с точки зрения пользователя. Оно хотя бы поддерживает многоуровневую распаковку как в JS?

const user = { 
    id: 1, 
    profile: { displayName: "Alice", avatar: "alice.jpg" } 
};
const { profile: { displayName } } = user; 
// profile - не биндится и работает исключительно как accessor
// displayName - биндится при совпадении с именем поля объекта

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

В принципе все понятно:- статью не читал, но осуждаю. Если действительно интересно - потрудитесь, уделите 20 минут своего драгоценного времени на прочтение и все вопросы отпадут, как то так...

Не читал дальше референса, ибо там подробностей не то что бы много про имплементацию языка. Учитывая, что это третий этап шугаризации Lua детали конкретного диалекта может отличаться заметно. Особенно, если считать, что это всё же оригинальные имплементации, а не прямые деривативы PUC Rio Lua или Lua JIT.

Наличие классов в языке не отвечает на вопрос про таблицы. JS как и Lua используют систему прототипов для создания базового полиморфизма и наследования. В новых редакциях JS завезли уже полноценные классы, наследования, расширения и прочее, хотя под капотом они превращаются во всё те же метаобъекты с прототипами. В Lua классов не завезли даже в новых редакциях, то есть они появились в диалектах и способов реализации оных есть не единичное количество. Поэтому вопрос метатаблиц/прототипов для меня вопрос открытый. Встраивание документов тоже может быть как байдингом так и полной lua имплементацией интерпретатора языка. Поэтому мне показалось хорошей идеей спросить эти детали у того кто этим пользуется.

Из недовольств только перегрузка поведений похожих синтаксических конструкций. К самой статье претензий нет.

Вы, судя по всему, воспринимает Lattelua как изолированный новый язык или новый интерпретатор, в то время как это — синтаксический сахар (transpiler).

это третий этап шугаризации

Детали имплементации в статье, чисто семантически это и есть Lua, просто с другим «лицом».

Поэтому вопрос метатаблиц/прототипов для меня вопрос открытый.

Вопрос про метатаблицы/прототипы здесь закрывается однозначно: классы в LatteLua — это синтаксический сахар над классическим Lua-паттерном метатаблиц. Никакой скрытой «JS-подобной» реализации на уровне C-движка нет. Это прозрачная обертка, которая избавляет от написания:

setmetatable(self, { __index = ... })

Если вы умеете работать с метатаблицами в Lua, вы уже знаете, как работают классы в LatteLua.

как байдингом так и полной lua имплементацией интерпретатора языка

LatteLua не пытается переписать интерпретатор. Все внешние интеграции (как пример с cqueues или lanes) — это обычные Lua-модули.
Синтаксис просто делает работу с ними визуально чище (например, через операторы :: для вызова методов или короткие лямбды ->). Это не «биндинг» в смысле C-API, это просто удобный способ вызывать стандартные функции.

LatteLua — это не «черный ящик» с собственной реализацией ООП. Это инструмент, который берет ваши знания о метатаблицах Lua и позволяет записывать их в стиле современных языков (Swift/Kotlin/JS), не теряя при этом прямого доступа к «кишкам» Lua. Если вдруг нужно посмотреть, во что превращается ваш класс — достаточно запустить транспайлер и увидеть обычный Lua-скрипт.

И вот это всё есть в статье)

В новых редакциях JS завезли уже полноценные классы, наследования, расширения и прочее, хотя под капотом они превращаются во всё те же метаобъекты с прототипами.

Слово «полноценные» подразумевает изменение фундаментальной модели.

  • В классических ООП-языках (Java, C++) класс — это «чертеж». Сначала есть класс, потом по его образу создается объект. Память выделяется ровно под структуру класса.

  • В JS (и в Lua) «класс» не является чертежом. Это живой объект-прототип, который делегирует свои свойства другим объектам.

Утверждать, что в JS появились «полноценные классы», но они остались «прототипами» — это оксюморон в чистом виде, всё равно что сказать:
«Мы построили полноценный современный электрокар, хотя под капотом у него всё та же лошадь, просто её не видно за обшивкой».

под полноценными классами я подразумевал
1. введение ключевого слова class
2. добавление синтаксиса для наследования или расширения
3. наличие публичных и приватных членов/методов

В JS всё это завезли в том числе и в стандарт, но дефолтные имплементации в том же V8 имеют MIR, который генерируется крайне одинаковым, что и для прототипов, просто синтаксис становится более Java-подобным. Именно этот момент я и назвал "остались прототипами".

Вы заблуждаетесь, ключевое слово class и обвязка - это синтаксический сахар над прототипным наследованием, в этом смысле ни чего никуда не завезли.

LatteLua делает для Lua ровно то же самое, что стандарт ES6 сделал для JavaScript: он не ломает мощную прототипную модель (метатаблицы), а дает ей современный, "полноценный" синтаксис, но это сахар а не концепт языка.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации