2011-07-05 2 views
6

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

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

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

ответ

6

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

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

+0

Какие другие языки имеют «eval», который работает таким образом? – amoe

+0

Как JS? Я не знаю. –

+0

@amoe Язык программирования ядра использует такую ​​оценку. – artemonster

2

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

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

Смежные вопросы