从 JSX 转过来一些写法, 对一些新增的语法还不够熟悉, 想看看已有的这个 JSX 的 DSL 能不能简化一些,
现在参考 TypeScript Rust 想到一些功能应该可能帮助简化写法, 不知道 Moonbit 有什么好的替代方式:
- variadic argument
- 引用模块直接 import 函数
- 类似 Rust 的
if let Some(x) = y {}
let f = fn (e: _, d: _) {}
从后面代码使用的类型, 反过来自动推断e
和d
从 JSX 转过来一些写法, 对一些新增的语法还不够熟悉, 想看看已有的这个 JSX 的 DSL 能不能简化一些,
现在参考 TypeScript Rust 想到一些功能应该可能帮助简化写法, 不知道 Moonbit 有什么好的替代方式:
if let Some(x) = y {}
let f = fn (e: _, d: _) {}
从后面代码使用的类型, 反过来自动推断 e
和 d
- 引用模块直接 import 函数
这个我们正在考虑了,可能需要再经过一些实际使用场景的测试和评估
- variadic argument
刚刚在群里看到了,如果只是允许同一个类型的参数的话,做一个这样的语法糖是可以的:
fn format_print[A : Show](format : String, args : Array[A]) -> Unit
fn main {
format_print("key: %, value: %", key, value)
}
这个需求我们会创建一个内部的issue讨论
- 类似 Rust 的
if let Some(x) = y {}
可以如果不是需要写if let ... {} else {}
这种表达式的话,可以直接使用guard let?
这个DSL应该是不能再简化了,如果不在乎包装代码重复的话,也可以考虑把attr里的所有field都展开为labelled argument放在function的参数里,使用这部分API的时候会省心一点。类似这种:
guard let Some(PlainText(text)) = resources[path] else {
None => fail!("\{path} not found")
Some(Folder(_)) => fail!("\{path} is a folder")
Some(JsonConfig(_)) => fail!("\{path} is a json config")
}
没注意到 guard 的 else 分支实际上是 match, 这里边能解构出参数的话我可以试试. 有参数就是够用的. 要简短的话我觉得 if let 还是更直观一些.