gpt4 book ai didi

struct - 你如何获得 struct-copy 来创建一个与原始类型相同的结构?

转载 作者:行者123 更新时间:2023-12-01 01:44:34 26 4
gpt4 key购买 nike

为了说明这一点,这里有一个小的不可变结构和一个更新它的函数:

(struct timeseries (variable observations) #:transparent)

(define (add-observation ts t v)
(struct-copy timeseries ts
[observations (conj (timeseries-observations ts) `(,t ,v))]))

我的问题是:如果我创建一个继承自 timeseries 的结构体,然后 add-observation将返回 timeseries struct 而不是传递它的类型的结构。如何更新结构并保留其类型?

顺便说一句,如果上面的代码不是在 Racket 中是如何完成的,请让我知道常规方式。事实上,我还没有在 Racket 库中找到类似 struct-copy 的函数。但这保留了原始结构的类型,这让我怀疑我的做法是错误的。是否有一些普通的方法可以实现相同的目的而不会遇到返回与您开始时不同类型的结构的问题?

最佳答案

不幸的是,这是 struct-copy 之一的众所周知的限制,其中大部分源于它由 Sam Tobin-Hochstadt 恰本地实现 described作为“不卫生地将结构的位粘贴在一起”(而不是复制结构的低级概念),并且是 reason 的一部分“struct-copy 是无望的,如果不对结构的工作方式进行重大改变,就无法修复。”马蒂亚斯·费莱森 described这是“我们世界的阿喀琉斯之踵”。 Racket 社区肯定希望改善这种情况,但出于多种原因,这似乎令人生畏。我不知道有谁在积极地致力于它,原则性的解决方案看起来像什么似乎是一个悬而未决的问题。

结构在很多方面都是 Racket 的基础。从概念上讲,Racket 中的每个值都可以是某种结构类型的实例,尽管实际上运行时系统对某些内置函数有专门的表示。事实上,我认为在 Racket 实现中用 Chez Scheme 替换 C 的正在进行的工作可能会使用结构体来处理遗留 Racket VM 中的一些内置内容。这是可能的,因为结构提供了强大的封装能力,尤其是通过 inspectors .改进结构的工作方式基本上会触及 Racket 的所有方面,并涉及许多不同的考虑因素,尤其是在向后兼容性方面。

以下是进一步阅读这些问题的一些提示:

  • This message从 Sam 中勾勒出如何struct可以开始提供更多静态信息,同时保持向后兼容性。
  • This GitHub issue ,尤其是 Alexis 的最后一条评论,指出 (a) 要添加的正确静态信息是什么并不明显,以及 (b) 添加有关字段名称的静态信息不足以解决子类型问题.
  • This thread指出了 struct-copy 的不同限制并包括亚历克西斯的一个很好的总结:

    struct-copy is irreparably broken and cannot be fixed without fundamental changes to Racket’s struct system. Namely, it has the “slicing” problem familiar to C++ programmers when using struct inheritance, and the way it synthesizes field accessors from the provided field names is unhygienic and can be easily thwarted.


  • 好消息是,虽然找出解决一般情况的正确方法很困难,但 Racket 的语言即库方法使所有程序员和库编写者都可以在自己的代码中尝试不同的方法。有各种 Racket 软件包可帮助进行功能更新和其他功能。亚历克西斯的 struct-update 提供一个宏来合成函数,如 timeseries-observations-update . Jay McCarthy 也尝试过 enhancements to struct在库代码中。您还可以实现针对您的特定用例量身定制的解决方案,包括实现一致的 copy方法(使用 racket/genericracket/class )来创建可以更自然地表达您的问题域的特定领域语言。 This mailing-list thread尽管主题是这样,但涵盖了 Racket 中许多功能更新的方法(包括我对 DSL 的一些想法)。

    关于struct - 你如何获得 struct-copy 来创建一个与原始类型相同的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52142731/

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