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

Сейчас вернулся к проекту интерпретатора схемы с виртуальной машиной. Собираюсь

добавить замыкания. Хочу уточнить правильно ли я понимаю, что мне вообще нужно делать. Раньше мне сказали, что в качестве gc на первое время будет достаточно обычного реф каунтера. Как я представляю реализацию:
1) В структуре представляющей замыкание есть поле содержащее набор идентификаторов захватываемых переменных, которое заполняется при компиляции(Vec<&str>) и свой стек который заполняется при интерпретации(Vec<(&str, Rc<Value>)>).
2) Когда встречается лямбда выражение, помимо его компиляции мне также нужно составить список идентификаторов, которые в нем встречаются, но не объявлены в аргументах/теле функции.
3) Уже во время выполнения байткода при объявлении функции я для каждого идентификатора из первого поля ищу его в стеке и добавляю во второе поле пару вместе со значением.
4) При вызове какого-либо замыкания я пары из второго поля добавляю в текущий стек

Ещё у меня возникла пара вопросов:
1) Как поступают с глобальными переменными? Стоит ли сохранять их значение во время объявления функции?
2) Во втором шаге, нужно ли пытаться совместить компиляцию и этот анализ в один проход, или анализ будет нормально сделать уже отдельно?

23 ответов

21 просмотр

> содержащее набор идентификаторов захватываемых переменных Зачем захватывать идентификаторы переменных? Лучше сразу захватывать значения, которые лежат в этих переменных. > и свой стек который заполняется при интерпретации Зачем там свой стек? Это ж замыкания, а не продолжения? > При вызове какого-либо замыкания я пары из второго поля добавляю в текущий стек Зачем их на стек перекладывать? Проще взять прямо оттуда, где они хранятся. > Стоит ли сохранять их значение во время объявления функции? Да. Это называется "лексическая область видимости" (lexical scope). Вообще, имеет смысл посмотреть что такое lambda lifting и как это делается. Но по-простому можно прямо в байт-код добавить инструкции для создания замыканий и работы с ними.

Alexander Chichigin
> содержащее набор идентификаторов захватываемых п...

> Зачем захватывать идентификаторы переменных? Лучше сразу захватывать значения, которые лежат в этих переменных. А как узнать сами значения во время компиляции?

Alexander Chichigin
Так само замыкание создаётся во время выполнения.

Тогда анализ тела функции тоже во время интерпретации делать?

oleja ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ
Тогда анализ тела функции тоже во время интерпрета...

Почему? Как тогда Вы сгенерируете код для создания замыкания, если Вы не проанализировали функцию, и не знаете, что нужно будет делать?

> В структуре представляющей замыкание есть поле содержащее набор идентификаторов Так, стоп. Это поминки. Замыкание может захватить локальный объект, уйти за пределы области определения и там быть вызванным. В этом случае всё развалится. Надо захватывать стек (контекст) на момент создания замыкания.

Andrei Kurosh
А если замкнутые переменные нужно менять?

Менять нужно значения, а не переменные — не надо это путать.

TOV_MULTIMASSO
> В структуре представляющей замыкание есть поле с...

> Надо захватывать стек (контекст) на момент создания замыкания. Ну, весь стек захватывать не нужно — это же не продолжение...

Alexander Chichigin
> Надо захватывать стек (контекст) на момент созда...

Если мы не весь стек захватываем, то у нас видимость перестаёт быть лексической

Andrei Kurosh
Значения переменной…

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

Но весь стек то зачем, только те переменные, которые используются непосредственно в теле функции, нет? А то получится иррационально

oleja ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ
Но весь стек то зачем, только те переменные, котор...

Это частный случай захвата всего. Обычно быстрее захватить стек, чем проходить по нему и выбирать конкретные вещи — даже когда набор известен статически.

oleja ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ
Обычно советуют обратное

Можно и конкретику. Это потребует отдельного прохода с выводом явных списков захвата у лямбд.

TOV_MULTIMASSO
Я предлагаю не делать мутабельных переменных вообщ...

Это фундаментальное решение в дизайне, чтобы влепить их потом может понадобиться все переделать

TOV_MULTIMASSO
В окамле вон справились, в хаскелле тоже

Обратно-совместимо, без введения нового синтаксиса для этих переменных?

Andrei Kurosh
Обратно-совместимо, без введения нового синтаксиса...

Решаемо юзерспейсом. Добавить конструктор и операторы на чтение/запись. let a = ref 4; a := 5; print (a!);

TOV_MULTIMASSO
Решаемо юзерспейсом. Добавить конструктор и операт...

Давайте не будем подменять понятия - это не изменение переменой, а просто структура с изменяемым содержимым, плотно обмазанная сахаром

Andrei Kurosh
Это фундаментальное решение в дизайне, чтобы влепи...

М-да уж, в интерпретатор Nutt понадобилось очень много изменений внести, чтобы добавить квалификатор ссылки mut.

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

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

Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Всем привет! procedure TForm1.FormCreate(Sender: TObject); type TStartEnd = record S: Byte; E: Byte; end; var a, b: TStartEnd; begin {1} a.S := 1; {2} a.E := 2; ...
Руслан Михайлович
10
Всем привет!) я тут новенький и пытаюсь освоить evolution методом тыка. У меня при переходе между папками файлов выскакивают вот такие уведомления Можете подсказать как их от...
Диман Samoed
10
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Какого хера? /Sources/App/Modules/User/Models/UserLinkApple.swift:21:20: warning: stored property '_id' of 'Sendable'-conforming class 'UserLinkApple' is mutable @ID(...
Alexander Sherbakov
14
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
Карта сайта