我正在Haskell中编写一个(实际上是我的第一个)大型程序,并试图将我的程序分解为模块,这样可能更容易维护.在Haskell中,模块名称似乎取决于目录结构.这非常好,直到我必须为程序嵌入另一层目录结构.我给出一个非常简单的例子如下:
让我们说我们开始使用具有以下目录结构的Haskell程序.
[src]
- (Main.hs) {Main}
- (PRBS.hs) {PRBS}
- [Hardware]
- (DataDef.hs) {Hardware.DataDef}
- (ShiftRegister.hs) {Hardware.ShiftRegister}
Run Code Online (Sandbox Code Playgroud)
这一切都很好.我可以在任何我想要的地方导入我想要的东西.但是,现在说我想创建另一个抽象级别,如下所示:
[src]
- (Main.hs) {Main}
- [Firmware]
- (PRBS.hs) {Firmware.PRBS}
- [Hardware]
- (DataDef.hs) {Firmware.Hardware.DataDef}
- (ShiftRegister.hs) {Firmware.Hardware.ShiftRegister}
Run Code Online (Sandbox Code Playgroud)
现在请注意,硬件中所有模块的名称都已更改.我现在必须更改每个文件中的模块名称,以及导入文件的所有其他文件.我在一个例子中展示的三个文件.如果目录结构最终有数百个带有数十个嵌入目录的文件,则可能无法维护代码.此外,如果在任何时候,我想(在当前目录系统中的特定点及其子目录)复制的目录,我需要弄清楚面前所有而来以前的目录,并手动更改在每个模块名称文件.
由于Haskell用于几个大型项目,我很确定我在这里遗漏了一些东西.任何帮助我摆脱这个泥潭的帮助将不胜感激!
小智 1
如果你有 perl 和 bash 以及 find 等等,你可以这样做:
find Firmware/Hardware/ -name '*.hs' -exec perl -i.bak -pe \
's/^module (Hardware\.\S+)/module Firmware.$1/' \
{} \;
diff Firmware/Hardware/DataRef.hs{,.bak}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |