精華區beta Python 關於我們 聯絡資訊
之前有個中蟒計畫,不過已經停了很久,版本停在 2.1 另外還有個希伯來文的 hpython ,也可以找得到。但這些方式其實都有很多缺點。 (其實中蟒應該叫做蟒,而不是中蟒,就像 Python 也不是 English Python) 這裡提供另外一個方式,可以用在 python 2.5 之上, 因為我的一個計畫打算用類似 camlp4 的功能,但是我對 python 比較熟, 所以打算用 Python 試試看,順便處理了一下中文 Programming 當練習。 Python 本身欠缺語言擴充性的功能,本身的 Parser 也不能處理 unicode。 可以考慮的套件有 EasyExtend, Logix, 還有 PyPy ,但是我這裡打算自己 寫一個,簡單的轉換器。關於中文編譯訊息顯示的部份,應該用普通 L10n 來處理。 我們只處理程式碼的轉換。比較理想的是 AST 到 AST 的轉換,但是 python 的 parser 是 c 寫的。還好 python 有提供一個 tokenize 模組。雖然這個也不能處理 unicode,但是我們可以作下面一個簡單的 hack: # 不用這個hack 也行,把 tokenize.py 直接 copy 過來,然後修改 import re from token import * import tokenize tokenize.pseudoprog=re.compile(tokenize.Whitespace + tokenize.group(tokenize.PseudoExtras, tokenize.Number, tokenize.Funny, tokenize.ContStr, r"\w+"),re.UNICODE) # end of hack 這樣, unicode 的 token 會被看成是 operator 或 name。我們就能不用擔心 " , ' """ , \ 這些東西,很簡單的翻譯,然後組合成原始碼。這個部份跟 hpython 很像,不過他的程式碼寫了一大堆,而起跟中蟒一樣都寫死在程式裡。 我們其實只要用一個 translation_dict 就能翻譯了。 接下來問題是如果只跟 hpython 一樣,那也不行,所以我們還要改掉 import。這裡我是用 installer 的 iu.py 來處理。 我們先把 __builtin__.compile 換成我們的先翻譯再 compile 版本,再把 __import__ 換成 iu 的版本,因為 iu 裡面用到 compile,所以這時 import 進來的檔案也可以使用中文寫程式碼了。 當然我們也可以選擇把 eval 和 execfile 換成中文的版本。 不過還有更多的,我們還可以配合這個 http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/384122 自訂運算元,而且配合我們的翻譯器,可以自動把 translation_dict["<<op>>"]="op" 加入翻譯列表,這樣就可以不用那些 討厭的 << >>符號,變成真正可以自訂符號了。 exec 也可以換成中文的版本,不過這裡就要用到一點簡單的 parser 了。 如果加上複雜一點的 parser,那可以作一般性質的語言擴充。 所以技術上沒有什麼問題,主要的就是一些設計上得決定了。 如果是寫好一種語言延伸,然後一直用到底,那沒有什麼問題,但是如果 加入像是 ximport 這樣的語句,或者 # -*- extension: big5 -*- # -*- extension: set_operator -*- 這樣的東西,就要考慮一下整個設計了。比方語言的延伸是否可以被 import 或者 exec 傳下去等等。 這個也不會太難,但是比修改 python 本身的 source 要簡單多了。 不過我後來決定改用 nemerle 或 boo,所以這個東西就不弄了。 如果有興趣的人,可以照這個方式來弄,我可以提供弄一半的程式碼。 雖然這個東西本身不是很有用的東西,但是 python 和 turtle 配合起來, 似乎對於小朋友的程式學習有點用處,弄一套蟒+龜當成小學生的程式入門環境, 應該是還不錯的。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.115.200.35 ※ 編輯: weijr 來自: 59.115.200.35 (01/15 15:06)
huggie:中蟒計畫目的是什麼呀? 01/15 17:18
Baudelaire:跟丙正正一樣? XD 01/18 07:39
weijr:目的差不多,但這種沒用的東西,弄到要改 python source 01/18 11:28
weijr:有點小題大作。 01/18 11:30