Если я правильно помню, всякий раз, когда вы выполняете лямбду, создается новая среда, где значения аргументов связаны с их именами. Эта среда наследует от любой среды, в которой лямбда была первоначально объявлена.
Первая среда во всех случаях - это глобальная среда, в которой находится (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
, когда брал урок, в котором использовалась Схема, но он был одобрен моим профессором (видимо, один из его учеников написал это в тот день), и другие люди, похоже, отлично с ним работали.