Python实现Scheme

Python (164) 2023-04-21 16:09:02

近一周,学习Scheme有点上瘾,我对Scheme的兴趣源自其简单的语法,只有成对的()。学习Scheme,加上自己的Python编程,能很快的抄出一个Scheme解释器:

https://github.com/zhangyun00...

仔细看程序注释里的论文链接,介绍了绍python实现的scheme子集。我拿来改了改,加了for和while循环,break跳出循环,可以使用元组、列表,字典,class定义类。

运行python ZhScheme.py

ZhScheme>(tuple12)
['tuple',1,2]
(1,2)
ZhScheme>(list566)
['list',5,6,6]
[5,6,6]
ZhScheme>(dict(list(list56)(list5634)))
['dict',['list',['list',5,6],['list',56,34]]]
{5:6,56:34}
ZhScheme>(sin12)
['sin',12]-0.5365729180004349ZhScheme>(sin34)
['sin',34]0.5290826861200238ZhScheme>(list345)
['list',3,4,5]
(345)
ZhScheme>(list(list345)(list45645))
['list',['list',3,4,5],['list',456,45]]
((345)(45645ZhScheme>(definei4)
['define','i',4]
ZhScheme>ii4ZhScheme>(while(<i23)(begin(printi)(seti(+i1))(if(eq?i12)break))
)
['while',['<','i',23],['begin',['print','i'],['set','i',['+','i',1]],
['if',['eq?','i',12],'break']]]4567891011ZhScheme>(for(seti23)(<i45)(seti(+i2))(begin(printi)(if(eq?i3)break)))
['for',['set','i',23],['<','i',45],['set','i',['+','i',2]],['begin'
['print','i'],['if',['eq?','i',43],'break']]]2325272931333537394143ZhScheme>(env)
['env']
variables...

+:<built-infunctionadd>-:<built-infunctionsub>*:<built-infunctionmul>/:<built-infunctiontruediv>>:<built-infunctiongt><:<built-infunctionlt>>=:<built-infunctionge><=:<built-infunctionle>=:<built-infunctioneq>not:<built-infunctionnot_>eq?:<built-infunctionis_>equal?:<built-infunctioneq>max:<built-infunctionmax>min:<built-infunctionmin>abs:<built-infunctionabs>round:<built-infunctionround>car:<function<lambda>at0x0000cdr:<function<lambda>at0x0000list:<function<lambda>at0x000list-ref:<function<lambda>at0append:<built-infunctionadd>len:<built-infunctionlen>map:<class'map'>
print:<built-infunctionprint>exit:Useexit()orCtrl-ZplusR
open:<function<lambda>at0x000call/cc:<functioncallccat0x00procedure?:<built-infunctioncanull?:<function<lambda>at0x00number?:<function<lambda>at0xstring?:<function<lambda>at0xlist?:<function<lambda>at0x00struct?:<function<lambda>at0xdict?:<function<lambda>at0x00int:{}
__name__:math
__doc__:Thismoduleisalwaysav
mathematicalfunctionsdefinedbyth
__package__:
__loader__:<class'_frozen_impor
__spec__:ModuleSpec(name='math',
orter'>,origin='built-in')acos:<built-infunctionacos>acosh:<built-infunctionacosh>asin:<built-infunctionasin>asinh:<built-infunctionasinh>atan:<built-infunctionatan>atan2:<built-infunctionatan2>atanh:<built-infunctionatanh>ceil:<built-infunctionceil>copysign:<built-infunctioncopycos:<built-infunctioncos>cosh:<built-infunctioncosh>degrees:<built-infunctiondegreerf:<built-infunctionerf>erfc:<built-infunctionerfc>exp:<built-infunctionexp>expm1:<built-infunctionexpm1>fabs:<built-infunctionfabs>factorial:<built-infunctionfacfloor:<built-infunctionfloor>fmod:<built-infunctionfmod>frexp:<built-infunctionfrexp>fsum:<built-infunctionfsum>gamma:<built-infunctiongamma>gcd:<built-infunctiongcd>hypot:<built-infunctionhypot>isclose:<built-infunctioniscloisfinite:<built-infunctionisfiisinf:<built-infunctionisinf>isnan:<built-infunctionisnan>ldexp:<built-infunctionldexp>lgamma:<built-infunctionlgammalog:<built-infunctionlog>log1p:<built-infunctionlog1p>log10:<built-infunctionlog10>log2:<built-infunctionlog2>modf:<built-infunctionmodf>pow:<built-infunctionpow>radians:<built-infunctionradiasin:<built-infunctionsin>sinh:<built-infunctionsinh>sqrt:<built-infunctionsqrt>tan:<built-infunctiontan>tanh:<built-infunctiontanh>trunc:<built-infunctiontrunc>pi:3.141592653589793e:2.718281828459045tau:6.283185307179586inf:infnan:nani:43struct...

总之,这个scheme的目标是可以调用Python里的各种常用函数,以上env结果中的变量和函数都是你可以使用的。

现在可解释执行,以行为单位的文件了:

python ZhScheme.py test.s

test.s文件内容:

(quotemustwritecodeaslines)

(+25)

(definei1)i(if(<i19)(print(+i1)))
(while(<i23)(begin(printi)(seti(+i1))(if(eq?i12)break)))
(for(seti23)(<i45)(seti(+i2))(begin(printi)(if(eq?i43)break)))

(definef(opentest.ssr))
((.fread))

(definedefine12)

define

(classpoint(list(listn2)(listm(lambdax(*2x)))))
(definex(point))
(.xn)
((.xm)4)

有在ZhScheme加入静态数据类型的想法,也就是说,除了能define x 12之外,还可以使用 int y 34,定义一个整形变量,如果set y 2.3会导致一个类型错误 -- 把浮点值付给了整型值,多数静态类型语言都是这么做的。

THE END

发表回复