Чудесный Lua

Язык программирования Lua (переводится с португальского как «луна»), в целом, мне нравится — очень гибкий, красивый, целостный. Программировать на нём приятно, а модель, заложенная в основу, настолько гибкая, что позволяет создавать ООП-конструкции без нативной поддержки их языком.

Одна из мощных функций языка — метатаблицы, позволяющая переопределить операции для любого типа данных, включая любые составные. Вот например:

mt = {}

function mt.__add (a,b) 
    return { x = a.x + b.x, y = a.y + b.y }
end

Задаётся метатаблица (mt) у которой ключ __add (функция, отвечающая за сложение) определена как функция сложения вектора с двумя координатами. Например, в следующем примере (все примеры взяты из статьи «Язык Lua и использование скриптов на нём в программах на C++») я устанавливаю заданную метатаблицу «mt» для переменной «u», причём сложение «u» и «v» работает правильно — поскольку Lua ищет обработчик сложения сначала у второго оператора, в случае неудачи — у следующего.

u = { x = 1, y = 2 }
v = { x = 0, y = 1 }

setmetatable ( u, mt )   -- установить для таблицы u метатаблицу

w = u + v                -- осуществить сложение таблиц
print ( w.x, w.y )

Самое интересное — дальше. Тут мой мозг не ломается, но без руководства я бы не догадался. Дело в том, что метатаблица «mt», точнее её операция «__add» определена некорректно. Сложение пройдёт великолепно, но у переменной «w» новой операции сложения не будет — метатаблица «mt» для этой переменной не установлена. Правильный способ определения вот такой:

function mt.__add (a,b) 
    return setmetatable ( { x = a.x + b.x, y = a.y + b.y }, mt )
end

Т. е. таблица устанавливается ещё и для получившегося выражения. (Для тех, кто уже ничего не понимает, но знает PHP. Запись «{ x = a.x + b.x, y = a.y + b.y }» на PHP выглядела бы как «array(’x’=>$a[’x’]+$b[’x’], ’y’=>$a[’y’]+$b[’y’])»).

Поделиться
Отправить
9 комментариев
razetdinov.moikrug.ru

Интересно. Скоро как раз придётся изучать этот язык.

Евгений Степанищев (bolknote.ru)

Комментарий для razetdinov.moikrug.ru:

Мне он очень нравится, очень хороший язык. А с какой целью придётся?

preprocessor (prepor.ru)

как раз строчка здесь return { x = a.x + b.x, y = a.y + b.y } самая понятная :)

а вообще из этого примера мне не очень понятны преимущества динамики Руби, например.

class Hash

  def +(vector)
    x,y=vector[’x’]+self[’x’],vector[’y’]+self[’y’]
    {’x’=>x,’y’=>y}
  end
  
end

a={’x’=>2,’y’=>3}
b={’x’=>3,’y’=>5}

u=a+b

Имхо, код более читабельный и не вводится новое понятие (метатаблицы). Хотя конечно лучше делать class Vector < Hash.

Или я в корне не прав или метатаблицы это куда круче?

preprocessor (prepor.ru)

«мне не очень понятны преимущества ПЕРЕД динамикОЙ Руби, например.»

и я понял кажется в чем преимущество :) в том что можно объекту любого класса добавлять некую функциональность без переопределения класса. ну может быть, может быть... правда на практике... зачем? (это именно вопрос, а не риторика :) )

скажем в этом же примере эта функциональность присуща только объектам типа «Вектор»

Евгений Степанищев (bolknote.ru)

Комментарий для prepor.ru:

Ну, вы почитайте ознакомительную статью по языку: http://steps3d.narod.ru/tutorials/lua-tutorial.html

Там немного, но многое поймёте :) «Без переопределения класса» — неприменимая строчка к языку, где классов, как таковых, и нет :)

razetdinov.moikrug.ru

Комментарий для Евгения Степанищева:

Для сборки xml.

Евгений Степанищев (bolknote.ru)

Комментарий для razetdinov.moikrug.ru:

А куда будет вставляться язык и чем не понравился основной язык? Почему Lua?

Alisey (alisey.myopenid.com)

В другой луне, под названием Io, тоже можно пихать в прототип что угодно.

Vector := Object clone do(
    + := method(other,
        result := Vector clone
        result x := self x + other x
        result y := self y + other y
        result))

x := Object clone do(x := 7; y := 9)
y := Object clone do(x := 1; y := 2)

(x appendProto(Vector) + y) print

Но! Это всё фигня по сравнению с тем, что там программно доступно синтаксическое дерево. Хаха. OMG.
http://hackety.org/2008/01/05/ioHasAVeryCleanMirror.html

razetdinov.moikrug.ru

Комментарий для Евгения Степанищева:

http://rit2007.ru/paper_view.html?id=1817

Популярное