Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание интерпретатора. Выбор пути. 
:(
    Опции темы
Tobuk
Дата 22.7.2010, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 20.11.2008

Репутация: нет
Всего: нет



Создаю я интерпретатор Лиспа. Создаю его на Си. 
Точнее уже создал и даже уже переписал с нуля для ускорения его работы.

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

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

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

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

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

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

Это сообщение отредактировал(а) Tobuk - 22.7.2010, 21:45
PM MAIL   Вверх
jonie
Дата 22.7.2010, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



попробуйте почитать цикл статей на habrhabr.ru о создании своего языка статьи
6
5
4
3
2
1
.....



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Void
Дата 23.7.2010, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



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

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

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

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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Tobuk
Дата 23.7.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 20.11.2008

Репутация: нет
Всего: нет



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

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

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

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

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

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

Это сообщение отредактировал(а) Tobuk - 23.7.2010, 15:50
PM MAIL   Вверх
Void
Дата 23.7.2010, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λ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
PM MAIL WWW GTalk   Вверх
xvr
Дата 12.8.2010, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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



Это сообщение отредактировал(а) xvr - 12.8.2010, 15:40
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0965 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.