Решил для начала попробовать сделать интерпретатор гибрида Hope+Prolog на языке JavaScript - входными данными для интерпретатора будут не текст программы или байт-код, а некая иерархическая структура в виде родной для джава-скрипта
JSON-нотации. На верхнем уровне это будет массив, состоящий из объектов, описывающих определения типов данных и функции языка Hope, которые внутри будут также представлять из себя иерархические структуры вложенных объектов.
Возможная структура объекта:
{
"T":M, // где M - тип объекта
"O":тело-объекта // может быть null, число, массив, объект
}
Возможные значения типа:
0 - nothing
1 - use (подключение модуля): массив строк
2 - library (список атомов, использованных в коде): массив строк
3 - data (определение нового типа данных): массив объектов
4 - call (вызов функции): массив объектов
5 - dec (определение функции): объект с полями A (число) и D (массив объектов)
6 - special (специальные команды): строка
7 - lambda (определение безымянной функции): массив из двух элементов
8 - if/then/else: массив из трёх элементов
9 - let/in и where (а также letrec и whererec): массив из трёх элементов
10 - type (тип): число - идентификатор атома
11 - cons (простой конструктор): идентификатор атома
12 - cons(...) (сложный конструктор): объект с полями A (число) и O (объект)
13 - tuple (набор элементов): массив объектов
14 - num (число): число
15 - char (буква): число - код символа
Попробуем скомпилировать пример отсюда:
http://www.soi.city.ac.uk/~ross/Hope/ho ... ode18.html
может быть сконвертирован вот в такой JSON:
| | |
| Code: [ {"T":2,"O":["vague","yes","no","maybe","evade"]}, {"T":3,"O":[{"T":10,"O":0},{"T":11,"O":1},{"T":11,"O":2},{"T":11,"O":3}]}, {"T":5,"O": {"A":4, // evade "D":[{"T":10,"O":0},{"T":10,"O":0}, // function declaration {"T":11,"O":1},{"T":11,"O":3}, // 1st equation {"T",11,"O":3},{"T":11,"O":2}] // 2nd equation } } ]
| |
| | |
команду 6-special можно использовать например для указания версии языка {"T":6,O:"hopelog=1.0"} или для отделения публичной части модуля от приватной {"T":6,O:"private"}