Представление замыканий в виде конечных членов

avatar
rwallace
1 июля 2021 в 16:57
46
1
0

Я работаю над мета-интерпретатором для фрагмента языка, который должен быть достаточно богатым, чтобы поддерживать функции более высокого порядка, и столкнулся с проблемой замыканий.

В частности, мне нужно, чтобы все значения были представлены в виде конечных терминов; нет бесконечного повторения, нет объектов, указывающих друг на друга. Это нормально для большинства типов значений, чисел, конечных списков, карт, абстрактных синтаксических деревьев, представляющих программный код. Проблема в замыканиях; они содержат ссылку на содержащую их среду, но если замыкание хранится в локальной переменной, то содержащаяся среда также содержит ссылку на замыкание. Это нормально, если вы работаете с изменяемыми указателями, но это бесконечное повторение, если вы пытаетесь работать с конечными терминами.

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

Источник
Will Ness
1 июля 2021 в 21:14
1

косвенно, как всегда. использовать метки, поэтому указатель указывает на метку объекта, а не на сам объект.

Ответы (1)

avatar
Matt Timmermans
3 июля 2021 в 04:15
2

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

Мое решение состояло в том, что среда фактически не включала указатель на замыкание. Вместо этого он хранил функцию, которая создавала замыкание, когда вы передавали ей указатель на среду.

Процесс поиска значения в среде будет включать в себя вызов этой функции для создания замыкания, если это необходимо. Эта функция, конечно, не нуждается в циклическом указателе на среду, потому что среда будет передана.

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