“Set !: Non un identificatore in: ...” Errore PLT Scheme
-
18-09-2019 - |
Domanda
cosa c'è di sbagliato in questo codice in Dr.Scheme utilizzando abbastanza grande? Mi sembra di ricordare di fare cose simili in passato senza alcun problema.
(lambda (x y) (set! (Frame-variables res) (append (Frame-variables res) (list (cons x y)))))
che restituisce il seguente errore:
set!: not an identifier in: (Frame-variables res)
se omettere la parte (set! (Frame-variables res) ... )
funziona bene, tranne, naturalmente, che la mia lista in realtà non cambia. in modo che riconosca il secondo (Frame-varialbes res)
, ma non il primo? o che cosa è il problema con set!
in quel contesto?
speriamo che riconoscere che ho una struct chiamato Frame
con un campo variables
che è una lista.
Soluzione
Il problema:
Come impostare! lavori. Ciò che in realtà non fa altro che associare un nome a un oggetto che è appeso in giro da qualche parte nella memoria. Quando si imposta !, cambia ciò che nome si riferisce.
Questo è l'errore: (Frame-variables res)
non è un identificatore, quindi non può fare che si riferiscono a qualcosa di diverso
La correzione:
Quello che stai cercando di fare è mutare un membro di una struct. Quello che dovete fare è cambiare che membro della struttura di essere mutevole, e quindi utilizzare il modificatore che verrà effettuato.
(define-struct frame (a b ... c [variables #:mutable] e ...))
Quindi, è possibile utilizzare
(set-frame-variables! res (list "new" "value"))
In questo modo mutare la struttura, se lo desideri.
La Lecture:
Mi chiedo se si sceglie un buon design per il vostro programma. Mutando e aggiungendo ad una lista sono entrambe le operazioni che mi fanno in discussione un disegno nello Schema.
Inoltre, sembra che quello che stai facendo sta cercando di mantenere un elenco associazione di variabili, in base a ciò che li hai chiamato. Questo non è davvero efficace, e forse si dovrebbe prendere in considerazione qualcosa di diverso come un href="http://docs.plt-scheme.org/reference/hashtables.html" rel="nofollow noreferrer"> Hash Table
documentazione pertinente: