懒得看文章直接找repo的话点这里

前言

最近想到了文言文编程这个脑洞,正好又看到Haskell里面有Parsec这个包,然后就决定试一下了orz

所以打算从最简单的开始入手,也就是将有一定格式的文言文翻译成Python的代码,比如像下面这个(插入排序):

有略名 排序 其参名 数列 其文曰

凡 巡 之于 数数自 1 至 求长于 数列 之中 所得之数 是也 为

媒 者 数列 诸 巡 位之数 也

今 者 巡 减 1 也

复为之,方 今 非小于 0 与 媒 小于 数列 诸 今 位之数 乃止

数列 诸 今 加 1 所得之数 位之数 换作 数列 诸 今 位之数

今 谪 1 也

数列 诸 今 加 1 位之数 换作 媒 也

可以看到整体的样式是和Python的代码是一致的,这样的话可以减少我们写的解释器的工作量,但缺点的话,很明显,并不像自然语言。。。

一开始看上去很简单

首先我们来看看Text.ParserCombinators.Parsec这一Package,它可以将一大段文字的每一行和每一个单词提取出来建成一个二维数组,这歌其实和

parse :: String -> [[String]]

parse x = map words $ lines x

这样的一段代码差不多,不过有一个区别就是Parsec里面的parse会把每一个空格也记录起来,这样我们家可以写出这样的一个函数将输入的内容分成每一个词:

wyFile = endBy line eol

line = sepBy cell (char ' ')

cell = many (noneOf " \n")

eol = char '\n'

-- convert to single word

parseTo :: String -> Either ParseError [[String]]

parseTo = parse wyFile "(unknown)"

然后我们要建立一个文言文和Python代码之间对应的一个表,这个在Words.hs里面,简单来说就是一个tuple的数组而已(像下面这个)

keywords :: [(String, String)]

keywords =

[

("者", "="),

("今乃", "="),

("换作", "="),

("也", " ")

-- etc

]

然后我们要做的就是写一个将识别到的文言指令替换成Python代码的函数:

-- replace Wenyan sytax with Python syntax

replace :: (Eq a) => a -> [(a, a)] -> a

replace x ((a, b):ys)

| x == a = b

| x /= a && ys /= [] = replace x ys

| otherwise = x

replaceList :: (Eq a) => [a] -> [(a, a)] -> [a]

replaceList [] _ = []

replaceList xs ys = map (`replace` ys) xs

这段代码也不难理解,简单来说就是历尽里面的每一个词语然后将符合的词进行替换。

最后我们只要将这个List转换回有格式的String再输出就可以了

-- convert back to normal format

parseBack :: [[String]] -> String

parseBack x = unlines $ map unwords x

但是事实并非如此

因为Python并不支持中文的变量名和函数名,所以我们还要进一步操作。

首先是变量名, 因为Python定义变量并不需要在前面加上如let之类的,所以一个折中的办法就是让写代码的人先在一行提前声明之后需要用到的中文变量名,也就是所提到的:有参者 <...>这个语句。寻找这个语句的方式其实也是历遍。。。

findVar :: [[String]] -> [String]

findVar (x:xs)

| null x = findVar xs

| head x == varkey = tail x

| otherwise = findVar xs

transVar :: [String] -> [(String,String)]

transVar [] = []

transVar (x:xs) = let l = length xs in (x, "var" ++ show l) : transVar xs

接下来便是将中文的变量名转换成英文,我选择的办法是数出有多少个变量然后统一以var为开头命名,后面加上编号。

同样会遇到问题的就是函数和类的命名,这里的话方法也是类似的,感兴趣的话可以参考一下源代码这里就不展示了。

到了这里整个程序基本上是写完了的。

最后翻译出来长这个样子:

def fun0 ( var4 ):

for var3 in range( 1 , len( var4 ) ) :

var2 = var4 [ var3 ]

var1 = var3 - 1

while var1 >= 0 and var2 < var4 [ var1 ] :

var4 [ var1 + 1 ] = var4 [ var1 ]

var1 -= 1

var4 [ var1 + 1 ] = var2

结语

总的来说整个程序要的思路其实并不难,加上Haskell的Higher Order Function这一个利器,整个主程序的代码才80行不到XD

当然这个程序还是存在相当多的不足,像是只是支持很少的函数,以及非常多不符合自然语言习惯的内容。不过最麻烦的还是缩进,这个在未来的版本肯定是要去掉的!

python怎么读单词和古文,用文言文写Python相关推荐

  1. python怎么读单词和古文,Albino Python是什么意思

    1. A landlord in Florida got quite a shock when she opened a closet of her rental property, a gigant ...

  2. python 脑洞_从说韩语到写Python,这个数据媛的脑洞有毒吧

    你好,Hello,안녕하세요, こんにちは,我是会说四门语言,但是日语可以忽略,韩语也差不多已经忘记,转而写R和Python的语言学迷妹聂大哥. 我要说的脑洞有毒的数据媛就是我计己,哈哈.正式入坑数据 ...

  3. 零基础学python爬虫-我是如何零基础开始能写Python爬虫的

    刚开始接触爬虫的时候,简直惊为天人,十几行代码,就可以将无数网页的信息全部获取下来,自动选取网页元素,自动整理成结构化的文件. 利用这些数据,可以做很多领域的分析.市场调研,获得很多有价值的信息.这种 ...

  4. python网络爬虫教程-教你从零开始学会写 Python 爬虫

    原标题:教你从零开始学会写 Python 爬虫 写爬虫总是非常吸引IT学习者,毕竟光听起来就很酷炫极客,我也知道很多人学完基础知识之后,第一个项目开发就是自己写一个爬虫玩玩. 其实懂了之后,写个爬虫脚 ...

  5. python安卓版汉化版-手机随时随地写Python,还可以开发安卓APP,太厉害了!

    python, 近五年最为火爆的编程语言,语法优雅,类库丰富,一行代码即可完成 Java 十行代码量. 本次,舞剑来推荐一款手机端使用 Python 的APP. QPython QPython是安卓上 ...

  6. python response重头开始_你必须学写 Python 装饰器的五个理由

    你必须学写Python装饰器的五个理由 ----装饰器能对你所写的代码产生极大的正面作用 作者:Aaron Maxwell,2016年5月5日 Python装饰器是很容易使用的.任何一个会写Pytho ...

  7. python html做界面_用Html来写Python桌面软件的UI界面-htmlPy

    在写Python软件的时候,一般用命令行就行了,但是某些特殊情况下(主管要求),需要写一个还能看的界面提供给客户的情况下,那就必须要用到Python的UI包. 试用了很多种: 因为一直用的Python ...

  8. python怎么读文件里的指定几行-Python从文件中读取指定的行以及在文件指定位置写入...

    Python从文件中读取指定的行 如果想根据给出的行号, 从文本文件中读取一行数据, Python标准库linecache模块非常适合这个任务: 测试文件内容 :This is line 1. Thi ...

  9. python怎么读文件夹下的文件夹-python如何获取当前文件夹下所有文件名详解

    前言 本文主要给大家介绍了关于python获取当前文件夹下所有文件名的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 os 模块下有两个函数: os.walk() os.li ...

  10. python编码解码单词_在使用w2v时python中的编码问题

    我正在使用word2vec模型在python中编写我的第一个应用程序. 这里是我的简单的代码在使用w2v时python中的编码问题 import gensim, logging import sys ...

最新文章

  1. 随心测试_软测基础_005 测试人员工作内容
  2. 支付方式(2)——支付宝集成及使用
  3. 分布式加载数据训练神经网络
  4. WinPcap笔记(9):保存数据包到堆文件
  5. 单片机 架构 程序 经验总结_单片机“死机”了怎么办?看看一个资深工程师的经验总结...
  6. sql2005(64位企业版)+weblogic9.2+win2008集群
  7. 密码编码学之AES及其工作模式详解
  8. Selenium WebDriver的工作原理
  9. 光阴似箭——绿巨人NVIDIA显卡发展简史回顾
  10. mysql ndb 测试_mysql ndb笔记
  11. cacti 安装部署
  12. 最新最全git使用大全
  13. 计算机老年学校讲义,天津老年大学计算机类教学大纲
  14. 【图像融合】基于matalb小波变换(加权平均法+局域能量+区域方差匹配)图像融合【含Matlab源码 1819期】
  15. boolean到底占几个字节?
  16. 网络安全Bypass网卡详细讲解
  17. IP纯真数据库不同系统环境下版本
  18. android tim qq 1.1.0,Android TIM QQ 1.0.5 正式版发布
  19. 淘宝打单发货API,淘宝打单发货接口
  20. 愚人节,这样的微信公众号图文排版方式你见过吗?

热门文章

  1. VAR模型与VECM模型
  2. 海康威视监控有线/无线安装调试
  3. c语言怎样找无限循环小数的循环体
  4. 少儿计算机基础知识,儿童计算机基本操作
  5. QT出现应用程序无法正常启动0xc000007b的错误
  6. 考勤打卡记录数据库表结构_中控zktime5.0考勤管理系统数据库表结构
  7. 工程量清单软件测试,输变电工程量清单投标标准化应用软件BQB2017基本操作方法...
  8. 卡巴斯基病毒库离线更新教程(转)
  9. nes 红白机模拟器 第4篇 linux 手柄驱动支持
  10. OpenCore引导配置说明第十四版-基于OpenCore-0.6.7