InteLib

InteLib — это библиотека классов C++, моделирующая вычислительную модель языка Лисп и предоставляющая набор операций, позволяющих описывать S-выражения Лиспа с помощью синтаксически близких арифметических выражений в рамках C++. Библиотека создана в качестве инструмента мультипарадигмального программирования.

Принципы 

Библиотека предоставляет объектно-ориентированную модель гетерогенных S-выражений, снабжённую операцией вычисления S-выражения в терминах Лиспа. Классы, составляющие модель, снабжены переопределёнными инфиксными операциями, позволяющими записывать S-выражения в виде зрительно близких к ним арифметических выражений языка C++. Так, в нескольких статьях, посвящённых InteLib, приводится пример функции на Лиспе:
  (defun isomorphic (tree1 tree2)
     (cond ((atom tree1) (atom tree2))
           ((atom tree2) NIL)
           (t (and (isomorphic (car tree1) 
                               (car tree2))
                   (isomorphic (cdr tree1) 
                               (cdr tree2))
  ))))
Средствами InteLib этот фрагмент кода можно записать в виде следующего выражения C++:
  (L|DEFUN, ISOMORPHIC, (L|TREE1, TREE2),
    (L|COND, 
      (L|(L|ATOM, TREE1), (L|ATOM, TREE2)),
      (L|(L|ATOM, TREE2), NIL),
      (L|T, (L|AND,
        (L|ISOMORPHIC, (L|CAR, TREE1), 
                       (L|CAR, TREE2)),
        (L|ISOMORPHIC, (L|CDR, TREE1), 
                       (L|CDR, TREE2))
  ))))
Здесь L — это переменная типа LListConstructor, введённая ради операции L|, которая конструирует список из одного элемента. Результатом операции является объект класса LReference, для которого переопределена операция «запятая» — в библиотеке InteLib эта операция служит для добавления новых элементов к имеющемуся списку.

Результатом всего выражения также является объект класса LReference. Метод Evaluate(), описанный в этом классе, позволяет вычислить выражение в соответствии с правилами языка Лисп. Результатом такого вычисления будет новое S-выражение, представленное, как всегда, объектом класса LReference.

DEFUN, ISOMORPHIC, TREE1 и др. в вышеприведённом примере являются переменными класса LSymbol, который представляет понятие символа Лиспа.

Возможности 

Текущая версия InteLib включает набор средств для работы с S-выражениями как гетерогенными структурами данных (без вычисления), а также вычислительные модели языков Лисп и Scheme (точнее говоря, диалектов InteLib Lisp и InteLib Scheme, которые не соответствуют стандартам этих языков). В комплект поставки входят интерактивные интерпретаторы обоих диалектов, а также трансляторы, принимающие на вход модуль в традиционном синтаксисе Лиспа или Scheme и создающие модуль на C++, снабжённый заголовочным файлом.

История 

Первая работающая версия библиотеки была написана А. Столяровым в ходе выполнения магистерской квалификационной работы на факультете ВМиК МГУ в 1999 году.

Библиотека InteLib впервые официально упоминается в статье А. Столярова и Е. Большаковой Building functional techniques into an object-oriented language, представленной на конференции JCKBSE'2000 в Брно в сентябре 2000 года.

В 2002 году состоялась защита кандидатской диссертации А. Столярова Интеграция разнородных языковых механизмов в рамках одного языка программирования, в которой представлен метод непосредственной интеграции, реализованный в библиотеке InteLib.

Как сказано на официальном сайте InteLib, название библиотеки происходит от слов Intelligence Library, что отражает исходное намерение автора интегрировать в проекты C++ вычислительные модели языков искусственного интеллекта.

Лицензирование 

Библиотека InteLib является свободным программным обеспечением. Сама библиотека распространяется по лицензии LGPL, сопутствующие трансляторы и интерпретаторы — по лицензии GPL.

Ссылки 
 Официальный сайт InteLib

Примечания 

Библиотеки C++
Функциональное программирование
Свободные библиотеки программ