凹语言语言调整建议:删除i8/i16/var

  • wasm 指令不支持 i8 和 i16,因此提议去掉这2类整型数
  • 在函数内 去掉 var 关键字(只用于全局变量),保持和 struct 内风格一致

因为涉及不兼容修改,会提供过渡期方案。

大家先线上讨论(会议时间后面更新到这里),稍后我们会组织视频会议征询大家意见。
最并提报凹语言发展委员会投票决定。

i8/i16 不建议删除,因为对接其他语言时会遇到这些基本类型。

var 简写可能和 label 有冲突:

// x: int
// x: int = 123
// END: int = 123

一个可能的思路是改造 label 语法

虽然大多数语言设计都内置基本类型,技术上是否可将基本数据类型提取到标准库而非内置于语言?语言规则可以更加简化?

Go语言中这些i8/i16基础类型其实就是在builtin包定义的,所以它们并非是关键字,所以语言本身已经减少了一些复杂性。
但是对于基础类型的四则运算,则一般是需要语言内置的,否则使用太复杂了

1 个赞

最近版本已经初步实现 var 可省略的语法:
image

多谢,才知道。那么像 bool int string 等也是在包中定义的?数值运算之外的如字符串加法 "aaa"+"bbb" 是语言还是包内实现的呢?

函数返回值还是用 =>吗?如 func add(a: i32, b: i32) => i32

另外,将 func 作为一种类型可行吗?如:

main: func = {
...
}

add: func(a: i32, b: i32 => i32) = {
...
}

这些类型和运算能力都是语言内置的,但是怎么样将这些类型绑定到i8/i16这些名字上是在 builtin 包完成的。

func 本来就是可以作为类型的:

func main {
	L0, L1: bool
	L: int = 123

	fnAdd: func(a, b: i32) => i32 = func(a, b: i32) => i32 {
		return a+b
	}
	fnAdd2: func(a, b: i32) => i32 = fnAdd

Loop:
	for 1 > 0 {
		println(L0, L1, L, fnAdd(1,2), fnAdd2(3,4))
		break Loop
	}
}

这里是否多粘贴了一段?是

    fnAdd: func(a, b: i32) => i32 = {
		return a+b
	}

还是

    fnAdd = func(a, b: i32) => i32 {
		return a+b
	}

?
另外,非函数内定义的函数包括main也可以这样定义吗?

冒号后面是类型,如果省略类型则变成赋值语句,或者是 := 语法

为何 func(a, b: i32) => i32 要重复两次呢?

	fnAdd: func(a, b: i32) => i32 = func(a, b: i32) => i32 {
		return a+b
	}

冒号和等于号之间的是类型,等号右边是闭包对象值。
可以省略类型,那是 := 的用法,不是 name :type 这种用法

群里提到“函数内局部变量定义和struct成员/函数参数/函数返回值保持统一”,请问其中“函数返回值”指的是?

func swap(a0, b0: i32) => (b1, a1: i32) {
    ax, bx: i32
    ax, bx = a0, b0
    a1, b1 = bx, ax
    return
}
1 个赞

对于i8、i16,可以考虑:

  1. 打印警告:wasm不支持i8与i16,已自动转换为i32
  2. 彻底删除,并在编译时提示wasm不支持i8与i16,需要用户把类型转换成i32

按照一些社区的玩法,应该是先做1,并标记为几个版本后删除,等版本到了就做2

删除可能只是早期临时方案。因为目前并无真实用户,没有渐进过渡的需求,所以采用简单处理

一些不准确说法,js、wasm、llvm(部分的)这些“新语言”现在的状态其实都有点像,大概内味,就是单个的变量的运算都倾向于只做i32 i64 f32 f64了,但是数组(甚至simd向量类型)上,u8 i8数组还是硬需求的,字节存取总是要的,js就专门加特化的Uint8Array甚至Uint8ClampedArray。甚至考虑gpu说不定会有f16数组,llvm还支持了bf16等等。
如果语法上不准备做像js那样焊死的特化版名称,那可能还是得保留i8 i16,数组才能表示。
可以迫害单个变量,但就要考虑常态化的用大变量存进小格子怎么处理的问题(clamp就是一例,实际上比如处理音频,32存16也有Int16Clamp的需求呢)……
所以个人觉得肯定不是一删了之这么简单的处理】

2 个赞