中秋-来试试Moonbit吧
大家中秋🎑快乐啊
什么是Moonbit
Moonbit是国产的一门编程语言,它很年轻,预计26年左右发布1.0版本
特点:
- 支持函数式和面向对象等多种编程范式,兼具动态灵活与安全高效
- 实用的类型系统,面向数据的语言设计,让任何背景的开发者迅速上手
- 支持WebAssembly、JavaScript等多后端,应用场景广阔
简单做个包,并试试
Moonbit的名字来源于月兔,同理,它的包也叫 MoonCake ,也就是月饼,虽然我不怎么爱吃月饼,但是我还是愿意做个Mooncake包的
这个包依赖官方的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 为基准。
测试结果
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}"); }}
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吧
本文链接: https://xingwangzhe.fun/posts/32faf407
本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
留言评论