Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Создание интерпретатора. Выбор пути.


Автор: Tobuk 22.7.2010, 21:43
Создаю я интерпретатор Лиспа. Создаю его на Си. 
Точнее уже создал и даже уже переписал с нуля для ускорения его работы.

Он конечно работает, но я не уверен, что пошел по верному пути.

Вот как он у меня устроен. 
Первый этап - разбиение скрипта на токены. Токены это ключевые слова, константы, имена, скобочки.
Второй этап - проверка синтаксиса.
Третий этап - выполнение.
Вот о третьем этапе я и хочу поговорить.

Как он у меня выполняется.
Есть массив токенов. Выполнение начинается с первого.
Процедура Eval берет выражение, анализирует функцию(если функция - ключевое слово, то выполняем его по особому алгоритму), создает список аргументов(список значений аргументов)
(при создании списка она рекурсивно вызывает себя, что-бы вычислить подвыражения)
Далее она передает список аргументов функции Apply, которая прыгает к нужной функции и выполняет ее.
Как она ее выполняет: 
- Связывает аргументы и имена аргументов в нужной функции.
- Выполняет тело функции.

Вот собственно и все.
Но беда. 
Мой интерпретатор просто не может выполнить следующую команду.

(car '(list 1 2))
PLT Scheme например возвращает list
но как мне сделать такое-же? Ведь в динамическом типе моего лиспа нет такой вещи, как list.
Есть числа, строки, правда, лож, пустой тип, а list нет.
Да и не должно его быть. Это же ключевое слово! Код, а не данные!

Что посоветуете?

Автор: jonie 22.7.2010, 22:52
попробуйте почитать цикл статей на habrhabr.ru о создании своего языка статьи
http://habrahabr.ru/blogs/programming/99592/
http://habrahabr.ru/blogs/programming/99466/
http://habrahabr.ru/blogs/programming/99397/
http://habrahabr.ru/blogs/programming/99366/
http://habrahabr.ru/blogs/programming/99298/
http://habrahabr.ru/blogs/programming/99162/
.....

Автор: Void 23.7.2010, 01:38
Цитата(Tobuk @  22.7.2010,  23:43 Найти цитируемый пост)
Мой интерпретатор просто не может выполнить следующую команду.

(car '(list 1 2))
PLT Scheme например возвращает list
но как мне сделать такое-же? Ведь в динамическом типе моего лиспа нет такой вещи, как list.
Есть числа, строки, правда, лож, пустой тип, а list нет.
Да и не должно его быть. Это же ключевое слово! Код, а не данные!

Мне тут непонятно несколько вещей (в порядке убывающего изумления):
— Как можно написать интерпретатор Лиспа, в котором нет внутреннего представления для cons-пары.
— Как можно написать интерпретатор Лиспа, не зная, что код — это данные и наоборот.
— Как можно написать интерпретатор Лиспа, не зная, что такое цитирование и квазицитирование.

Я не иронизирую. Автор, откуда вы черпали свои представления о Лиспе?

Автор: Tobuk 23.7.2010, 15:49
Цитата(Void @  23.7.2010,  01:38 Найти цитируемый пост)
— Как можно написать интерпретатор Лиспа, в котором нет внутреннего представления для cons-пары.— Как можно написать интерпретатор Лиспа, не зная, что код — это данные и наоборот.— Как можно написать интерпретатор Лиспа, не зная, что такое цитирование и квазицитирование.Я не иронизирую. Автор, откуда вы черпали свои представления о Лиспе?

- Да я до сих пор не знаю что такое cons и зачем оно нужно.
- Я писал в полном соответствии с книгой SICP. Я прочитал что делают Eval и Apply. Ну вот и написал интерпретатор.
- цитирование и квазицитирование? Что это?
Послушайте. В Лиспе есть функции и списки аргументов функций.
Функции(у меня в лиспе) делятся на 4 вида.
Ключевые слова - особая обработка.
Функции написанные на Си - сериализуем функцию, а потом вызываем ее ассемблером.
Операторы - храним указатель на них. (+ - * /)
Функции написанные на лисп.- Храним указатель на них. Ну и конструируем список аргументов, связываем его с именами аргументов и выполняем тело функции.

Кстати. В моем лиспе есть оптимизация хвостовой рекурсии. Гордо звучит да?

Откуда я черпаю знания?
Я прочитал пару страниц из SICP, несколько гайдов для нубов по лиспу. 
Как ни странно, мне этого хватило для создания интерпретатора.

Вот. Это игра, которая полностью написана на моем лиспе. (как пример).
http://www.gamedev.ru/projects/forum/?id=135713#m0

Так в правильном направлении я развиваю свой Лисп?

Автор: Void 23.7.2010, 17:38
SICP — это хорошо (правда желательно прочитать более чем пару страниц), но если вы пишете интерпретатор и ссылаетесь на PLT Scheme, то вам необходимо ознакомиться с R6RS.

Автор: xvr 12.8.2010, 15:40
Цитата(Tobuk @  23.7.2010,  15:49 Найти цитируемый пост)
В Лиспе есть функции и списки аргументов функций.
Нету. В LISPе все - списки. Иногда первые элементы этих списков могут трактоваться как имена вызываемых функций, но это не абсолютное правило, и зависит от контекста, где встречается этот список.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)