“Set !: no un identificador en: ...” error PLT Scheme
-
18-09-2019 - |
Pregunta
lo que está mal con este código en Dr.Scheme usando Bastante grande? Me parece recordar hacer cosas similares en el pasado sin ningún problema.
(lambda (x y) (set! (Frame-variables res) (append (Frame-variables res) (list (cons x y)))))
que devuelve el error siguiente:
set!: not an identifier in: (Frame-variables res)
Si Omito la parte (set! (Frame-variables res) ... )
funciona bien, excepto, por supuesto, que mi lista no cambia realmente. por lo que reconoce el segundo (Frame-varialbes res)
pero no el primero? o lo que es el trato con set!
en ese contexto?
esperamos que reconocer que tengo una estructura llamada Frame
con un campo variables
que es una lista.
Solución
El problema:
¿Cómo establece! trabajos. Lo que realmente hace es enlazar un nombre a un objeto que está dando vueltas en la memoria alguna parte. Cuando usted configura !, cambia lo que se refiere al nombre.
Ese es el error: (Frame-variables res)
no es un identificador, por lo que no puede hacer que se refiere a otra cosa
La solución:
Lo que estamos tratando de hacer es mutar un miembro de una estructura. Lo que hay que hacer es cambiar la estructura de ese miembro para ser mutable, y luego usar el mutador que será hecho.
(define-struct frame (a b ... c [variables #:mutable] e ...))
A continuación, puede utilizar
(set-frame-variables! res (list "new" "value"))
Esto mutar su estructura según se desee.
La Conferencia:
Me pregunto si usted está eligiendo un buen diseño para su programa. Mutando y añadiendo a una lista son dos operaciones que me hacen cuestionar un diseño en el esquema.
Además, parece que lo que está haciendo es tratar de mantener una lista de asociación de variables, con base en lo que les ha llamado. Esto no es muy eficiente, y tal vez usted debería considerar otra cosa, como un Tabla Hash
La documentación pertinente: