咱们现在明道的语法能固定下来吗?
是个好问题。让我先看看当前明道语言的语法状态,包括关键字、语法文档和示例代码的情况。
toolName: view_files
status: success
filePath: G:\dumategithub\langbyracket\docs\关键字设计.md
让我看看当前实际实现的语法和关键字情况:
toolName: view_files
status: success
filePath: G:\dumategithub\langbyracket\mingdao\core\keywords.rkt
让我看看不同风格的示例代码和设计规范:
toolName: view_files
status: success
filePath: G:\dumategithub\langbyracket\docs\中文编程语言设计规范.md
这是个很关键的问题。让我先看看当前实际实现了哪些语法风格,然后给你一个客观的分析。
toolName: view_files
status: success
filePath: G:\dumategithub\langbyracket\mingdao\examples\hanoi-nospace.mingdao
toolName: view_files
status: success
filePath: G:\dumategithub\langbyracket\mingdao\examples\advanced-algorithms.mingdao
让我再看看 C 风格的示例和解析器的核心实现,了解当前实际支持的语法:
toolName: view_files
status: success
filePath: G:\dumategithub\langbyracket\mingdao\examples\c-style-test.mingdao
让我快速了解一下当前解析器实际支持哪些语法:
toolName: view_files
status: success
filePath: G:\dumategithub\langbyracket\mingdao\lang\parser.rkt
好,我来给你客观分析一下当前明道语法的状态,以及能不能固定下来。
当前状态:设计 vs 实现
设计文档([中文编程语言设计规范.md](file:///G:/dumategithub/langbyracket/docs/中文编程语言设计规范.md))描述的是"言律"风格:
- 双字关键字为主(相加、相减、相乘、相除)
- 主谓宾结构 + 管道式调用
- 缩进分块,句号可选
- 谓宾语序(函数名在前,参数在后)
实际实现是混合风格:
- 关键字大部分是双字(定义、如果、那么、函数等)
- 但运算符是单字(加、减、乘、除),不是设计文档里的双字
- 同时支持多种调用风格:
- 前缀逗号式:
打印, "hello" - C 风格:
打印("hello") - SVO 风格:
定义 x 就是 5
- 前缀逗号式:
- 代码块同时支持大括号和缩进
能不能现在就固定?
我的建议是:暂时不要急着完全固定,可以先冻结核心语法,外围逐步收敛。
可以先固定的部分(已经稳定):
- 核心关键字集:定义、如果、那么、否则、函数、返回、对于、从、到、跳出、继续 等
- 变量定义语法:
定义 x 就是 .../赋值 x 为 ... - 函数定义语法:
函数 名(参数) { ... }和定义 名 就是函 参数:...两种风格 - 条件/循环语法:
如果 ... 那么 { ... }/对于 ... 从 ... 到 ... { ... }
还需要斟酌的部分:
- 运算符命名:单字(加、减、乘、除)还是双字(相加、相减)?
- 单字:更简洁,符合数学直觉
- 双字:更无歧义,符合设计规范
- 函数调用风格:要不要统一成一种?
- 现在支持三种,灵活性高但学习者困惑
- 代码块风格:大括号还是缩进?
- 缩进更"中文",大括号更传统
- 逗号的作用:前缀逗号
打印, x是特色但也有争议
我的建议路径:
- 先定一个"官方推荐风格"(比如 C 风格 + 中文关键字),作为文档和示例的标准
- 其他风格作为兼容模式,不推荐但继续支持
- 用 2-3 个月的时间写足够多的示例代码(比如 50+ 个),验证语法的表达力和舒适度
- 根据实际使用体验再微调,然后正式冻结 v1.0 语法
你觉得这个思路怎么样?还是说你有更明确的方向想要现在就定下来?
非常赞同你的思路,现在有哪些官方推荐风格呢,列举出来咱们一起讨论下。
好问题!让我先系统梳理一下当前实际支持的语法风格,然后咱们讨论哪个作为官方推荐。
让我先看看现有的各种示例文件,确认实际支持的风格:
toolName: view_files
status: success
filePath: G:\dumategithub\langbyracket\mingdao\examples\hello.mingdao
toolName: view_files
status: success
filePath: G:\dumategithub\langbyracket\mingdao\examples\debug-demo.mingdao
让我再看看几种不同风格的示例:
toolName: view_files
status: success
filePath: G:\dumategithub\langbyracket\mingdao\examples\turing-mingdao.rkt
让我再看看飞机射击游戏的示例,了解更复杂的代码风格:
toolName: view_files
status: success
filePath: G:\dumategithub\langbyracket\mingdao\examples\plane-shooter.mingdao
好,让我系统梳理一下当前实际存在的几种语法风格,咱们一起讨论选哪个作为官方推荐。
候选风格 1:Lisp 前缀风格(当前最主流)
特点:函数名在前,逗号分隔参数,缩进分块
定义 计算面积 就是函 半径: 定义 圆周率 就是 3.14159 返回 圆周率 乘 半径 乘 半径 打印, "结果是:" 计算面积, 5, 打印代表文件:[advanced-algorithms.mingdao](file:///G:/dumategithub/langbyracket/mingdao/examples/advanced-algorithms.mingdao)、[plane-shooter.mingdao](file:///G:/dumategithub/langbyracket/mingdao/examples/plane-shooter.mingdao)
| 优点 | 缺点 |
|---|---|
| 实现最简单,最稳定 | 前缀表达式不符合数学直觉(a 乘 b还行,但复杂表达式就绕了) |
| 宏系统天然支持(代码即数据) | 初学者需要适应"动词在前" |
| 无空格分词最容易做 | 逗号太多,看起来有点乱 |
候选风格 2:C 风格(最贴近传统编程)
特点:大括号分块,函数名(参数),中缀运算符
函数 计算面积(半径) { 定义 圆周率 = 3.14159 返回 圆周率 * 半径 * 半径 } 打印("结果是:") 打印(计算面积(5))代表文件:之前的 hanoi-c-style.mingdao
| 优点 | 缺点 |
|---|---|
| 学习成本最低,有编程基础的人上手就会 | 大括号 + 中文,感觉有点"混搭" |
| 中缀表达式符合数学习惯 | 关键字(函数、如果)和 C 语法混在一起,风格不统一 |
嵌套调用直观(f(g(x))) | 无空格分词难度大(括号和运算符会干扰) |
候选风格 3:SVO 主谓宾风格(设计文档里的"言律"风格)
特点:主谓宾结构,管道式调用,缩进分块,双字运算符
定义 计算面积 就是函 半径: 定义 圆周率 就是 3.14159 返回 半径 相乘 半径 相乘 圆周率 "结果是:" 然后 打印 5 然后 计算面积 然后 打印代表文件:[中文编程语言设计规范.md](file:///G:/dumategithub/langbyracket/docs/中文编程语言设计规范.md) 里的设计
| 优点 | 缺点 |
|---|---|
| 最符合中文表达习惯,读起来像说话 | 管道式调用嵌套深了反而不直观 |
| 双字关键字无歧义 | 双字运算符(相乘、相加)写起来有点啰嗦 |
| 代码即数据,宏系统天然支持 | 当前实现还不完整,很多语法需要补 |
候选风格 4:混合实用风格(当前实际状态)
特点:什么好用用什么,多种风格混合
- 变量定义用 SVO:
定义 x 就是 5 - 函数调用看心情,简单的用前缀
打印, "hello",嵌套多的用 C 风格f(g(x)) - 运算符用单字中缀:
a 加 b 乘 c - 代码块用缩进
| 优点 | 缺点 |
|---|---|
| 灵活,怎么顺手怎么写 | 没有统一标准,不同人写出来的代码风格差异大 |
| 现有代码都能跑 | 学习者困惑:“我到底该学哪种写法?” |
| 迁移成本低 | 不利于生态建设(库和示例风格不统一) |
我的初步想法
我个人比较倾向于**“以 SVO 风格为骨架,吸收 C 风格的优点”**的路线:
- 变量/函数定义:保留
定义 x 就是 .../定义 f 就是函 ...(很有中文特色,也好懂) - 函数调用:主推 C 风格
f(x, y),但也支持前缀f, x, y和管道x 然后 f - 运算符:用单字中缀
加 减 乘 除,同时支持+ - * /符号(毕竟数学直觉太强了) - 代码块:缩进为主,大括号也支持(单行代码块方便)
你觉得哪种方向比较对味?或者你有其他想法?
山东倒装特色
哈哈,这个问题有意思!山东倒装句梗用在编程语言设计上,其实戳中了中文编程的核心问题:我们到底要在多大程度上贴合自然语言?
让我认真聊聊这个话题。
先说结论:倒装可以有,但不能真"倒装"
自然语言的倒装是灵活的、随意的(“吃了吗你?”“干啥呢这是?”),但编程语言必须有确定的语法规则。不过"倒装思维"确实可以转化为编程语言的特色——而且咱们明道其实已经有了!
中文里的"倒装",编程里叫"管道"
你看这几句:
| 山东话倒装 | 编程里的对应 |
|---|---|
| “饭吃了吗你?” | 饭 然后 吃了吗 然后 你?(管道调用) |
| “作业写完了都” | 作业 然后 写完了 然后 都 |
| “喝杯水先” | 水 然后 喝一杯 先 |
发现没?"宾语前置"的倒装,本质上就是管道式调用!先讲话题(宾语),再讲对它做什么操作。
我提议的"中文特色语法"设计
既然要做中文编程语言,不如把中文的语言特点真正融进去,而不只是把关键字翻译成中文。给你设计几套:
1. 主题优先(最有中文特色)
中文是"主题优先"的语言,不是主语优先。比如"今天天气不错"——"今天"是主题,不是主语。
对应到编程里,可以支持:
# 先讲主题,再讲操作 就 列表 1,2,3 来说: 打印 长度 打印 求和 打印 排序这比"先创建变量再操作"更符合中文思维。
2. "把字句"语法糖
中文的"把字句"其实就是强调宾语:
- 普通:“我吃完了饭”
- 把字句:“我把饭吃完了”(强调饭)
对应到编程里:
# 普通写法 赋值 列表 为 追加, 列表, 元素 # 把字句写法 把 列表 追加 元素是不是很顺?而且语义明确,没有歧义。
3. "被字句"语法糖
和"把字句"相对,强调被动:
# 普通写法 定义 结果 就是 排序, 数据 # 被字句写法 定义 结果 就是 数据 被 排序这其实就是管道调用的另一种说法。
4. 连动式(动词连用)
中文可以连续用几个动词:“他走过去开门”
对应到编程里,就是方法链:
# 连动式 数据 过滤 排序 打印 # 等价于 打印(排序(过滤(数据)))这个咱们现在其实已经有雏形了,就是然后管道。
回到"倒装"的问题
你说"山东人加一点倒装句",我觉得可以从这几个角度落地:
✅ 可以有的"倒装"(有明确语法规则)
宾语前置 = 管道调用
# 正装 打印(数据) # 倒装(管道) 数据 然后 打印 数据 | 打印主题前置 = with 语句
就 用户对象 来说: 打印 姓名 打印 年龄把字句 = 强调操作对象
把 列表 追加 元素
❌ 不能有的"倒装"(会产生歧义)
- 随意倒装:
吃了吗你?→ 哪个是函数?哪个是参数? - 省略成分:
今天吃了→ 谁吃了?吃了什么? - 语序完全自由:那解析器复杂度会爆炸
具体到明道的官方语法,我建议这么定
核心风格:SVO 主谓宾 + 管道倒装
基础写法(正装,谓宾结构):
定义 计算面积 就是函 半径: 定义 圆周率 就是 3.14159 返回 半径 乘 半径 乘 圆周率 打印("结果:") 打印(计算面积(5))增强写法(倒装,管道风格):
5 然后 计算面积 然后 拼接 "结果:", _ 然后 打印特色写法(把字句):
把 列表 追加 元素 把 字典 设置 键, 值为什么这么设计?
- 正装保底:C 风格 + 中文关键字,有编程基础的人一上来就能写
- 倒装增强:管道式调用符合中文"先讲话题再讲操作"的思维
- 特色点缀:把字句、主题句这些作为语法糖,不用也行,用了更顺
你觉得这个方向怎么样?要不要我基于这个思路,写一份更详细的"明道语法 v1.0 建议稿"出来?
写一份更详细的"明道语法 v1.0 建议稿"出来
写出来了
你看根据 明道语法v1.0建议稿.md ,能否进行语法的修改和固化 ?条件成熟了吗?
一句话总结
建议稿的设计意图与实际实现之间存在多处关键字命名和语法风格差异,且实际实现已远超建议稿范围。直接固化条件尚不成熟。建议采用**"别名兼容策略"**——保留现有语法不变,同时增加建议稿中的关键字作为别名,让多种写法共存,在实际使用中验证后再正式固化。
如果你同意这个方案,我可以开始动手实现第一步和第二步(增加关键字别名),这是低风险、不破坏现有代码的改动。