(no subject)
2/4/09 11:10А я тут решил встроить 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.
Подрублю к движку доменную модель на C++ - покажу и расскажу.
Заодно обнаружил, что кроме билда на autotools там есть билд на SCons, и развивается ещё один на cmake. Я знаю, что эти тулзы - уже года три как не новость, но сейчас на cmake переходит всё больше и больше проектов.
Например, KDE собирают на cmake. Вот статья о том, как они пытались в 2006-м сначала перейти на scons, но фич не хватало, и саппорт от коммюнити был дохлый.
Хотя лично мне уровень абстракции scons нравится больше. К тому же, я время от времени корябаю что-то на пайтоне.
Autotools с их тремя версиями и жутким синтаксисом давно пора сдохнуть. Как хорошо, что это, считай, произошло.
CDT 6.0 в Ecipse 3.5 работает. Тоже отлично билдит, и даже умеет extract method/mark occurencies.
Tags:
(no subject)
2/4/09 09:26 (UTC)Но всё равно думаю, что лучше не надо. ОО, написанный на C++ есть Squirrel. Практически, Луа + классы. Может, он подойдёт лучше?
(no subject)
2/4/09 10:08 (UTC)"ОО, написанный на C++ есть Squirrel" - wrong. Кроме изоморфизма собственно языков, есть особенности платформы.
Для Lua есть LuaJIT, он отлажен, он портируется куда угодно, у него отличная производительность, у него юзерская база.
Вот если бы он обещал, скажем, trace compiler - можно было бы подумать :)
(no subject)
2/4/09 11:04 (UTC)LuaJIT не портируется куда угодно. А про Lua можешь мне не рассказывать - сам знаю. :)
Гораздо интереснее LuaJIT MetaLua. ;)
(no subject)
5/4/09 13:45 (UTC)MetaLua - интересно, но какая в этом польза?
(no subject)
5/4/09 14:26 (UTC)Такая же как и от любого другого метапрограммирования. Сразу приходит в голову EDSL и прочее buttom-up programming. В общем, сильно помогает, если пишешь "программы, которые пишут программы, которые пишут программы..." ;)))
(no subject)
5/4/09 14:54 (UTC)Модель предметной области.
Кажется, не наш случай. К счастью. Пусть такие программы пишут на лиспе :)
(no subject)
5/4/09 15:53 (UTC)(no subject)
6/4/09 12:11 (UTC)А то из википедии я ничего не понял! :)))
(no subject)
2/4/09 09:46 (UTC)http://www.ilovelua.narod.ru/
и про то, как на Lua "проэмулировать" ООП
http://www.ilovelua.narod.ru/about_lua.html#OOP
(no subject)
2/4/09 10:02 (UTC)Вот если бы они мультиметоды написали... :-D
Но это я лучше сам опубликую :-D
(no subject)
2/4/09 11:06 (UTC)Правда, никакие реальные реализации мультиметодов (даже в CLOS) я не смотрел.
(no subject)
5/4/09 13:55 (UTC)И непонятно, как вообще делать диспетчеризацию, если есть только duck typing.
(no subject)
5/4/09 14:38 (UTC)Мультиметод - функция, которая зависит от фактических типов (классов) своих параметров.
Возьмём пример с геом. фигурами.
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:01 (UTC)Есть metatable, или там __index, но по ним типы особенно не разрулишь.
В момент объявления метаметода тоже надо как-то идентифицировать тип.
(no subject)
5/4/09 15:50 (UTC)(no subject)
6/4/09 08:09 (UTC)Придумаешь пример кода?
(no subject)
6/4/09 08:57 (UTC)Проще самому всю библиотеку реализовать! :-D
Можно "регистрировать" (неявно?) пользовательские классы в библиотеке, и при этом выдавать им сгенерированный тип.
Наверняка можно ещё как-то. Надо CLOS покурить, чтобы было от чего отталкиваться.
(no subject)
6/4/09 10:05 (UTC)(no subject)
6/4/09 11:41 (UTC)Гляну на LOOP и на CLOS - напишу свой вариант. А ты расскажешь, чем он не нравится. ;)
(no subject)
5/4/09 14:39 (UTC)(no subject)
5/4/09 15:07 (UTC)(no subject)
5/4/09 15:51 (UTC)(no subject)
6/4/09 08:17 (UTC)(no subject)
6/4/09 08:59 (UTC)(no subject)
6/4/09 10:03 (UTC)Тут надо или трусы одеть, или крестик снять.
Я, конечно, могу придумать другой механизм диспетчеризации. Сделать runtime type inference, определять, какие параметры подходят каждой реализации метода... но это решение будет хуже проблемы.
В Lua же нету даже defclass, потому что только таблицы.
(no subject)
6/4/09 11:33 (UTC)Мне кажется, что таким образом решится настолько общая задача, что это решение будет никому не нужно.
Но если очень хочется, то можно реализовать issubclass на том же метапрограммировании, приписывая инстансам классов подходящим образом сгенерированный тип, и проверяя его.
(no subject)
6/4/09 14:43 (UTC)(no subject)
6/4/09 19:25 (UTC)Так зачем тебе issubclass понадобилась?
(no subject)
7/4/09 05:40 (UTC)issubclass - чтобы корректно реализовать твой пример. Сейчас он нарушает принцип подстановки Лисков.
(no subject)
7/4/09 08:25 (UTC)Т.е. ты хочешь на место параметра подставлять класс или его подкласс? Если для подкласса нет специального правила? А кто-то так вообще делает?
Ну, собственно в упомянутом LOOP есть функции class(object), instanceof(object, class), subclassof(object, class) и superclass(class). Так что можно приниматься за дело. ;)
(no subject)
7/4/09 09:02 (UTC)За какое дело? Я пока остановился на Lua. Это зрелая технология.
(no subject)
7/4/09 09:31 (UTC)(это про принцип подстановочности)
И я про Lua. LOOP = Lua Object-Oriented Programming, если что. ;)
Хорошая, кстати, библиотека.
(no subject)
7/4/09 09:45 (UTC)Я ответил: все так делают, принцип Лисков - это базовый принцип ООП.
На LOOP посмотрим.
(no subject)
7/4/09 10:44 (UTC)