![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Tobuk |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 20.11.2008 Репутация: нет Всего: нет |
Создаю я интерпретатор Лиспа. Создаю его на Си.
Точнее уже создал и даже уже переписал с нуля для ускорения его работы. Он конечно работает, но я не уверен, что пошел по верному пути. Вот как он у меня устроен. Первый этап - разбиение скрипта на токены. Токены это ключевые слова, константы, имена, скобочки. Второй этап - проверка синтаксиса. Третий этап - выполнение. Вот о третьем этапе я и хочу поговорить. Как он у меня выполняется. Есть массив токенов. Выполнение начинается с первого. Процедура Eval берет выражение, анализирует функцию(если функция - ключевое слово, то выполняем его по особому алгоритму), создает список аргументов(список значений аргументов) (при создании списка она рекурсивно вызывает себя, что-бы вычислить подвыражения) Далее она передает список аргументов функции Apply, которая прыгает к нужной функции и выполняет ее. Как она ее выполняет: - Связывает аргументы и имена аргументов в нужной функции. - Выполняет тело функции. Вот собственно и все. Но беда. Мой интерпретатор просто не может выполнить следующую команду. (car '(list 1 2)) PLT Scheme например возвращает list но как мне сделать такое-же? Ведь в динамическом типе моего лиспа нет такой вещи, как list. Есть числа, строки, правда, лож, пустой тип, а list нет. Да и не должно его быть. Это же ключевое слово! Код, а не данные! Что посоветуете? Это сообщение отредактировал(а) Tobuk - 22.7.2010, 21:45 |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Мне тут непонятно несколько вещей (в порядке убывающего изумления): — Как можно написать интерпретатор Лиспа, в котором нет внутреннего представления для cons-пары. — Как можно написать интерпретатор Лиспа, не зная, что код — это данные и наоборот. — Как можно написать интерпретатор Лиспа, не зная, что такое цитирование и квазицитирование. Я не иронизирую. Автор, откуда вы черпали свои представления о Лиспе? -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Tobuk |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 20.11.2008 Репутация: нет Всего: нет |
- Да я до сих пор не знаю что такое cons и зачем оно нужно. - Я писал в полном соответствии с книгой SICP. Я прочитал что делают Eval и Apply. Ну вот и написал интерпретатор. - цитирование и квазицитирование? Что это? Послушайте. В Лиспе есть функции и списки аргументов функций. Функции(у меня в лиспе) делятся на 4 вида. Ключевые слова - особая обработка. Функции написанные на Си - сериализуем функцию, а потом вызываем ее ассемблером. Операторы - храним указатель на них. (+ - * /) Функции написанные на лисп.- Храним указатель на них. Ну и конструируем список аргументов, связываем его с именами аргументов и выполняем тело функции. Кстати. В моем лиспе есть оптимизация хвостовой рекурсии. Гордо звучит да? Откуда я черпаю знания? Я прочитал пару страниц из SICP, несколько гайдов для нубов по лиспу. Как ни странно, мне этого хватило для создания интерпретатора. Вот. Это игра, которая полностью написана на моем лиспе. (как пример). http://www.gamedev.ru/projects/forum/?id=135713#m0 Так в правильном направлении я развиваю свой Лисп? Это сообщение отредактировал(а) Tobuk - 23.7.2010, 15:50 |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
SICP — это хорошо (правда желательно прочитать более чем пару страниц), но если вы пишете интерпретатор и ссылаетесь на PLT Scheme, то вам необходимо ознакомиться с R6RS.
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Нету. В LISPе все - списки. Иногда первые элементы этих списков могут трактоваться как имена вызываемых функций, но это не абсолютное правило, и зависит от контекста, где встречается этот список.
Это сообщение отредактировал(а) xvr - 12.8.2010, 15:40 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |