首頁>技術>

【專案開源在 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,但用過其他程式語言的使用者就需要克服“思維慣性”來適應。算是有舍有得的一個例子吧。

14
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • kafka和websocket實時資料推送