近一周,学习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会导致一个类型错误 -- 把浮点值付给了整型值,多数静态类型语言都是这么做的。