(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)
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)