標籤:

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同理。

所以現在實現思路是兩個:

  1. 第一個,模式匹配用語句,也就是今天實現的這個,雖然現在只比java的switch的功能強一些;
  2. 第二個,

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語言,有什麼好的建議或方法嗎?

TAG:Python | CC |