Esto parece una pregunta simple; quizás es tan simple que es difícil encontrar una búsqueda que encuentre la respuesta. En Scheme (específicamente, la implementación de Guile si hace alguna diferencia) ¿cómo puedo evaluar algo que ha sido citado?control de evaluación en el esquema (engaño)
Esto es lo que estoy tratando de hacer.
Básicamente, necesito asegurarme de que una función que defino obtiene sus argumentos evaluados en un orden específico, porque los efectos secundarios causados por la evaluación de un argumento dependen de la evaluación de otros argumentos. Sin embargo, Scheme dice que los argumentos se pueden evaluar en cualquier orden, por lo que quiero forzarlo manualmente citando los argumentos y luego evaluarlos manualmente en el orden que se necesita.
Parece que "eval" es supone a hacer lo que quiera, pero tiene dos problemas:
- Su uso no es recomendable, así que me siento que debe haber una mejor manera de lograr lo Quiero hacer aqui.
- En Scheme parece que eval toma un segundo parámetro que es el entorno. Esto me confunde. Quiero que evalúe en el mismo entorno en el que aparece la declaración, entonces, ¿por qué debería necesitar un segundo parámetro? ¿Esto es posible? He jugado con eval un poco y parece que algunas implementaciones requieren diferentes parámetros (por ejemplo, mit-scheme ni siquiera sabe qué (interacción-entorno) es !!!)
He intentado otros trucos , como construir una lambda:
(list 'lambda '() '(car (b c)))
pero parece que esto tendría que evaluarse para generar un procedimiento. También probé:
(list lambda '() '(car (b c)))
pero esto devuelve un "primitivo-orden interna-macro" que no funciona bien.
Editar: Parece que una macro trabajará para la orden de la evaluación controlar: (defmacro test1 (ab) '(comenzar, B, A))
¿Cómo funciona la macro si necesito una cantidad variable de argumentos? '(defmacro test1 (a. b) \' (begin, b, a)) 'no funciona porque b ahora es una lista. Necesito unirlo de alguna manera al principio, pero varios intentos como '\' (begin (if (pair?, B) (test1, b)), a)) 'no funcionan. – Michael
también, no puedo usar '(defmacro test1 (a. B) \' (begin (apply begin, b), a)) 'porque no puedo aplicar una macro. – Michael
el que te perdiste es '(defmacro test1 (a. B) \' (begin, (cons 'begin b), a)) ' –