Frage

Was ist falsch mit diesem Code in Dr.Scheme mit recht großen? i scheinen kein Problem, die ähnliche Dinge in der Vergangenheit zu erinnern.

(lambda (x y) (set! (Frame-variables res) (append (Frame-variables res) (list (cons x y)))))

, die die folgenden Fehler zurück:

  

set!: not an identifier in: (Frame-variables res)

, wenn ich lasse den (set! (Frame-variables res) ... ) Teil funktioniert es gut, außer natürlich, dass meine Liste ändert sich nicht wirklich. so erkennt er den zweiten (Frame-varialbes res) aber nicht die ersten? oder was ist der Deal mit set! in diesem Zusammenhang?

hoffentlich erkennen Sie, dass ich eine Struktur namens Frame mit einem variables Feld haben, die eine Liste ist.

War es hilfreich?

Lösung

Das Problem:

Wie setzen! funktioniert. Was es wirklich tut, ist ein Name für ein Objekt binden, um irgendwo im Speicher hängt. Wenn Sie festgelegt haben !, es ändert sich, was dieser Name bezieht sich auf.

Das ist der Fehler: (Frame-variables res) kein Bezeichner ist, so kann es nicht auf etwas anderes machen beziehen

.

Das Update:

Was Sie versuchen, ein Mitglied einer Struktur zu tun ist, mutieren. Was Sie tun müssen, ist, dass das Strukturelement ändert wandelbar zu sein, und dann den Mutator verwenden, die gemacht werden.

(define-struct frame (a b ... c [variables #:mutable] e ...))

Dann können Sie

(set-frame-variables! res (list "new" "value"))

Dies wird Ihre Struktur mutieren, wie gewünscht.

Die Vorlesung:

Ich frage mich, wenn Sie ein gutes Design für Ihr Programm Wahl sind. Mutieren und auf eine Liste angehängt sind beide Operationen, die mir ein Design in Schema in Frage stellen.

Auch sieht es so aus, was Sie tun versucht, eine Verbindung Liste von Variablen zu erhalten, basierend auf, was Sie sie genannt haben. Das ist nicht wirklich effizient, und vielleicht sollten Sie etwas anderes wie ein Hash Table betrachten

Relevante Dokumentation:

http://docs.plt-scheme.org/reference/define-struct.html# (form._ ((lib._scheme / base..ss) ._define-Struktur))

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top