1

Dr.Scheme 中使用 Pretty Big 的这段代码有什么问题?我似乎记得过去做类似的事情没有问题。

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

返回以下错误:

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

如果我省略了(set! (Frame-variables res) ... )它工作正常的部分,当然我的列表实际上并没有改变。所以它识别第二个(Frame-varialbes res)而不是第一个?或者在这种情况下有什么处理set!

希望你认识到我有一个结构体Frame,它的variables字段是一个列表。

4

1 回答 1

4

问题:

怎么设置!作品。它真正的作用是将名称绑定到内存中某处的对象。当您设置!时,它会更改该名称所指的内容。

这就是错误:(Frame-variables res)不是一个标识符,所以它不能让它引用别的东西。

修复:

你想要做的是改变一个结构的成员。您需要做的是将该结构成员更改为可变的,然后使用将要生成的 mutator。

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

然后,您可以使用

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

这将根据需要改变您的结构。

讲座:

我想知道您是否正在为您的程序选择一个好的设计。变异和追加到列表都是让我质疑 Scheme 中的设计的操作。

此外,看起来您正在做的事情是根据您对它们的称呼来维护变量的关联列表。这不是很有效,也许你应该考虑其他东西,比如哈希表

相关文件:

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

于 2009-12-10T05:23:08.457 回答