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)

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 - напишу свой вариант. А ты расскажешь, чем он не нравится. ;)