gpt4 book ai didi

scheme - 如何在 Racket 中结构复制仅在运行时已知的字段?

转载 作者:太空宇宙 更新时间:2023-11-03 18:51:50 25 4
gpt4 key购买 nike

在 Racket 中,可以复制具有特定字段更改的结构。以下内容:

(struct foo (a b c))
(define tst (foo 1 2 3))
(struct-copy foo tst [a 4])

应该生成 (foo 4 2 3)

我想知道,如果我要修改的字段在编译时不知道怎么办?举例来说,我想编写一个可以根据用户输入修改 a、b 或 c 的函数。如果我有一个功能:

(define (update-foo somefoo param)
(struct-copy foo somefoo [param 4]))

然后我收到错误 struct-copy: accessor name not associated with the given structure type。因为它将“param”视为访问器,而不是评估它并将内部的符号/字符串视为访问器。

所以我想知道,是否可以在预期字段名称仅在运行时已知的情况下使用 struct-copy?如果没有,是否有某种解决方法,或者我应该硬着头皮将 foo 更改为可变结构(因为 set-foo-a! 等在运行时存在)?

最佳答案

(这本来是一条评论,但 OP 要求我将其作为答案发布)

如果你想要任意的运行时字段名称,那么听起来你是在鸭子输入字典而不是结构......在这种情况下你应该使用字典。

Racket struct 的一个特点是引用字段可以更快,因为它是编译时已知的静态偏移量。另一个特点是你不能在编译时添加一个未知的字段,或者,省略一个字段。

当这些特性成为优势时(即当您不想意外添加或省略字段时),您应该使用结构。否则(即当你确实想故意添加或省略字段时——这听起来像你的情况)你应该改用某种字典,例如哈希表或关联列表。

关于scheme - 如何在 Racket 中结构复制仅在运行时已知的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26276989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com