Mike Potanin (potan) wrote in ru_declarative,
Mike Potanin
potan
ru_declarative

Category:
  • Music:

Джейсоновское (решеточное) наследование.

Интересное обобщение множественного наследования изобрел несколько лет назад изобрел jsn для целей, далеких от языков программирования (более точно - для управления вебсайтами). На сколько мне извесно, эта идея так и не была реализована. Суть идеи следующая:
Каждый класс распологается в узле многомерной решетки. В простейшем случае близость узлов не важна (хотя не сложно обобщить и на этот случай), роль играют только проекции на координатные гиперплоскости. Каждый класс считается потомком всех своих проекций.
Это изложение "геометрическое", но можно описать и алгеброически. Класс идентифицируется набором пар (аттрибут значние). Класс A является наследником класса B если любой определенный атрибут B определен и у A и меет то же значение (можно ввести порядок на значениях и требовать не совпадения, а меньшего значения у предка - это позволит в частности управлять версией класса).

Множественное наследование интересно применять в Mix-стиле. Пусть у класса A есть абстрактный метод b, которым пользуются некоторые его методы. Пусть метод b реализован в классе B (не являющегося потомком A). Теперь наследуем класс C от A и B, считая что конкретный метов B::b заменит абстрактный A::b. (К сожалению наиболее попсовый популярный язык C++ так не поступит - потребует явно описать переходник C::b, который вызовит B::b. Почему так сделано не понятно - в gcc достатосно было бы поместить соответствующую запись в vtbl, а vc мог бы сгенерить переходник сам.)
Джейсоновское наследование дает хорошую формализацию этому стилю программирования.

Например пусть у нас есть классы [(протокол http)], [(протокол echo)], [(модель prefork)], [(модель thread)], [(модель kevent)], [(модель inetd)], [(конфигурация text)], [(конфигурация xml)]. Теперь мы можем создать приложение, делающее prefork и реализующее протокол echo просто объявив класс [(протокол echo) (модель prefork)]. А для http сервера, использующего select (или более эффективный kevent, там где он есть), хранящий конфиги в xml - надо в классе [(модель kevern) (протокол http) (конфигурация xml)] реализовать метод, ответсвенный за контент (или даже добавить атрибут (content user) и реализовать метод там).

Я сделал простенькую реализацию такого наследования на Lisp. Реализация не слишком эффективная, но динамичная (smilga должно понравиться :-))), но при большом желании многое можно делать на этапе компиляции (хороший алгоритм еще не придуман).
В качестве примера там используется не нетривиальный в реализации описанный выше интернет-сервер, а почти та задача, которая стояла при геренации веб-контента (использование стран имеет историческую причину :-))).

Мне кажется, что данные метод управления наследованием уже сейчас можно применять для макетирования. Для использования в конечном продукте требуется более эффективная реализация.

Все то же самое не сложно было бы реализовать и на Perl (возможно и на Python). Но от такой реализации Perl потерял бы свою краткость, а Python я не очень люблю. В синтаксис Lispа оно вписалось вполне удачно.
При выборе Common Lisp и Scheme я исходил из того, что в Scheme я недавно тренировался и, кроме того, заманчиво выглядит перспектива интергации с CLOS. Аналог CLOS в Scheme менее популярен.
Tags: clos, lisp, oop, potan
Subscribe

  • Symta

    Куда спрятались Lisp, Refal и Prolog? Теперь всюду бестолковые Хаскелли и Агды. Если вы посещали http://0chan.hk/c/, то читали что я работаю над…

  • Задачка по ФП.

    _darkus_ часто публикует интересные задачки к курсу "Функциональное программирование". Хочу предложить полезную для студентов задачку -…

  • Язык Hume

    Для тех, кто не читает lambda_ultimate rss или пропустил это сообщение. (Ссылка устарела, здесь исходное сообщение.) Язык Hume позиционируется как…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 14 comments

  • Symta

    Куда спрятались Lisp, Refal и Prolog? Теперь всюду бестолковые Хаскелли и Агды. Если вы посещали http://0chan.hk/c/, то читали что я работаю над…

  • Задачка по ФП.

    _darkus_ часто публикует интересные задачки к курсу "Функциональное программирование". Хочу предложить полезную для студентов задачку -…

  • Язык Hume

    Для тех, кто не читает lambda_ultimate rss или пропустил это сообщение. (Ссылка устарела, здесь исходное сообщение.) Язык Hume позиционируется как…