木兰重生:更多 $ 的妙用,self 的拓展语义

2020年10月02日

本项目旨在重现「木兰」编程语言的语法和功能。所有例程演示的语法可以用原始的木兰可执行文件 ulang-0.2.2.exe 检验。如发现有异烦请告知,定将礼谢。

上篇演示了 $ 在木兰中的部分用途。在开源中国的木兰更新资讯评论区,有几位提出木兰和 PHP 中的 $ 用法有很大不同。

这几天基本重现了至今发现的 $ 在木兰中的语法功能,本文逐一介绍。以后有机会再尝试与 PHP 作对比。

木兰的 $ 与 self

木兰编程语言中, $ 的语义是 self。但木兰的 self 与 Python 相比有拓展含义。

多数情况下,$ 都可用对应的 self 语法代替。下面先介绍这部分语法。

1 self 可代替

1.1 类型之外

Python 中的 self 仅在类型中使用,木兰可在类型外使用。self() 返回当前线程(下面带 > 的是在木兰交互环境下运行的结果)。

> println(self())
<_MainThread(MainThread, started 140735684096896)>
> println(self().ident)
140735684096896 

$() 并不允许,因为单独的 $ 不是可识别的标识符。

可以如下定义与引用属于当前线程的变量,与全局变量不同:

> self.x = 1
> self.x
1
> x
(..•˘_˘•..) 请先定义'x'再使用位于第1行 

对应到 $ 的用法就是:

> $x = 1
1
> $x
1 

1.2 类型之内

上篇演示的用途,包括类型内变量与方法、单独使用,都可用 self 语法代替,而且 self 的语义与 Python 相同。本周复现了一个不能用 self 代替的语法,见下一部分。

2 self 不可代替

2.1 可用关键词命名变量

与 PHP 类似,带 $ 可以用关键词命名变量:

> $while = 4
> $while
4 

而用 self 则不允许:

> self.while = 3
(..•˘_˘•..) File "<STDIN>", line 1:6, unexpected token "WHILE"
self.while = 3
     ^
> self.while
(..•˘_˘•..) File "<STDIN>", line 1:6, unexpected token "WHILE"
self.while 

2.2 应变属性

应变属性(attr)相关语法对应 Python 中的 @property 和 setter。这里起名“应变属性”是因为 attribute 和 property 的含义区别很微妙,暂时未找到合适中文与类型内一般属性变量作区分,于是用功能特点命名。下图左边为木兰,右边为 Python 同功能代码,重点在三个 attr。这部分功能未发现可代替的 self 语法。

后感

作为未参与木兰原始设计的第三方,仅从复现出的功能很难完全领会设计意图。就个人感觉,木兰的 $ 相关语法设计简化了 Python 的 self 相关语法。对 self 的语义拓展虽然看似信手拈来但也有合理之处。是否对多线程有特别好处待研究。

请赐教。


附录:代码量统计

主要部分的代码行数统计,格式为:上次->现在。

  • 木兰代码量
    • 编辑器,包括实现与测试都是木兰代码:184
    • 木兰测试用例:2001 -> 2074
  • Python 代码量(包括测试部分):2338 -> 2379
    • 分析器/语法分析器.py:925 -> 953
    • 分析器/词法分析器.py:195 -> 198
    • 测试/运行所有.py,检验所有木兰测试代码片段:185
    • 环境.py,定义全局方法:150 -> 156
    • 分析器/语法成分.py,从语法分析器中提取出来的枚举常量:78 -> 79
    • 未变
      • 分析器/语法树.py:178
      • 交互.py,交互环境(REPL):138
      • 功用/反馈信息.py:49
      • 中.py,主程序:41
      • 分析器/错误.py:17
      • 测试/unittest/语法树.py,确保生成的语法树与原始版本一致:67
      • 测试/unittest/交互.py,交互环境相关测试:28
展开阅读全文
1 收藏
分享
加载中
精彩评论
木兰天天蹭热度,然而没人鸟的语言
2020-10-02 08:04
19
举报
请我怎么屏蔽这个新闻?
2020-10-02 08:51
17
举报
怎么拉黑木兰语言一切新闻@红薯
2020-10-02 16:47
9
举报
这语言的相关新闻怎么屏蔽@红薯
2020-10-03 07:05
5
举报
同求屏蔽这玩样
2020-10-02 09:22
5
举报
最新评论 (26)
~方法 ~整型 ~公共 获取苹果的数量(~字符串 苹果的颜色){
~整型 苹果的数量;
~如果(苹果的颜色=="红色"){
苹果的数量=3;
}~其他{
苹果的数量=5;
}
~返回 苹果的数量;
}

主函数(){
~整型 苹果的数量=获取苹果的数量("红色");
屏幕输出(苹果的数量);
}


还不如这样更直接
2020-10-09 10:08
0
回复
举报
我觉得用$不如用¥
2020-10-04 18:21
2
回复
举报
凑齐3P么?
2020-10-04 09:51
0
回复
举报
$ 这玩意是学PHP么?
2020-10-03 15:22
0
回复
举报
很多语言都有 $ 语法. 是不是学 php 原设计者更知道, 但你能找到其他更合适的符号吗? &*()^%!? 都有含义, 用#和@恐怕更怪吧?
2020-10-03 16:14
0
回复
举报
perl表示不服
2020-10-04 01:49
1
回复
举报
「木兰」编程语言有什么特色? - 知乎
https://www.zhihu.com/question/366509495
2020-10-03 09:32
1
回复
举报
早和你说过了, 这个知乎问题就是我问的. 贴个没完是几个意思?
2020-10-03 16:11
0
回复
举报
这语言的相关新闻怎么屏蔽@红薯
2020-10-03 07:05
5
回复
举报
不编程的领导们估计喜欢投钱到这个项目中去。
2020-10-03 03:19
0
回复
举报
有点好奇这个项目什么性质?和之前的套壳python有啥关系?
2020-10-03 00:08
0
回复
举报
文章第一句没看到?
2020-10-03 00:31
0
回复
举报
就是套壳,继续套壳
2020-10-03 09:16
0
回复
举报
世界上有两种语言,一种被黑的语言,一种没人用的语言,木兰全中了
2020-10-02 20:48
1
回复
举报
众所周知,我进来是看评论来的
2020-10-02 20:11
1
回复
举报
更多评论
26 评论
1 收藏
分享
返回顶部
顶部