为什么在结构定义中使用 #transparent 属性会降低 Racket 中的代码模块化?

问题描述

我正在研究由伟大的 Dan Grossman 教授撰写的关于 Racket 的材料。他是华盛顿大学计算机科学系的一员。

在他关于 Racket 的讲义中的某个时候,他描述了使用 struct#:transparent 属性。尽管事实 它显然有助于调试并与 REPL/交互式编程,他提到了代码模块化的可能损害。公平地说,这是引用:

首先,#:transparent 属性 使字段和访问器函数即使在外部可见 定义结构的模块。从模块化的角度来看,这是 有问题的风格,但它在使用 DrRacket 时有一大优势: 它允许 REPL 打印结构值及其内容而不是 而不仅仅是作为一个抽象值。例如,根据我们的定义 struct foo,(foo "hi" (+ 3 7) #f) 的结果打印为 (foo "hi" 10 #F)。如果没有 #:transparent 属性,它将打印为 #,并且每个调用 foo 函数产生的值都将打印 同样的方式。此功能在检查时变得更加有用 通过递归使用结构构建的值。

好的。 #:transparent 使即使在创建结构体定义的模块之外也可以看到内容,这意味着这将在其他球拍文件中可见。

然而,我不明白为什么这可能是甚至有问题的风格。说明这一主张可能存在的问题是什么?

例如,我在 file1.rkt 中使用了一些具有 (provide (all-defined-out)) 的结构来导出所有内容。在名为 file2.rkt 的第二个文件中,我需要 file1.rkt 并使用 rackunit 运行多个测试。我没有看到“副作用”(或类似的东西,比如某种“印刷品”)。什么都不打扰我。

可能是格罗斯曼教授(杰出的)看到了我看不到的东西。

我错过了什么?有人能说明一个可能的问题吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)