Автор Тема: Классическая реализация вложенных процедур в оберона  (Прочитано 5591 раз)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Чего-то мне воображение рисует какие-то сложные схемы. Особенно для случая вызова внешних процедур (level - n) из локальных. Кто-нибудь разбирался как оно по Вирту должно быть?

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
Передача во вложенную функцию неявным параметром указателя на стек объемлющей функции не подойдёт?

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Передача во вложенную функцию неявным параметром указателя на стек объемлющей функции не подойдёт?

Да, наверное можно. У меня просто подсознаетельно ощущение, что это не будет работать из-за привычки, что функция всегда может быть вызвана откуда угодно по указателю. А тут похоже все строго - начало стека всех объемлющих процедур всегда можно вычислить имея указатель на стек родительской.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Передача во вложенную функцию неявным параметром указателя на стек объемлющей функции не подойдёт?

Да, наверное можно. У меня просто подсознаетельно ощущение, что это не будет работать из-за привычки, что функция всегда может быть вызвана откуда угодно по указателю. А тут похоже все строго - начало стека всех объемлющих процедур всегда можно вычислить имея указатель на стек родительской.
Ну, поскольку вложенные процедуры никуда передавать нельзя, то и проблемы нет :-) (что, впрочем, делает оные процедуры много менее полезными чем могли бы быть)
Y = λf.(λx.f (x x)) (λx.f (x x))

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
Если ввести параметры-процедуры с обязательным неявным указателем, значения которых нельзя присваивать, то ограничение на передачу можно обойти. Слишком мудрённо это для Оберона.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Если ввести параметры-процедуры с обязательным неявным указателем, значения которых нельзя присваивать, то ограничение на передачу можно обойти. Слишком мудрённо это для Оберона.

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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Если ввести параметры-процедуры с обязательным неявным указателем, значения которых нельзя присваивать, то ограничение на передачу можно обойти. Слишком мудрённо это для Оберона.

Одного связанного параметра мало

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

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Кто-нибудь разбирался как оно по Вирту должно быть?
А чем не устраивает описание реализации от самого Вирта? "Построение компиляторов", гл. 12.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
А чем не устраивает описание реализации от самого Вирта? "Построение компиляторов", гл. 12.

Ага, это оно, спасибо!