上篇演示了 $ 在木兰中的部分用场。在开源中国的木兰更新资讯评论区,有几位提出木兰和 PHP 中的 $ 用法有很大不同。
这几天基本重现了至今创造的 $ 在木兰中的语法功能,本文逐一先容。往后有机会再考试测验与 PHP 为难刁难比。
木兰编程措辞中, $ 的语义是 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.x1> x(..•˘_˘•..) 请先定义'x'再利用位于第1行
对应到 $ 的用法便是:
> $x = 11> $x1
1.2 类型之内
上篇演示的用场,包括类型内变量与方法、单独利用,都可用 self 语法代替,而且 self 的语义与 Python 相同。本周复现了一个不能用 self 代替的语法,见下一部分。
2 self 不可代替2.1 可用关键词命名变量与 PHP 类似,带 $ 可以用关键词命名变量:
> $while = 4> $while4
而用 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 -> 2074Python 代码量(包括测试部分):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