- wasm 指令不支持 i8 和 i16,因此提议去掉这2类整型数
- 在函数内 去掉 var 关键字(只用于全局变量),保持和 struct 内风格一致
因为涉及不兼容修改,会提供过渡期方案。
大家先线上讨论(会议时间后面更新到这里),稍后我们会组织视频会议征询大家意见。
最并提报凹语言发展委员会投票决定。
因为涉及不兼容修改,会提供过渡期方案。
大家先线上讨论(会议时间后面更新到这里),稍后我们会组织视频会议征询大家意见。
最并提报凹语言发展委员会投票决定。
i8/i16 不建议删除,因为对接其他语言时会遇到这些基本类型。
var 简写可能和 label 有冲突:
// x: int
// x: int = 123
// END: int = 123
一个可能的思路是改造 label 语法
虽然大多数语言设计都内置基本类型,技术上是否可将基本数据类型提取到标准库而非内置于语言?语言规则可以更加简化?
Go语言中这些i8/i16基础类型其实就是在builtin包定义的,所以它们并非是关键字,所以语言本身已经减少了一些复杂性。
但是对于基础类型的四则运算,则一般是需要语言内置的,否则使用太复杂了
最近版本已经初步实现 var 可省略的语法:
多谢,才知道。那么像 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
}
对于i8、i16,可以考虑:
按照一些社区的玩法,应该是先做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的需求呢)……
所以个人觉得肯定不是一删了之这么简单的处理】