在过去的一周里,我对学习Scheme有点上瘾。我对Scheme的兴趣来自于它简单的语法,只有成对的()。学习Scheme和自己的Python编程可以快速复制Scheme解释器:
https://github.com/zhangyun000...
仔细查看程序注释中的论文链接,介绍了绍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.56729180004349ZhSchememe>(sin34) ['sin',34.0.529082661200238ZhSchememe>(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?i12)break)) ) ['while',['<','i',23],['begin',['print','i'],['set','i',['+','i',1]], ['if',['eq?','i',12],'break']]]4579101ZhScheme>(for(seti23)(<i45)(seti(+i2))(begin(printi)(if(eq?i3)break))) ['for',['set','i',23],['<','i',45],['set','i',['+','i',['];begin' ['print','i'],['if',['eq?','i',43],'break']]]23227233333333734>(env) ['env'] variables... +:<built-infunctionadd>-:<built-infunctionsub>*:<built-infunctionmul>/:<built-infunctiontruep>>:<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>0x000cdr000:<function<lambda>at0x00listtttitttit:<function<lambda>at0x00listtttit-ref:<function<lambda>at0append:<built-infunctionadd>len:<built-infunctionlen>map:<class'map'> print:<built-infunctionprint>exit:Useexit()orCtrl-ZplusR open:<function<lambda>at0x000cal/cc:<functionlcalcat00procedure:<built-infunctioncanull?:<built-infunctioncanull?:<function<lambda>at0x0number:<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-infunctionantan>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-infunctionlogp>log10:<built-infunctionlog0>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外,还可以define x 除了12,也可以使用 int y 如果sett,定义一个整形手术变量 y 2.3会导致类型错误 -- 将浮点值付给整形值,大多数静态语言都是这样做的。