2009-12-10 3 views
1

quel est le problème avec ce code dans Dr.Scheme en utilisant Pretty Big? Je me souviens de faire des choses semblables dans le passé sans problème."set !: pas d'identifiant dans: ..." plt erreur système

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

qui renvoie l'erreur suivante:

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

si je laisse de côté la partie (set! (Frame-variables res) ...) il fonctionne très bien, sauf bien sûr que ma liste ne change pas vraiment. donc il reconnaît le deuxième (Frame-varialbes res) mais pas le premier? ou quel est le problème avec set! dans ce contexte?

J'espère que vous reconnaissez que j'ai une structure appelée Frame avec un champ variables qui est une liste.

Répondre

4

Le problème:

Comment régler! travaux. Qu'est-ce que cela fait vraiment est de lier un nom à un objet qui traîne dans la mémoire quelque part. Quand vous définissez !, cela change ce à quoi ce nom fait référence.

C'est l'erreur: (Frame-variables res) n'est pas un identificateur, donc il ne peut pas faire référence à autre chose.

Le correctif:

Qu'est-ce que vous essayez de faire est de muter un membre d'une struct. Ce que vous devez faire est de changer ce membre de la structure pour qu'il soit modifiable, puis utiliser le mutateur qui sera fait.

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

Ensuite, vous pouvez utiliser

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

Cela muter votre structure désirée.

La Conférence:

Je me demande si vous choisissez une bonne conception de votre programme. Mutation et ajout à une liste sont deux opérations qui me font questionner un dessin dans Scheme. En outre, il semble que ce que vous faites tente de maintenir une liste d'associations de variables, en fonction de ce que vous les avez appelé. Ce n'est pas vraiment efficace, et peut-être vous devriez envisager quelque chose d'autre comme un Hash Table

La documentation pertinente:

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

+1

Bonne réponse en général, mais aussi voir SRFI-17 et supercherie, fournissent tous les deux un tel "ensemble généralisé"! " Bien qu'il soit vrai qu'en général vous ne devriez pas utiliser la mutation si cela peut être évité, il est parfois utile de le faire - et un avantage des setters généralisés est que vous pouvez écrire une macro «inc!» Qui devient très utile. –

Questions connexes