В схеме R6RS есть ли способ получить текущую среду для использования с eval? - PullRequest
6 голосов
/ 05 июля 2011

Есть ли способ в схеме R6RS получить текущую среду и затем передать ее в качестве второго аргумента eval?

Например, какими должны быть знаки вопроса, чтобы следующее выражение возвращало 9?

(let ((x 4)
      (y 5))
  (eval '(+ x y) ???))

Ответы [ 2 ]

6 голосов
/ 05 июля 2011

Нет, в R6RS такого нет.Некоторые редкие реализации могут поддерживать что-то подобное, но в подавляющем большинстве (включая eval в других языках!) Это невозможно сделать.

Причина этого проста: она нарушает компиляцию, поскольку приводит ксделать две функции различимыми на основе локальных имен, а в некоторых случаях также может запретить простую оптимизацию.Например, если есть что-то, что вы можете заполнить для своего ???, тогда компилятору понадобятся две привязки, даже если их можно было бы оптимизировать.В тех редких случаях, когда это возможно, все, что используется в ??? (что в некоторых языках является просто использованием eval), запускает другую компиляцию, которая отображает известные привязки в их значения.(Существует некоторое странное поведение, когда eval упоминается буквально в коде JS в некоторых браузерах, что фактически является той же проблемой.)

2 голосов
/ 05 июля 2011

Лексические переменные никогда не являются частью среды с точки зрения eval. Таким образом, eval в вашем примере не может коснуться лексических переменных x и y.

Обновление: Начиная с Guile 2.0.5, вы можете использовать local-eval, что действительно позволит вашему выражению eval использовать локальные (лексические) переменные. Но, как говорит Эли, большинство реализаций Scheme не поддерживают это.

...