LINUX.ORG.RU

А почему в lua...

 , ,


0

1

Disclaimer: мой «опыт» с lua составляет примерно два вечера, основной язык в данный момент Perl.

Как известно, вызов метода в lua выглядит вот так:

  object:method(137); -- означает object["method"](object, 137);

Т.е. «класс» и «экземпляр» в простейшем случае совпадают. В то же время, есть перегрузка операторов вида

  setmetatable(object, meta); 
  object + 137; -- означает meta["__add"](object, 137)

Виденные мной тьюториалы по ООП в lua, в частности, предлагают перегружать __index (т.е. оператор []), чтобы получить разделение «экземпляра» и «класса». Но это же хак (не говоря уже о том, что в таблице-экземпляре можно перезаписать method и тогда __index не вызовется).

Пример: http://lua-users.org/wiki/SimpleLuaClasses

Почему бы не соединить лучшее из двух миров? Например:

  setclass(object, meta); -- никто не говорил слова "bless"
  object:method(137); -- означает meta["method"](object, 137);

Или еще проще (проще ли?) - добавить метаметод __method, который будет действовать аналогично __index, но для для object:method(...)

Наверняка такой вопрос уже задавался - хотелось бы увидеть внятное объяснение, почему чего-то подобного ещё не сделали (в т.ч., если «ненужно», то почему)?

Перемещено true_admin из talks

★★★★

да не трогай ты эту каку, если спрашиваешь 'почему?'.
её лучшие времена прошли, имх. :)

Bad_ptr ★★★★★
()
object:method(137); -- означает meta["method"](object, 137);

Кажется, оно почти так и работает. object:method(137) == object[«method»](object, 137)

krakatau
()
Ответ на: комментарий от Bad_ptr

А почему не lua? Простой как три копейки язык с first-class functions - прекрасное начало дня! Ну а недостатки у всех есть (см. Disclaimer - я видел демонов на перле, написанных без стрикта).

lodin ★★★★
() автор топика
Ответ на: комментарий от krakatau

Ну да. Именно из-за этого «почти» у меня и возник вопрос.

lodin ★★★★
() автор топика

object:method(137) - это просто сахар для object.method(object, 137) И Lua не знает ни о каких методах.

anonymous
()

Во-первых, таблицы и перегрузка __index более похожи на прототипную парадигму, чем на объектно-ориентированную с классами. Поэтому прототипное наследование реализуется прямым и очевидным способом, а если нужны классы и экземпляры, то да, надо посидеть подумать. А они тебе правда нужны?

Во-вторых:

Или еще проще (проще ли?) - добавить метаметод __method, который будет действовать аналогично __index, но для для object:method

Тогда ведь получится, что object:method() не эквивалентен object.method(object). Это уже значительное усложнение языка.

Лучше отвлекись от классов, экземпляров и методов и подумай в терминах таблиц, функций и (если нужно) возможностей метатаблиц, что тебе нужно сделать. Может быть, и классы не нужны будут.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 2)
Ответ на: комментарий от lodin

Простой как три копейки язык с first-class functions

scheme?

lazyklimm ★★★★★
()

Не знаю, какими примочками над Lua пользовались в Codea, но там есть функция Class(baseclass), которую можно использовать как-то так:

c = Class()
function c:init(params)
    -- здесь инициилизация в стиле жабаскриптового конструктора
    this.params = params
end

function c:foo(bar)
    -- bar bar bar
end

obj = c(p)
obj:foo(b)
PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

Скорее всего, то же самое колдунство с __index. Пример по ссылке в исходном посте ведет себя аналогично.

lodin ★★★★
() автор топика
Ответ на: комментарий от lodin

Скорее всего, то же самое колдунство с __index. Пример по ссылке в исходном посте ведет себя аналогично.

Не совсем. Там класс Account, а объект создается вызовом Account.create. Тут, наверное, еще какое-то колдунство с __call и, возможно, там userdata, а не таблицы.

Кстати, насчет «можно ведь перезаписать method». Я думаю, поколдовав с __newindex, можно от этого защититься.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

А есть лучше? Angelscript не предлагать, он уж больно заточен под встраивание в C++

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Bad_ptr

Точнее даже так - нужен лёгкий(мегабайт под рантайм - уже многовато) скриптовый/компилируемый язык высокого уровня для либо встраивания в С либо для standalone выполнения. ООП приветствуется, но не обязательно. Потомков лиспа не предлагать.

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 1)
Ответ на: комментарий от Dark_SavanT

Потомков лиспа не предлагать.

хе-хе. Тогда Форт какой-нибудь. :)
Не, тебе может и нужно луа. А вот вопрос зачем оно ТСу.

Bad_ptr ★★★★★
()

lua няшный и логичный язык. И в нём и так достаточно сахара, не надо туда ещё тащить.

anonymous
()
Ответ на: комментарий от Dark_SavanT

нужен лёгкий(мегабайт под рантайм - уже многовато) скриптовый/компилируемый язык высокого уровня для либо встраивания в С либо для standalone выполнения

Дык практически все они того..маленькие :) В ваши требования не влезают только языки с большой собственной машиной и сумасшедшим рантаймом, а именно java, smalltalk, php и наверное cobol..

p.s. мне вот симпатичны tcl (точнее jim http://jim.tcl.tk/index.html/doc/www/www/index.html), C/C++ (интерпретатор CINT http://root.cern.ch/drupal/content/cint)...а lua как-то вдоль, разве что любопытствовал как оно внутре устроенно :)

Потомков лиспа не предлагать.

возможно разумно встраивать как раз «потомков lisp`а». Из соображений - что трудоёмко/некрасиво реализуется в С/С++ догонять функциональным «клеем».

MKuznetsov ★★★★★
()
Ответ на: комментарий от lodin

А почему не lua?

А почему Lua? «Потому что можно»? Реально, какаие приемущества по сравнению с тем же js? Мне правда интересно, сейчас как раз подбираю инструмент для одной задачи. Прочитав описание языка, ничего интересного не заметил. Буду рад, если кто-то укажет, что я проглядел.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо, конечно, но не помогло.

anonymous
()
Ответ на: комментарий от Bad_ptr

Началось с того, что мне неожиданно предложили вакансию с луа («требуется программист на lua со знанием perl, знание lua необязательно»). Стало интересно, что за язык такой. Дул легкий ветерок, и меня унесло в открытое море, и вот я здесь, перед вами...

Никаких проектов на нем у меня нет и некоторое время ещё не будет (тупо времени/сил нет).

lodin ★★★★
() автор топика
Ответ на: комментарий от MKuznetsov

Из соображений - что трудоёмко/некрасиво реализуется в С/С++ догонять функциональным «клеем».

ИМХО «клей» должен иметь ещё и минимальный порог вхождения, потому что, возможно, на нём придется реализовывать бизнес-требования «клеента» и лучше спихнуть это на «клеента». В защиту этой точки зрения говорят связки браузеры/js и игры/lua. Требовать от пользователей/настройщиков своей продукции знания lisp как-то негуманно.

(Кстати, было бы смешно, если бы в rpg доступные языки для скриптования зависели от расы: эльфам scheme, гномам ruby и т.д.)

lodin ★★★★
() автор топика
Ответ на: комментарий от anonymous

- Реально, какаие приемущества по сравнению с тем же js?
- Сверхминималистичность реализации, не?
- FORT, не?

Идиот детектед.

Yazaban
()

object:method(137); — означает meta[«method»](object, 137);

Если нужно, можно и такое сделать, безо всяких изменений в языке

annulen ★★★★★
()

А вообще, если хочешь «реального ООП с классами», то либо не используй Lua, либо используй продвинутый ООП-фреймворк, вроде LOOP

annulen ★★★★★
()
Ответ на: комментарий от annulen

Ага, спасибо, посмотрим, что за loop.

Просто если такие фреймворки сочиняют, значит, это кому-то нужно, а если это кому-то нужно, то почему бы и не добавить немного сахара в язык (тем более, что б-м аналогичный сахар УЖЕ есть). Это, чай, не Moose внутрь интерпретатора perl затащить.

lodin ★★★★
() автор топика

В общем, спасибо всем комментаторам. Появится время - продолжу свои упражнения :)

lodin ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.