博尔戈编程语言

主要观点、关键信息和重要细节总结:

  • Intro:Borgo 是编译为 Go 的新编程语言,通过README可了解其特征和本地运行编译器的指令,此 playground 运行编译器为 wasm 二进制并将转译的 Go 输出发送到官方 Go playground 执行,如enum NetworkState<T>等代码示例展示了其基本语法。
  • Primitive Types:与 Go 中的原始类型相同,集合可不用指定值类型,如 Go 中[]int{1,2,3},Borgo 可写[1, 2, 3],函数append()len()可作为方法使用,Maps 用Map.new()初始化,Borgo 有元组且多行字符串定义方式特殊。
  • Control flow:可迭代的只有切片、映射、通道和字符串,循环总是遍历单个值(与 Go 中使用单个迭代变量获取元素索引不同),遍历(index, element)对调用.enumerate()方法,遍历映射时应使用(key, value)解构,无限循环用loop {},有条件循环用while {}ifmatch和代码块表达式返回值可赋值给变量。
  • Algebraic data types and pattern matching:用enum关键字定义代数数据类型,模式匹配必须详尽,目前变体只能定义为元组,如IpAddrCoin的示例。
  • Structs:定义和实例化结构体类似 Rust,与 Go 不同的是所有结构体字段都必须初始化,如PersonHobby的结构体示例。
  • Result and OptionOption<T>用于处理可能不存在的值,Result<T, E>用于返回值或错误,unwrap()操作不安全可能导致 panic,目前ResultOption的很多方法缺失,欢迎贡献到 stdlib。
  • Interoperability with Go:目标是与现有 Go 生态系统完全兼容,通过OptionResult类型自动处理 Go 函数返回多个值的情况,以 Go 函数的返回类型为例说明转换方式,如os.LookupEnvos.Stat函数。
  • Package definitions:使用现有 Go 包需在声明文件中定义,目前只有一小部分 Go stdlib 可在 Borgo 中使用,编译器有importer工具可解析 Go 包生成相应绑定,如regexp包的示例。
  • Pointers and References:指针和引用工作方式与 Go 相同,解引用用foo.*,如FooBar的结构体示例。
  • Methods:用impl {}块定义类型的方法,Go 中方法接收器需在每个函数声明中指定,Borgo 只需在impl块开头指定一次,也可声明静态方法。
  • Interfaces:接口工作方式与 Go 相同,为鸭式类型,支持嵌入接口,如geometry接口和rectcircle结构体的示例。
  • Error handling:在返回Result的函数中可用?运算符传播错误,类似 Rust,目前?运算符仅适用于Result,将扩展到Option
  • Zero values and nil:Borgo 中不能创建nil值,现代语言倾向于用Option<T>代替null引用,调用现有 Go 代码可能出现空指针,可通过写更好的绑定将返回空指针的函数改为返回Option<*T>,Borgo 要求所有值显式初始化,可使用zeroValue()获取类型的零值。
  • Concurrency (goroutines):支持 Go 中的所有并发原语,用spawn关键字启动协程,参数为函数调用,如Counter的示例。
  • Channels:创建Sender<T>Receiver<T>Channel.new(),分别用于发送和接收值,大致相当于 Go 中的发送和接收通道,设计受 Rust 标准库启发。
  • Select statementsselect {}工作方式类似 Go,但语法略有不同,如读取和发送通道的语法差异,以及默认情况的语法。
阅读 5
0 条评论