Entry tags:
(no subject)
А я тут решил встроить 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.
no subject
Но всё равно думаю, что лучше не надо. ОО, написанный на C++ есть Squirrel. Практически, Луа + классы. Может, он подойдёт лучше?
no subject
"ОО, написанный на C++ есть Squirrel" - wrong. Кроме изоморфизма собственно языков, есть особенности платформы.
Для Lua есть LuaJIT, он отлажен, он портируется куда угодно, у него отличная производительность, у него юзерская база.
Вот если бы он обещал, скажем, trace compiler - можно было бы подумать :)
no subject
LuaJIT не портируется куда угодно. А про Lua можешь мне не рассказывать - сам знаю. :)
Гораздо интереснее LuaJIT MetaLua. ;)
no subject
MetaLua - интересно, но какая в этом польза?
no subject
Такая же как и от любого другого метапрограммирования. Сразу приходит в голову EDSL и прочее buttom-up programming. В общем, сильно помогает, если пишешь "программы, которые пишут программы, которые пишут программы..." ;)))
no subject
Модель предметной области.
Кажется, не наш случай. К счастью. Пусть такие программы пишут на лиспе :)
no subject
no subject
А то из википедии я ничего не понял! :)))
no subject
http://www.ilovelua.narod.ru/
и про то, как на Lua "проэмулировать" ООП
http://www.ilovelua.narod.ru/about_lua.html#OOP
no subject
Вот если бы они мультиметоды написали... :-D
Но это я лучше сам опубликую :-D
no subject
Правда, никакие реальные реализации мультиметодов (даже в CLOS) я не смотрел.
no subject
И непонятно, как вообще делать диспетчеризацию, если есть только duck typing.
no subject
Мультиметод - функция, которая зависит от фактических типов (классов) своих параметров.
Возьмём пример с геом. фигурами.
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
Есть metatable, или там __index, но по ним типы особенно не разрулишь.
В момент объявления метаметода тоже надо как-то идентифицировать тип.
no subject
no subject
Придумаешь пример кода?
no subject
Проще самому всю библиотеку реализовать! :-D
Можно "регистрировать" (неявно?) пользовательские классы в библиотеке, и при этом выдавать им сгенерированный тип.
Наверняка можно ещё как-то. Надо CLOS покурить, чтобы было от чего отталкиваться.
no subject
no subject
Гляну на LOOP и на CLOS - напишу свой вариант. А ты расскажешь, чем он не нравится. ;)
no subject
no subject
no subject
no subject
no subject
no subject
Тут надо или трусы одеть, или крестик снять.
Я, конечно, могу придумать другой механизм диспетчеризации. Сделать runtime type inference, определять, какие параметры подходят каждой реализации метода... но это решение будет хуже проблемы.
В Lua же нету даже defclass, потому что только таблицы.
no subject
Мне кажется, что таким образом решится настолько общая задача, что это решение будет никому не нужно.
Но если очень хочется, то можно реализовать issubclass на том же метапрограммировании, приписывая инстансам классов подходящим образом сгенерированный тип, и проверяя его.
no subject
no subject
Так зачем тебе issubclass понадобилась?
no subject
issubclass - чтобы корректно реализовать твой пример. Сейчас он нарушает принцип подстановки Лисков.
no subject
Т.е. ты хочешь на место параметра подставлять класс или его подкласс? Если для подкласса нет специального правила? А кто-то так вообще делает?
Ну, собственно в упомянутом LOOP есть функции class(object), instanceof(object, class), subclassof(object, class) и superclass(class). Так что можно приниматься за дело. ;)
no subject
За какое дело? Я пока остановился на Lua. Это зрелая технология.
no subject
(это про принцип подстановочности)
И я про Lua. LOOP = Lua Object-Oriented Programming, если что. ;)
Хорошая, кстати, библиотека.
no subject
Я ответил: все так делают, принцип Лисков - это базовый принцип ООП.
На LOOP посмотрим.
no subject