作者weijr (Beware of the Monkey)
看板Python
标题[心得] 中文 Python
时间Mon Jan 15 15:01:50 2007
之前有个中蟒计画,不过已经停了很久,版本停在 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)
1F:推 huggie:中蟒计画目的是什麽呀? 01/15 17:18
2F:推 Baudelaire:跟丙正正一样? XD 01/18 07:39
3F:推 weijr:目的差不多,但这种没用的东西,弄到要改 python source 01/18 11:28
4F:→ weijr:有点小题大作。 01/18 11:30