flowpy添加switch語句支持
如題圖。
前幾天盡翻譯某遊戲去了,然而漢化組動作快到令人窒息,於是我今天又來寫flowpy了。
模式匹配的話,我個人認為表達式比語句更好,但是在實現上有點小問題...
當然也不是不能實現,但是我現在只能保證用包含結尾標識符(例如end)的語句塊來表示多行表達式,比如下面這樣。
expr match:n case xxx:n ...n case xxx:n ...n otherwise:n ...nendn
這個和python的代碼風格差得有點遠, 在python的語法里, 其他結構的句子都是沒有結尾標誌的,直接使用縮進回退(DEDENT)標識符進行語句分割。
我們當然也可以用DEDENT來結束一個模式匹配表達式,但是啊,這個實現起來挺累的...而且需要改變python原生的語法。
事情是這樣的。
CPython中,已經把表達式規定為simple statement這個語法單元的一個子單元了,而simple statement結尾里已經有一個NEWLINE, 使用DEDENT結尾前肯定要換行,所以
simple_stmt: ... NEWLINE #省略的...中包含一個exprnpm_expr: ... NEWLINE DEDENTn
所以調用模式匹配表達式結尾是這樣的
NEWLINE DEDENT NEWLINEn
然後這東西可以讓你的解釋器崩潰,因為需要換兩行,而你打開python解釋器輸入任何語句,會發現解釋器只可能給你在結尾放一行的空白,作為複雜語句例如def, if, with的結束。
所以呢,使用DEDENT作為模式匹配句結尾,需要修改simple statement的結構。我做過一些嘗試,都不太好看。
而且就算實現了,兩個模式匹配表達式做運算也會非常醜陋。
expr1 match:n ...n+ expr match:n ...n
不知道你看不看得下去,我是看不下去。加end同理。
所以現在實現思路是兩個:
- 第一個,模式匹配用語句,也就是今天實現的這個,雖然現在只比java的switch的功能強一些;
- 第二個,
expr match matcher1 + expr match matcher2 where:n def matcher mathcher1 as :n case xxx:n ...n ...n def matcher matcher2 as :n ...n
我覺得挺好看的...(其實這是我寫文章時臨時想到的語法2333,明天開始寫這個
對於今天的switch語句就這些了...
關於windows編譯flowpy
用Visual Studio, 編譯速度飛快... 2017用起來很贊...
首先你需要用make重製語法(我不知道怎麼用VS來做configure和make,如果有知道的好心人請告訴我一下,謝謝...)。
然後進入PythonDist目錄
./configurenmake regen-grammarnmake regen-astn
然後用VS打開PCBuild文件夾下pcbuild.proj
然後(可選: 把debug改成release, 把x32改成x64) 生成解決方案...
然後好了...
關於在實際項目中使用flowpy
昨天我真的這麼幹了,在win7虛擬機中的Anaconda最新發行版中里用flowpy。
其實flowpy只是讓你可以用更多的方式生成python位元組碼而已。
- 在windows下,我們只需要用編譯好的flowpy中某些文件替換任意cpython發行版的相應文件就好了。這四個文件如下,可以在PCBuild中一個子文件夾里找到,我的位置是PCBuild/amd。
python3.dllnpython36.dllnpython.exenpythonw.exen
- Linux下,等我明天試試再說。
關於預編譯版本
等我把重要的特性都寫完了,把關鍵字和第三方庫以及標準庫的衝突都解決了,再放上來吧。
推薦閱讀:
※C++中為什麼派生類中只有基本類型時,delete一個指向派生類的基類指針時卻沒有內存泄漏?
※全局指針變數指向棧上的對象的問題?
※關於c++模板推導失敗,這是編譯器的bug嗎?
※自學c語言,有什麼好的建議或方法嗎?