singalen: (Default)
[personal profile] singalen
А я тут решил встроить Lua в Wesnoth. Встраивается он интересно: API нехарактерное. Вместо объектной модели вызовов, из C надо доступаться к некоему стеку, в который надо заталкивать и извлекать параметры.
Подрублю к движку доменную модель на C++ - покажу и расскажу.

Заодно обнаружил, что кроме билда на autotools там есть билд на SCons, и развивается ещё один на cmake. Я знаю, что эти тулзы - уже года три как не новость, но сейчас на cmake переходит всё больше и больше проектов.
Например, KDE собирают на cmake. Вот статья о том, как они пытались в 2006-м сначала перейти на scons, но фич не хватало, и саппорт от коммюнити был дохлый.
Хотя лично мне уровень абстракции scons нравится больше. К тому же, я время от времени корябаю что-то на пайтоне.

Autotools с их тремя версиями и жутким синтаксисом давно пора сдохнуть. Как хорошо, что это, считай, произошло.

CDT 6.0 в Ecipse 3.5 работает. Тоже отлично билдит, и даже умеет extract method/mark occurencies.

(no subject)

2/4/09 09:26 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
Что-то недопонял что ты хочешь сделать с Луой?
Но всё равно думаю, что лучше не надо. ОО, написанный на C++ есть Squirrel. Практически, Луа + классы. Может, он подойдёт лучше?

(no subject)

2/4/09 11:04 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
Про встраивание в Веснот понятно. Непонятно "Подрублю к движку доменную модель на C++ - покажу и расскажу."

LuaJIT не портируется куда угодно. А про Lua можешь мне не рассказывать - сам знаю. :)
Гораздо интереснее LuaJIT MetaLua. ;)

(no subject)

5/4/09 14:26 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
Не знаю, что такое "domain model в смысле ddd". :(

Такая же как и от любого другого метапрограммирования. Сразу приходит в голову EDSL и прочее buttom-up programming. В общем, сильно помогает, если пишешь "программы, которые пишут программы, которые пишут программы..." ;)))

(no subject)

5/4/09 15:53 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
То-то и оно, что самая известная реализация мультиметодов написана на ЛИСПе. ;)

(no subject)

6/4/09 12:11 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
Кстати, когда подрубишь к движку - _обязательно_ расскажи. С особым упором на доменную модель.
А то из википедии я ничего не понял! :)))

(no subject)

2/4/09 09:46 (UTC)
Posted by [identity profile] mortang.livejournal.com
неплохая подборка инфы про Lua
http://www.ilovelua.narod.ru/
и про то, как на Lua "проэмулировать" ООП
http://www.ilovelua.narod.ru/about_lua.html#OOP

(no subject)

2/4/09 11:06 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
В принципе, мультиметоды могут очень неплохо реализовываться на таблицах Lua...
Правда, никакие реальные реализации мультиметодов (даже в CLOS) я не смотрел.

(no subject)

5/4/09 14:38 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
Как-как? Руками.

Мультиметод - функция, которая зависит от фактических типов (классов) своих параметров.
Возьмём пример с геом. фигурами.

function intersect(shape1, shape2)
   if shape1.type == "square" and shape2.type == "square" then
      intersect_squares(shape1, shape2)
   elseif ...
end


Но лучше сделать в таком духе:

local Intersects = {}
Intersects["square"]["square"] = intersect_squares
Intersects["square"]["circle"] = intersect_square_circle
Intersects["circle"]["circle"] = intersect_circles
Intersects["circle"]["square"] = function (c, s) intersect_square_circle(s, c) end
...
function intersect(shape1, shape2)
   local fun = Intersects[shape1.type][shape2.type]
   if fun then return fun(shape1, shape2)
   else error "Unknown shapes" end
end


И вот тут MetaLua может сильно помочь. ;)))

(no subject)

5/4/09 15:50 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
Как я понимаю, никакого "канонического" ООП в Lua тоже нет. Так что правила мы можем задавать сами. Хотите мультиметоды? Следуйте нашим правилам (используйте нашу библиотеку). Ну а метапрограммирование позволяет всю эту кухню от пользователя скрыть.

(no subject)

6/4/09 08:57 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
Если я придумаю пример кода, то что останется для тебя? :)))
Проще самому всю библиотеку реализовать! :-D

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

(no subject)

6/4/09 11:41 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
Ладно, тогда я подумаю на эту тему поконкретнее. :)
Гляну на LOOP и на CLOS - напишу свой вариант. А ты расскажешь, чем он не нравится. ;)

(no subject)

5/4/09 14:39 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
BTW, разве в CLOS не duck typing?

(no subject)

5/4/09 15:51 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
В Python объявления class Foo: тоже есть. Duck typing это не мешает.

(no subject)

6/4/09 08:59 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
Я про issubclass в Питоне ничего не знаю. Но мне казалось, что термин duck typing придумал Гвидо. Можно, конечно, в википедии посмотреть. Но мне это не кажется принципиальным.

(no subject)

6/4/09 11:33 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
Ты хочешь реализовать мультиметоды через множественную передачу? Или зачем тебе issubclass понадобился?
Мне кажется, что таким образом решится настолько общая задача, что это решение будет никому не нужно.

Но если очень хочется, то можно реализовать issubclass на том же метапрограммировании, приписывая инстансам классов подходящим образом сгенерированный тип, и проверяя его.

(no subject)

6/4/09 19:25 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
Про множественную передачу - это я вспомнил зубодробительную схему из книги Джефа Элджера про C++.

Так зачем тебе issubclass понадобилась?

(no subject)

7/4/09 08:25 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
У Элджера рассматривается и "удвоенная двойная диспетчеризация", и множественная - я чуть мозг не вывихнул. :)))

Т.е. ты хочешь на место параметра подставлять класс или его подкласс? Если для подкласса нет специального правила? А кто-то так вообще делает?

Ну, собственно в упомянутом LOOP есть функции class(object), instanceof(object, class), subclassof(object, class) и superclass(class). Так что можно приниматься за дело. ;)

(no subject)

7/4/09 09:31 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
А я что сказал? :)
(это про принцип подстановочности)

И я про Lua. LOOP = Lua Object-Oriented Programming, если что. ;)
Хорошая, кстати, библиотека.

(no subject)

7/4/09 10:44 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
Ну, если базовый, то простой табличной диспетчеризации не получится - придётся громоздить вложенные if'ы. Впрочем, можно попробовать совместить и то, и другое.