185 похожих чатов

Локальные переменные иртерпретаторы же чаще всего в стеке хранят? А

как они работают с замыканиями, просто копируют все переменные в объект замыкания что-ли?

20 ответов

2 просмотра

Так или иначе, утаскивают замыкаемые переменные в кучу. Детали зависят от того, делается ли замыкание по ссылке или по значению.

Если замыкание нисходящее, можно просто сослаться на кадр стека, как в ISO Pascal и Аде

卜根
Если замыкание нисходящее, можно просто сослаться ...

Но тогда надо следить, чтобы эти замыкания не утекали наверх

Антон 🇦🇲
Но тогда надо следить, чтобы эти замыкания не утек...

У параметров могут быть типы, не имеющие аналогов в переменных и полях записей, так что параметр некуда деть, кроме как вызвать или передать в вызов

.- Автор вопроса

Ну вот есть у меня что-то вроде Vec<(&str, Value)> и в данный момент интерпретатор столкнулся с замыканием, какие дальнейшие действия приблизительные? Как интерпретатору узнать какие переменные будут захвачены? Разве что смотреть идентификаторы в теле в момент объявления, но выглядит как-то муторно. Или просто скопировать все локальные переменные в этот момент. Язык - небольшое подмножество лиспа

.
Ну вот есть у меня что-то вроде Vec<(&str, Value)>...

Дальнейшие действия — добавить соответствующее поле в структуру замыкания и подставить это поле на место переменной. К концу компиляции тела функции у вас будет собрана вся структура замыкаемых переменных. Тащить весь стековый кадр в кучу — это анахронизм из очень древних Лиспов. Не стоит так делать сейчас.

.- Автор вопроса
Vasiliy Tereshkov
Дальнейшие действия — добавить соответствующее пол...

>> К концу компиляции тела функции Я про интерпрететор изначально спрашивал Лисп интерпретатор это просто символьные выражения по сути. Лямбды прикручены уже сбоку, я пока что думал хранить их в окружении как sexp аргументы . тело. Но как вижу сейчас этого не достаточно, потому что нужно ещё окружение запомнить

.- Автор вопроса
.
Ну вот есть у меня что-то вроде Vec<(&str, Value)>...

@vtereshkov Может нужно рекурсивно просмотреть тело функции и при встрече идентификатора проверять, что его нет в аргументах? Так?

Чаще всего интерпретаторы хранят локальные переменные (точнее, объекты, на которые локальные переменные указывают) на куче, и при этом собирают их GC — чтобы их "замкнуть" достаточно просто сделать ссылки на те же объекты изнутри самого замыкания (которое тоже структура на куче, из которой идут ссылки на функцию и замкнутые переменные).

.- Автор вопроса
Alexander Chichigin
Чаще всего интерпретаторы хранят локальные перемен...

А как это будет в раст выглядеть? Vec или HashMap же тоже данные в куче хранят. И опять же вопрос как определить какие переменные нужно замкнуть, разве что пройтись по телу исключая аргументы, но можно же внутри замыкания тоже присваивать переменные

.
А как это будет в раст выглядеть? Vec или HashMap ...

> А как это будет в раст выглядеть? Rc<Value> или как-то так. > как определить какие переменные нужно замкнуть К которым идёт обращение в теле функции — те и замыкаем.

.- Автор вопроса

Vec<Rc<Value>> выходит? > К которым идёт обращение в теле функции. Перед тем как добавить "объект функции" с с-выражением, которое является телом пройтись просто по нему и посмотреть какие встречаются идентификаторы?

.
Vec<Rc<Value>> выходит? > К которым идёт обращение...

А Вы свой Lisp не парсите, что ли? Пытаетесь интерпретировать строчка за строчкой? Думаю, с Lisp так не выйдет. В любом случае строить AST и tree-walking interpreter — это минимум. А при наличии AST — какие проблемы по нему пройти лишний раз? Есть подозрение, что таблицу символов можно построить одновременно с самим AST.

.- Автор вопроса
Alexander Chichigin
А Вы свой Lisp не парсите, что ли? Пытаетесь интер...

Парсим конечно. Просто я почему-то думал, что ещё раз пройтись действительно лишнее действие:) > AST tree-walking interpreter минимум. А почему минимум, разве иртерпретаторы комона или схемы, да впринципе лиспов не ограничиваются tree-walking interpreter, там же синтаксис очень простой, я даже слышал мнение, что парсинг можно вообще не отделять никак. > Таблица символов одновременно с AST. Опять же, разве ее используют в подобных интерпретаторах? Мне казалось это гораздо ближе к компиляции

.
Парсим конечно. Просто я почему-то думал, что ещё ...

> А почему минимум, разве иртерпретаторы комона или схемы, да впринципе лиспов не ограничиваются tree-walking interpreter Потому что медленее — только построчная интерпретация. Не ограничиваются, конечно — любой пристойный интерпретатор сначала компилирует в байт-код. Промышленные "интерпретаторы" Common Lisp/Scheme и других — компилируют в машинный код. > Мне казалось это гораздо ближе к компиляции Так называемый "environment", который у Вас (был) Vec<&str, Value> — это то же самое, что таблица символов. Плюс-минус нюансы.

.- Автор вопроса
Alexander Chichigin
> А почему минимум, разве иртерпретаторы комона ил...

Подождите, но разве компиляция в машинный код это не компилятор?

.
Подождите, но разве компиляция в машинный код это ...

Если компиляция в байт-код считается интерпретацией — то почему нет? 😂

.- Автор вопроса
Alexander Chichigin
Если компиляция в байт-код считается интерпретацие...

Ну, не знаю, меня тоже компиляция в байткод как-то смущала в процессе интерпретации

.
Ну, не знаю, меня тоже компиляция в байткод как-то...

это всё условности, главное - результат

Похожие вопросы

Обсуждают сегодня

А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
75
Как Вы считаете нормально ли в двадцатых годах 21 века в ВУЗах Российской Федерации обучать студентов работе с TASM? Не слишком ли это "архаично"? (Если оффтоп или флейм для э...
Spiker01
52
Всем привет! поделитесь, пож-та, как кто дебажил / решал проблему с 504 Time out ошибкой от nginx, когда стучишься на свой vapor сервер? в логах /var/log/nginx/error.log е...
Paul
24
Читаю сейчас [нет, уже больше не читаю!] курсовую о Булгакове, написанную, похоже, с помощью ChatGPT. Это удивительный психоделический опыт. Текст в основном написан в стиле б...
✨ Uni [🌊 В отпуске]
1
Как добавить ссылку в Быстрый доступ в Проводнике windows 10? Нашёл, как на power shell сделать, но может есть способ через Дельфи?
А
31
Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
48
Я тут пытаюсь переработать архитектуру подсистемы памяти ядра во что-то осмысленное. Есть pmm, который создает набор range’ей(пока что только для ядра, потом для юзерспейса), ...
Evg Resh
19
Обязательно ли смена методологии обучения алфавиту при смене алфавита(реформе письменности) - нет. А при смене глиненых табличек на попирус, нужно ли менять методологию обучен...
Spiker01
8
@rouse_79 а ты не знаешь простого способа определить что приложение запущено из под среды delphi?
Михаил
14
Скажите, можно ли как-то "переместить" динамический массив из одной переменной в другую? Скажем, переместить из TList<> в TArray<>. Именно переместить, а не скопировать. Если ...
Eugene Krasnikov (ᴊɪɴ x)
37
Карта сайта