-
Notifications
You must be signed in to change notification settings - Fork 34
一个通用型的中文编程语言的语法设计
Xuan Wu edited this page Jan 9, 2018
·
4 revisions
此文在通用型的中文编程语言探讨之一: 高考的基础上继续细化和改进, 在未成型之前暂时不进行版本控制.
[一] 相对英文编程语言的直译, 语法应更接近中文自然语言语法, 并且包含的特殊符号尽量使用数学常用符号. 比如下面一种设想的语言(欢迎拍砖!), 与Python的二分查找对比.
- 选择{}作为函数体边界, 因为数学定义中常用左大括号(如下). 暂时没有想到比添上右大括号更合适的设计. 至于{}是否允许省略, 倾向于不允许, 以规避歧义. 另一种可能是类似日语编程语言"抚子" - 第三版特色初探, 不用{}而是使用关键词作为结束标志("直到这里"之类)
- 缩进量不改变语义, 仅为改进可读可选: 为避免意外的缩进错误导致的语义错误
- 用'为'替代==, 为避免误写为=导致的无心之失. 在数学中, =的相等意义与赋值更接近. 数学中>, <作为判断条件使用, 与代码中意义相同, 适合沿用. 至于'大/小于等于', '不等于', 个人倾向于直接用≥, ≤, ≠符号. 而不用>=, <=, !=. 至少搜狗还算容易打出, 虽然效率挺低. (后得知易语言IDE也会自动将>=格式化为≥)
- 避免//这种数学中没有的符号, 用'向下取整'是可读性优先于简短性
- 数组/列表下标用(), 因为它们其实是索引/下标的函数, 类似Scala设计
- [三] 是否用带空格设计, 个人认为不用强求(取决于技术可行性). 下面的语法如果不带空格, 也许会貌似自然语言而语法不够自然. 当然欢迎提出不带空格的示例程序!
- 断句是否用换行或者特殊符号, 个人倾向于避免引入额外符号
- 调用对象中的方法, 没有想到比"某实例.某方法(..)"之外的方案, 去掉"."分隔符同样会有不带空格设计类似问题, 从而间接添加了方法命名的限制
- 支持全/半角. 选择有, 开发环境在编辑源码时就对源码自动转换到一种格式, 或者编译时自动转换到一种格式. 个人现在感觉前者更能使源码格式统一, 但开发环境和编译器的耦合度恐怕更高. 易语言好像采用前者, 日语编程语言"抚子"-第三版实现初探好像采用后者.
- 不提供类似C或Java中
(xx类)
形式的类型强制转换. 一方面避免()
的滥用, 一方面增强可读性, 比如(xx类)y.z
的转换对象是y还是z不一目了然. 具体语法待定. - [三]语法糖: 复用区间的概念和符号. 比如:
如果 x 在 [1, 2]
等同于Python中:
if x >= 1 and x <= 2:
类似在循环中:
当 x 在 (1,2) {...}
等于Python中
while x > 1 and x < 2:
二分法示例代码:
定义 二分查找(数组, 目标) {
左索引 = 0
右索引 = 取长度(数组) - 1
位置 = -1
当 左索引 ≤ 右索引 且 位置 为 -1 {
中索引 = 向下取整((左索引 + 右索引) / 2)
如果 数组(中索引) 为 目标 {
位置 = 中索引
} 否则 {
如果 数组(中索引) > 目标 {
右索引 = 中索引 - 1
} 否则 {
左索引 = 中索引 + 1
}
}
}
返回 位置
}
与Python代码对比:
def binarySearch(array, key):
left = 0
right = len(array) - 1
res = -1
while left <= right and res == -1:
mid = (left + right) // 2
if array[mid] == key:
res = mid
else:
if array[mid] > key:
right = mid - 1
else:
left = mid + 1
return res