2011-07-05 13 views

Respuesta

6

No, no existe tal cosa en R6RS. Algunas implementaciones raras pueden ser compatibles con algo así, pero en la abrumadora mayoría (incluido eval en otros idiomas) esto no se puede hacer.

La razón de esto es simple: rompe la compilación, ya que hace que dos funciones se distingan en función de los nombres locales y, en algunos casos, también puede prohibir las optimizaciones simples. Por ejemplo, si hay algo que puede completar para su ???, entonces el compilador necesitará dos enlaces, incluso cuando puedan optimizarse. En los raros casos en que es posible, cualquiera que sea el utilizado en el ??? (que en algunos idiomas es simplemente uso de eval) desencadena una compilación diferente, una que correlaciona las vinculaciones conocidas con sus valores. (Hay un comportamiento extraño con eval mencionado literalmente en el código JS en algunos navegadores, que efectivamente es el mismo problema).

+0

¿Qué otros lenguajes tienen un 'eval' que funciona de esta manera? – amoe

+0

Me gusta JS? No lo sé. –

+0

@amoe El lenguaje de programación kernel usa dicha evaluación. – artemonster

2

Las variables léxicas nunca forman parte de un entorno desde la perspectiva de eval. Por lo tanto, no hay forma de que eval toque las variables léxicas x y y, en su ejemplo.

Actualización: A partir de Guile 2.0.5, puede usar local-eval, que de hecho permitirá que su expresión eval utilice variables locales (léxicas). Pero, como dice Eli, la mayoría de las implementaciones de Scheme no son compatibles.

Cuestiones relacionadas