Pergunta

O que há de errado com esse código em Dr.Scheme usando muito grande? Eu me lembro fazendo coisas semelhantes no passado sem nenhum problema.

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

que retorna o seguinte erro:

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

Se eu omitir a parte (set! (Frame-variables res) ... ) ele funciona bem, exceto, é claro que a minha lista não realmente mudar. por isso reconhece a segunda (Frame-varialbes res), mas não o primeiro? ou o que é o negócio com set! nesse contexto?

espero que você reconhecer que eu tenho uma struct chamada Frame com um campo variables que é uma lista.

Foi útil?

Solução

O problema:

Como definir! trabalho. O que ele realmente faz é vincular um nome a um objeto que está pendurado ao redor em algum lugar da memória. Quando você faz conjunto !, ela muda o que esse nome se refere.

Esse é o erro:. (Frame-variables res) não é um identificador, por isso não pode fazê-lo se referir a outra coisa

Solução:

O que você está tentando fazer é mutação membro de um struct. O que você precisa fazer é mudar esse membro estrutura para ser mutável, e depois usar o modificador que será feita.

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

Em seguida, você pode usar

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

Isto irá transformar a sua estrutura como desejado.

O Palestra:

Eu estou querendo saber se você está escolhendo um bom projeto para o seu programa. Mutação e anexando a uma lista são as duas operações que me fazem questionar um projeto no esquema.

Além disso, parece que o que você está fazendo é tentar manter uma lista de associação de variáveis, com base no que você chamou. Isto não é realmente eficiente, e talvez você deve considerar algo mais como um Hash Table

documentação relevante:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top