【專案開源在 Gitee:木蘭程式語言/mulan-rework】
前幾天在用木蘭寫 同步多個 git 倉庫的指令碼 時,碰到個熟悉的報錯: TypeError:'NoneType' object is not subscriptable。於是照例試圖將此報錯新增到 之前的測試用例。
先試了 print(nil[0]),報語法錯誤,暫不深究,改為如下:
a = nilprint(a[0])
如期報錯。
如果 true 值,類似報錯:TypeError:'bool' object is not subscriptable
再試了整數型別:
a = 1print(a[0])
如期報類似錯:TypeError:'int' object is not subscriptable。
順便一試 print(1[0]),結果,輸出了 [0]!
@_@ 咋回事??
一時沒頭緒,照例看它生成的 Python 語法樹:
【略】 args=[BinOp( left=Num( n=1 lineno=1 col_offset=7 ) op=Mult() <---- 乘法 right=List( elts=[Num( n=0 lineno=1 col_offset=9【略】
這才想起半年前發現木蘭對 省略乘號的乘法支援,自然也適用於整數與陣列、字串的乘法。在木蘭互動環境演示如下:
> 長=4;寬=3> 4長 + 3寬25> 2[0][0, 0]> 3"鵝"鵝鵝鵝
回頭看此語法,僅當數在表示式前時成立,似乎沒什麼不妥。但對比下面這兩個用法,就覺得有些彆扭。
> a=1> a[0] TypeError:'int' object is not subscriptable,見第1行> 1[0][0]
對比 Python 下的行為,看著就比較“一致”:
>>> a=1>>> a[0]Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: 'int' object is not subscriptable>>> 1[0]Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: 'int' object is not subscriptable
空值和布林值也是類似。
感覺木蘭似乎在這點上是違反了一個“潛規則”(請教相關程式語言術語是什麼呢?):表示式中的變數可以替換為一個常量,而且得到的反饋應與變數為此值時相同。比方 a=3; b=4; a*3+b*4 與 3*3+4*4 兩個表示式的結果相同。
木蘭選擇支援更接近數學表示式的效果,比如 3a+4b,但用過其他程式語言的使用者就需要克服“思維慣性”來適應。算是有舍有得的一個例子吧。