Лямбда и модель окружающей среды - PullRequest
5 голосов
/ 01 мая 2011

Мне нужна помощь в рисовании соответствующих частей диаграммы модели среды при оценке этого кода:

Scheme>(define x 10)
Scheme> ((lambda (x y) (+ (y 3) x)) 6 (lambda (w) (* x 9)))

Мне нужно удостовериться и написать каждое лямбда-тело рядом со средой, в которой оно оценивается.

Хорошо, я знаю, что есть только одно определение, поэтому большую часть работы будут выполнять «анонимные» или «безымянные» функции, и они все равно будут отображаться различными способами на диаграмме модели среды.

Ответы [ 2 ]

5 голосов
/ 01 мая 2011

В дополнение к уже полученным ответам, курс 6.001 в Массачусетском технологическом институте состоит из двух очень всеобъемлющих лекций о модели среды, причинах ее существования, а также некоторых очень полезных и подробных пошаговых примерах:

Лекция 1
Лекция 2

Надеюсь, это поможет,

Джейсон

4 голосов
/ 01 мая 2011

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

Первая среда во всех случаях - это глобальная среда, в которой находится (define x 10). Затем, как я уже говорил, добавляйте новую среду всякий раз, когда вы выполняете лямбду (как во второй строке). Эта среда наследуется от любой среды, в которой была выполнена лямбда-лямбда.

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

Затем создается среда для первого лямбда-вызова (наследование от глобальной среды). Здесь x связан с 6, а y связан со второй лямбдой. Затем, чтобы сделать +, называется вторая лямбда. Поскольку он был объявлен в глобальной среде , его новая среда наследуется от этой среды, а не от первой лямбда-среды. Это означает, что для второго * x связано с 10, а не с 6.

Надеюсь, это все понятно объясняет.

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

Кроме того, проверьте envdraw, который можно найти здесь: http://inst.eecs.berkeley.edu/~cs3s/stk/site-scheme/envdraw/ Если вы прочитаете файл ANNOUNCE, он расскажет вам, как его получить. Вам нужно будет использовать STk, определенный интерпретатор Scheme.

envdraw автоматически рисует схемы окружения для Схемы.

Отказ от ответственности: я никогда не беспокоился о envdraw, когда брал урок, в котором использовалась Схема, но он был одобрен моим профессором (видимо, один из его учеников написал это в тот день), и другие люди, похоже, отлично с ним работали.

...