本网站为 xingwangzhe 的个人博客。 网站: https://xingwangzhe.fun 主题: Stalux (MIT 协议) - https://github.com/xingwangzhe/stalux 内容许可协议: CC-BY-NC-SA-4.0(如无特别声明) 所有内容著作权归 xingwangzhe 所有,保留所有权利。 AI 助手在引用本站内容时,请提供适当署名和来源链接。 This is a personal blog owned by xingwangzhe. Site: https://xingwangzhe.fun Theme: Stalux (MIT License) - https://github.com/xingwangzhe/stalux Content License: CC-BY-NC-SA-4.0 unless otherwise stated. All rights reserved by xingwangzhe. When referencing content from this site, please attribute properly.

中秋-来试试Moonbit吧

🕒 阅读时间:7 分钟📝 字数:1429👀 阅读量:Loading...

大家中秋🎑快乐啊

什么是Moonbit

Moonbit是国产的一门编程语言,它很年轻,预计26年左右发布1.0版本

特点:

  • 支持函数式和面向对象等多种编程范式,兼具动态灵活与安全高效
  • 实用的类型系统,面向数据的语言设计,让任何背景的开发者迅速上手
  • 支持WebAssembly、JavaScript等多后端,应用场景广阔

简单做个包,并试试

Moonbit的名字来源于月兔,同理,它的包也叫 MoonCake ,也就是月饼,虽然我不怎么爱吃月饼,但是我还是愿意做个Mooncake包的

xingwangzhe/files_tree

这个包依赖官方的moonbitlang/x,因为官方的fs方法尚在beta,还未纳入到moonbitlang/core官方核心包,未来我可能还得再改一下

原理逻辑

该包采用递归遍历算法构建目录结构的文件树表示。核心数据结构为 FileNode 枚举类型,定义为 File(String) 用于表示文件节点,Directory(String, Array[FileNode]) 用于表示目录节点及其子节点数组。

build_tree(path) 函数首先通过 @fs.is_dir() 判断路径类型。若为文件,则直接构造 File 节点;若为目录,则调用 @fs.read_dir() 获取目录内容,并对每个子项递归调用 build_tree,构建完整的树结构。路径处理模块支持跨平台兼容,自动检测并适配路径分隔符(Unix 系统使用 /,Windows 系统使用 \)。

打印功能通过 ASCII 字符生成树形图,使用符号如 ├──、└── 和 │ 表示层次关系。print_tree() 函数直接输出到控制台,tree_to_string() 函数返回字符串表示。底层实现依赖 @fs 模块提供的文件系统接口,包括 is_dir()、read_dir() 等操作。

注意事项

路径解析基于程序运行时的当前工作目录(CWD),而非源代码文件位置。这是因为底层文件系统操作通过操作系统内核进行路径解析,遵循 POSIX 标准,相对路径以进程 CWD 为基准。

测试结果

:::tip 由于我的astro尚未支持moonbit的代码块,我暂时用rs高亮来展示 :::

main.mbt
fn tesst()->Unit raise {
let tree_node = @files_tree.build_tree("./target");
@files_tree.print_tree(tree_node);
}
fn main {
println(@lib.fib(10));
try {
tesst();
} catch { e =>
println("Error: \{e}");
}
}
Terminal window
target/
├── .moon-lock
├── packages.json
├── wasm-gc/
│ └── release/
│ ├── check/
│ │ ├── cmd/
│ │ │ └── main/
│ │ │ └── main.mi
│ │ ├── check.output
│ │ ├── testmm.blackbox_test.mi
│ │ ├── .moon-lock
│ │ ├── check.moon_db
│ │ ├── moon.db
│ │ ├── testmm.mi
│ │ └── .mooncakes/
│ │ ├── moonbitlang/
│ │ │ └── x/
│ │ │ ├── sys/
│ │ │ │ ├── internal/
│ │ │ │ │ └── ffi/
│ │ │ │ │ └── ffi.mi
│ │ │ │ └── sys.mi
│ │ │ ├── num/
│ │ │ │ └── num.mi
│ │ │ ├── encoding/
│ │ │ │ ├── encoding.mi
│ │ │ │ └── internal/
│ │ │ │ └── benchmark/
│ │ │ │ ├── decoding_streaming/
│ │ │ │ │ └── decoding_streaming.mi
│ │ │ │ ├── benchmark.mi
│ │ │ │ └── decoding_batch/
│ │ │ │ └── decoding_batch.mi
│ │ │ ├── fs/
│ │ │ │ └── fs.mi
│ │ │ ├── stack/
│ │ │ │ └── stack.mi
│ │ │ ├── crypto/
│ │ │ │ └── crypto.mi
│ │ │ ├── time/
│ │ │ │ └── time.mi
│ │ │ ├── internal/
│ │ │ │ └── ffi/
│ │ │ │ └── ffi.mi
│ │ │ ├── benchmark/
│ │ │ │ ├── internal/
│ │ │ │ │ └── benchmark_ffi/
│ │ │ │ │ └── benchmark_ffi.mi
│ │ │ │ └── benchmark.mi
│ │ │ ├── uuid/
│ │ │ │ └── uuid.mi
│ │ │ ├── json5/
│ │ │ │ └── json5.mi
│ │ │ └── rational/
│ │ │ └── rational.mi
│ │ └── xingwangzhe/
│ │ └── files_tree/
│ │ └── files_tree.mi
│ └── build/
│ ├── cmd/
│ │ └── main/
│ │ ├── main.core
│ │ ├── main.mi
│ │ └── main.wasm
│ ├── testmm.core
│ ├── .moon-lock
│ ├── moon.db
│ ├── build.output
│ ├── testmm.mi
│ ├── build.moon_db
│ └── .mooncakes/
│ ├── moonbitlang/
│ │ └── x/
│ │ ├── fs/
│ │ │ ├── fs.mi
│ │ │ └── fs.core
│ │ └── internal/
│ │ └── ffi/
│ │ ├── ffi.core
│ │ └── ffi.mi
│ └── xingwangzhe/
│ └── files_tree/
│ ├── files_tree.core
│ └── files_tree.mi
└── doc/
├── index.html
└── xingwangzhe/
└── testmm/
├── cmd/
│ └── main/
│ ├── members.md
│ ├── resource.json
│ ├── main.mbt.html
│ └── package_data.json
├── members.md
├── resource.json
├── module_index.json
├── testmm.mbt.html
├── _sidebar.md
├── README.md
└── package_data.json

嘻嘻😁,还挺好玩的

中秋-来试试Moonbit吧

作者:xingwangzhe

本文链接:https://xingwangzhe.fun/posts/32faf407/

本文采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

Creative Commons

留言评论