类似 JSX 的 DSL 有没有什么简化的语法

从 JSX 转过来一些写法, 对一些新增的语法还不够熟悉, 想看看已有的这个 JSX 的 DSL 能不能简化一些,

现在参考 TypeScript Rust 想到一些功能应该可能帮助简化写法, 不知道 Moonbit 有什么好的替代方式:

  • variadic argument
  • 引用模块直接 import 函数
  • 类似 Rust 的 if let Some(x) = y {}
  • let f = fn (e: _, d: _) {} 从后面代码使用的类型, 反过来自动推断 ed
  • 引用模块直接 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?

1 个赞

这个DSL应该是不能再简化了,如果不在乎包装代码重复的话,也可以考虑把attr里的所有field都展开为labelled argument放在function的参数里,使用这部分API的时候会省心一点。类似这种:

1 个赞
  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 还是更直观一些.