初学行书临什么贴最好scheme最好使用哪一种实现

Scheme语言极其实现
Scheme语言极其实现
Scheme语言极其实现
1 scheme 一种小巧而强大的语言
scheme是一种简洁、小巧而又强大的语言,是一种通用编程语言,一种脚本语言,一种可以嵌入到其他程序中的拓展语言等等。
scheme被设计成支持多种实现策略,而且已经有大量的实现已经完成,它们中的大多数都是自由软件。有的是解释器实现(例如BASIC与Tcl),或编译为机器码的编译器(如C和Pascal),以及编译为虚拟机字节码的编译器(如Java)。
已经存在的有多种Scheme语言的拓展实现,包括我们的RSchem系统,它是一种集成有一个对象系统并可拓展可移植的Scheme实现。
本书是三本计划中的Scheme文档中的第一部分,Scheme实现以及RScheme语言与其实现。在全部完成后我也许会将它们集中到一部大书中。三本都会为Texinfo格式,以支持打印为可硬拷贝的文档,支持可在线浏览的Info文档(通过Info浏览器或Emacs编辑器的Info系统),或自动转为HTML格式文件以便于使用Web浏览器浏览。无论你通过何种方式阅读到本书,都欢迎来到Scheme的世界。
2.本书面向的读者
本书针对的群体是那些对Scheme的工作机理,Scheme语言的设计以及Scheme语言的使用感兴趣的人。
以上三条并不矛盾,因为学习编程语言最好的方式之一——同时也是语言设计的重要原则——就是研究Scheme语言是如何用其自身实现的。我将通过实现若干Scheme语言子集的解释器和一个简单的编译器来展示Scheme语言的强大之处。Scheme语言编译器的简洁与明晰将令人惊叹。
这是一种由Abelson and Sussman在《计算机程序的构造与解释》一书中发起的并广泛应用与编程介绍书籍的传统途径。许多介绍Scheme编程语言的书籍都遵循了这一途径,而它们中的大多数又是为初学者提供的。虽然我本人认为Scheme是一种适宜于初学的优秀语言,但对于那些已经用C和PASSICAL语言工作的人来说,仅仅为了学习Scheme去阅读编程介绍类的书实在有些强人所难。
本书与当前大多数介绍Scheme语言的书在许多方面有所不同。
我会将基本的编程概念一带而过,例如什么是变量,什么是递归。
我将会比绝大多数Scheme书籍的作者介绍得更加具体,因为看起来这样学生们能更容易理解。我会深入到语言层面告诉你大多数Scheme语言的实现是如何工作的。我发现这样的具体说明能够帮助我的学生以及我自己解开心中的许多困惑。
我不会从函数式编程的角度开始让你以为Scheme是通过表达式重写来执行的。
我将把Scheme描述为一种“弱面向对象”语言的特例。我所指的弱面向对象语言并不是那种有着继承关系等的面向对象概念,尽管很多Scheme的拓展实现了这一点。我的意思仅仅是这种语言中的值都属于某种数据对象,那意味着你能够比较两个指向对象的指针来看他们是否属于不同种类的对象,而不是同一种对象的不同状态——同一种对象也许会有许多种可变的状态。
许多人也许不太喜欢我的讲授方式,因为我过早开始关于状态与赋值的讨论。在Scheme语言中普遍认为没有限制地使用赋值操作是一种糟糕的编程风格。好的编程风格是去写几乎“纯函数式”或"applicative"的程序。尽管我同意“纯函数式”对于Scheme来说通常是一件好事,我的想法是尽可能早地明确Scheme的语法以让新的Scheme程序员们清楚Scheme是一种非常通用的编程语言,尽管它非同寻常的简洁与表达能力。我的经验告诉我许多人获益于对早期对赋值操作的领会,它澄清了变量与变量绑定的基础。风格的事儿咱们等到各种选择性都比较清楚的时候再讨论。
如果你曾经学习过Lisp或Scheme,但又不够深入,那么这本书正是你想要的。很多人接触Lisp或Scheme就像鸭子接触到水一样,但也有些人不是。但我认为那是由学习材料呈现的方式不同导致的,其实Lisp与Scheme语言的学习没有什么困难。为了避免读者们在阅读大多数书时遇到的问题,我通过异于以往的方式去解释一些概念。这些非常具体的解释将避免读者因语言不熟导致的理解困难。Scheme语言只是一种普通的编程语言,但也同时具备了能以特殊的方式使用的强大特性。
如果你是一位语言设计者,但对Lisp或Scheme语言又不够熟悉,那么本书将澄清你对这些语言的看法。我一直坚信Lisp的世界与通用的命令式语言之间有着无法逾越的鸿沟,很大程度上源于不同社区之间的不同话语。Scheme语言最新的发展并没有受到其他语言的设计者们的广泛赞扬。甚至Lisp语言的早期特性——宏,也没有被一般的语言设计者所理解,尽管他们的问题已经被Scheme在本质上解决了。
如果你是一位编程语言的实现者,或教授编程语言实现的课程,这本书也许会有用。我会展示各种Scheme解释器与一个编译器。Scheme是一种用于教授语言实现的原则的优秀工具,因为它语法简洁,而且其解释器从简易到复杂,从解释器到编译器有着简单的演化过程。这使得教授编程语言的实现原则能尽量避免无关的细节。
本书?书名呢?其实,我现在最郁闷的就是,Dr.Racket 到底怎么用?以前,用SCHEME怎么读输入,也就是对应C语言的scanf的是哪个。
想用SCHEME在OJ上AC一题……有些学校的OJ支持SCHEME
(233 Series Developer=v=☆)
本书?书名呢?其实,我现在最郁闷的就是,Dr.Racket 到底怎么用?以前,用SCHEME怎么读输入,也
没有read函数么?
没有read函数么?
有啊,但是,具体怎么用?
这里给的示例是错的,让我很是无语
另外,Dr.Racket中,到底哪个才是标准的SCHEME语言啊?好几种呢……不好选啊
(233 Series Developer=v=☆)
有啊,但是,具体怎么用?
http://acm./JudgeOnline/problem.php?id=1000
哇,厦大还有这种网站的啊?!长见识了~
(233 Series Developer=v=☆)
另外,Dr.Racket中,到底哪个才是标准的SCHEME语言啊?好几种呢……不好选啊
话说我也分不清,无力……
哇,厦大还有这种网站的啊?!长见识了~
我自己搞定了,把最外层的begin去掉反而对了……
一口气把,1007AC了,后两题是大整数的加法和乘法,结果,乘法还比加法费时少……震撼了。
别用Dr.Racket
那SCEME用什么?以前MIT的就是DR.SCEME或是MIT.SCHEME?
(233 Series Developer=v=☆)
别用Dr.Racket
其实我也很不爽Racket,因为一直不知道怎么调整键绑定成Emacs那种T_T
(道法自然)
若是修习,gnu MIT scheme足以;若是自用,gnu guile极好;若是做营生,racket是重要选项。
若是修习,gnu MIT scheme足以;若是自用,gnu guile极好;若是做营生,racket是重要选项。
请问大神,我初学DrRacket,没有编程基础,学校的课程,有没有推荐的参考书啊,英文的 How to design Program
看着别扭,汉语翻译过来的感觉被拔高了,不适合我这种零基础的菜鸟啊。。。恳请大神赐教,感激不尽~~
((let ((me 'out)) '(brackets!)))
学校课程居然有教Racket??
(It's a way of livin')
其实我也很不爽Racket,因为一直不知道怎么调整键绑定成Emacs那种T_T
参数设置的某个地方有个选项允许使用菜单中的快捷键.取消勾选.
(对不起,请让我自己倒霉一会儿。)
另外,Dr.Racket中,到底哪个才是标准的SCHEME语言啊?好几种呢……不好选啊
选第一个。
(道法自然)
请问大神,我初学DrRacket,没有编程基础,学校的课程,有没有推荐的参考书啊,英文的 How to de
多上racket的邮件列表吧。工具使用对初学者是个小难点,但决不是学习lisp的重点。
这是 R. Kent Dybvig 的那本书吗?
这是有人想写书吗?
完全本末倒置啊
Sicp 的精神是,因为Scheme简单到几乎不用学,所以拿来
很明显是某书序言的翻译。
对不起,我错了!
想要为Sicp 辩护,
看来我已经有点偏见了
确实不是 Kent Dybvig 那本书。那本书在这里,序言不一样。
(疯狂的二维指针程序员?..)
这是什么书?楼主呢?怎么不见人..
发表评论:
馆藏&20998
TA的最新馆藏程序员如何选择入门编程语言?_scheme语言-牛宝宝文章网
程序员如何选择入门编程语言? scheme语言
【快译自7月28日外电头条】有一天,我的朋友Ned的表弟问他,对于一个想做程序员的人来说,从哪门语言入手最好?他的表弟并没有太多的编程经验,但15岁的年纪,未来实际上也快得很,他似乎对编程很感兴趣,希望这门语言可以给他打开编程世界的大门。“所以很自然的,”Ned解释说,“我告诉他,去学习Scheme。”嗯?!Scheme?既然Ned打开了类似于“哪种编程语言是最好的”这样的话题,看上去我们一定会陷进没完没了的争论中去。有人可能说是Perl,别人会说C++,而估计有三分之一的人会推荐Visual Basic,他们会不停的争论,从每月一期的编程语言排行榜来看,似乎每种语言都有自己的支持者和反对者,在最新一期的榜单中,使用率最高的Java也遭到了人们的质疑(详细请参考7月编程语言排行榜:Java,正在老去的王者)。从口水上升到砖头。但选择Scheme?这我倒没预料到。Scheme:编程语言中的拉丁语?请注意,Ned并不孤单。许多著名的大学在第一年的计算机科学课程里都有Scheme。在实际的工作中也有许多人需要它。事实上,我敢说,如果你的大学只设立了C++或者Java的课程,你的学校可能不咋的,但如果你们学校有Scheme的课程,那很可能你幸运的去了一个一流的学校。Scheme是Lisp语言的一个分支,它是现今仍然在使用的最古老的编程语言之一。它提供了最少的语法和极少几个操作符。同样重要的是,Scheme支持函数式编程范式,这意味着它可以用数学函数表达式来编程。任何计算问题都可以使用称为兰布达演算的独特数学符号来表达,从某种意义上说,Scheme算是一个兰布达演算的解析器。对于学生来说,这意味着Scheme可以让你专注于算法本身,而不是语言的语法。主流的编程语言如Java和C++等都有着极其复杂的语法,这往往是由于语言在演变过程中不断增加的新功能带来的。它们迫使你学习许多种不同的控制结构和处理不同问题的不同方法。但Scheme不是这样,它为每个计算问题提供同样的简洁而可预见的语法。“我感觉Scheme在给电脑下指令时更自然,相对于其他语言,”Ned说。不过,Scheme?我无法看到它的优势。为今后的编程学习打下简单而坚实的基础确实很好,但是当我15岁时,我对真正的逻辑和数学没有什么兴趣。我着迷的只是怎样让电脑完成各种各样好玩的工作――我要很遗憾地说,“执行兰布达演算的算法”,没意思;而编个视频游戏?很酷。当然,除了运行算术题,你也可以让Scheme做更多。今天,它已经是一个正式的语言,可以在几乎所有平台上运行。但是,我对Scheme最大的怀疑仍然是,它本质上是一个只写的语言。一个程序看起来非常像另一个。它的语法很简单,但副作用是你必须要读懂源代码才知道Scheme想要做什么。这使Scheme成为一门良好的教学编程语言,但对于一个15岁,对计算机能做什么非常好奇的孩子,Scheme是糟糕的。软件工程的现状不错,有些人会说,我们不需要那么多黑客,需要的是更多受过训练的软件工程师;从Windows SDK入手学习编程,被漂亮的用户界面吸引只会导致坏习惯;还有不理解基础算法的程序员算不上好程序员――我自己就说过很多次。可是 “软件工程”的概念到底是什么呢?它是否真的算是工程学呢?也许不是,大西洋系统行会(Atlantic Systems Guild)会长Tom De Marco说。“软件开发在本质上不同于自然科学比如物理,它的特性注定了无法非常准确的捕捉到所描述的东西,”这是De Marco在最新一期IEEE软件杂志上发表的。“软件开发在某种程度是而且永远是一种实验。实际的软件建设虽然不一定是实验,但它在概念上还是实验。”换言之,编程是艺术的科学,无论程序员多么精通于实践。创造有效的软件解决方案需要洞察力、灵感、大胆,并经常要有些运气。当然,有好的程序员和不好的程序员――但要把软件开发和土木工程画上等号是件愚蠢的事。正如Jeff Atwood所说的那样,“我们做的是工艺,不是工程。”如果单纯从软件工程和专业性角度解答程序员如何选择合适的编程语言,那我们必须考虑具体的需求和应用场景,是做Web开发还是桌面端开发?是做前端还是服务端编程?这样看来你讲面对PHP、C++或者XML或者C语言之类的选择。在与Windows教父一次关于未来编程语言的发展方向的对话中,Jeffrey提到了编程语言将向自动化和智能化发展,但这并不意味着我们不需要一些基本的编程逻辑和思考的训练,编程语言可以让我们控制硬件,但程序却需要程序员来控制。因此,15岁,我想说,Scheme可能是“最好”的学习编程的方式,但可以等到大学里去教。在这样一个年纪,我认为鼓励学生发展天生的好奇心和热情更为重要,这可能会造就出一位真正出色的程序员。如果这意味着在Visual Basic中编码,那也没问题。Scheme可以稍后。最后,我还是直说了吧,我建议的第一门编程语言是Python,现在让砖头飞过来吧!投票调查【更多关于编程语言的讨论】程序员如何选择合适的编程语言详谈学习编程语言的策略对话Windows教父:未来编程语言的发展方向Java以外的选择 Scala编程语言简介教你如何有效编程的十四种方法【译稿,非经授权请勿转载。合作站点转载请注明原文译者和出处为,且不得修改原文内容。】原文:What'sthebestfirstlanguageforaprogrammer?作者:NeilMcAllister欢迎您转载分享:
更多精彩:[Scheme入门]3 eqv?、loop、let、letrec、do等的比较和使用 - 推酷
[Scheme入门]3 eqv?、loop、let、letrec、do等的比较和使用
一、对象的比较
这个函数用来比较2个对象的地址,如果相同的话就返回#t。在Scheme中真用#t表示,假则用#f。
例如,(eq? str str)返回#t,因为str本身的地址的是一样的,但是&scheme&和&scheme&则被存储在不同的地址中,因此函数返回#f。注意,不要用eq?来比较数字,因为在R5RS和MIT-Scheme中均没有被指定返回值,建议使用eqv?或者=代替。以下是一些示例:
(define str &scheme&)
;Value: str
(eq? str str)
;Value: #t
(eq? &scheme& &scheme&)
;Value: ()&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 在R5RS中,此处返回#f
该函数比较2个储存在内存中的对象的类型和值,如果类型和值都一致则返回#t。对于过程(lambda表达式)的比较依赖于具体的实现。这个函数不能用于类似于表和字符串一类的序列比较,因为尽管这些序列看起来是一致的,但它们存储在不同的地址中。以下同样是一些示例:
(eqv? 1.0 1.0)
;Value: #t
(eqv? 1 1.0)
;Value: ()
(eqv? (list 1 2 3) (list 1 2 3))&&&&&&&&&&&&&&& 不要去比较序列
;Value: ()
(eqv? &scheme& &scheme&)
;Value: ()
比较序列就应该这个函数了。
(equal? (list 1 2 3) (list 1 2 3))
;Value: #t
(equal? &hello& &hello&)
4、其它一些用于比较的函数
如果对象为序对则返回
如果对象是一个表则返回
。要小心的是空表
是一个表但是不是一个序对。
如果对象是空表’
的话就返回
如果对象是一个符号则返回
如果对象是一个字符则返回
如果对象是一个字符串则返回
如果对象是一个数字则返回
如果对象是一个复数则返回
如果对象是一个实数则返回
如果对象是一个有理数则返回
如果对象是一个整数则返回
如果对象不是一个浮点数的话则返回
如果对象是一个浮点数的话则返回
如果对象是一个奇数的话则返回
如果对象是一个偶数的话则返回
postitive?
如果对象是一个正数的话则返回
negative?
如果对象是一个负数的话则返回
如果对象是零的话则返回
类似于用&=等比较数字,在比较字符的时候可以使用
&strong&比较字符串时,可以使用&code&string=?&/code&和&code&string-ci=?&/code&等函数。&/strong&
二、递归与尾递归
&strong&在自己的定义中调用自己的函数叫做递归函数(Recursive Function)。想必大家都知道这些。&/strong&
&strong&计算阶乘则是演示递归的典型示例。&/strong&
&strong&(define (fact n)&/strong&
&strong& (if (= n 1)&/strong&
&strong& 1&/strong&
&strong& (* n (fact (- n 1)))))&/strong&
&strong&因此(fact 5)的计算过程用以下方式可以说明得很明显。&/strong&
&strong&(fact 5)&/strong&
&strong&=& 5 * (fact 4)&/strong&
&strong&=& 5 * 4 * (fact 3)&/strong&
&strong&=& 5 * 4 * 3 * (fact 2)&/strong&
&strong&=& 5 * 4 * 3 * 2 * (fact 1)&/strong&
&strong&=& 5 * 4 * 3 * 2 * 1&/strong&
&strong&=& 5 * 4 * 3 * 2&/strong&
&strong&=& 5 * 4 * 6&/strong&
&strong&=& 5 * 24&/strong&
&strong&=& 120&/strong&
&strong&但由于(&span style=&color: #000000;&&fact 5),(fact 4)...(fact 1)都被分配了不同的存储空间,直到(fact (- i 1))返回一个值前,(fact i)都会被保存在内存中,由于存在函数调用的开销,这也就意味着会占用更多的内存空间和计算时间。&/span&&/strong&
&strong&这种时候,使用尾递归则包含了计算结果,当计算结束时直接将其返回。尤其是Scheme规范要求尾递归调用转化为循环,因此尾递归调用就不存在函数调用开销。以下就是fact函数的尾递归版本。&/strong&
&strong&(define (fact-tail n)&/strong&
&strong& (fact-rec n n))&/strong&
&span style=&font-size: 18&&&span style=&font-family: Microsoft YaH&&&span style=&color: #000000;&&&span class=&p&&(&/span&&span class=&k&&define&/span&&span class=&p&&(&/span&&span class=&nf&&fact-rec&/span&&span class=&nv&&n&/span&&span class=&nv&&p&/span&&span class=&p&&)&/span&&br /& &span class=&p&&(&/span&&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&nb&&=&/span&&span class=&nv&&n&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&&br /& &span class=&nv&&p&/span&&br /& &span class=&p&&(&/span&&span class=&k&&let&/span& &span class=&p&&((&/span&&span class=&nf&&m&/span&&span class=&p&&(&/span&&span class=&nb&&-&/span&&span class=&nv&&n&/span&&span class=&mi&&1&/span&&span class=&p&&)))&/span&&br /& &span class=&p&&(&/span&&span class=&nf&&fact-rec&/span& &span class=&nv&&m&/span&&span class=&p&&(&/span&&span class=&nb&&*&/span&&span class=&nv&&p&/span&&span class=&nv&&m&/span&&span class=&p&&)))))&/span&&/span&&/span&&/span&
&span style=&font-size: 18&&&span style=&font-family: Microsoft YaH&&&span style=&color: #000000;&&&span class=&p&&同时,计算过程如下。&/span&&br /& (fact-tail 5)&br /& => (fact-rec 5 5)&br /& => (fact-rec 4 20)&br /& => (fact-rec 3 60)&br /& => (fact-rec 2 120)&br /& => (fact-rec 1 120)&br /& => 120&/span&&/span&&/span&
&strong&就是因为使用fact-rec并不用等待其它函数的计算结果,因此当它计算结束时即从内存中释放。fact-rec的参数不断在变化,这实际上就相当于是一种循环。就如同上文说到的,Scheme将尾递归转化为循环。&/strong&
我们先来看看2个递归的例子。
这2个例子的一个很明显的区别在于它们各自最后让递归过程停止的对象不同,前者是0,后者是'()。对于前者,我们要算出的是ls中元素的个数,后者则是将ls中的x元素去掉。前者最后返回的是数,后者则是表。
下面我们通过具体的示例来深入了解这两者之间的关系。
求和由数构成的表中的元素
尾递归版:
my-sum-tail
my-sum-rec
my-sum-rec
my-sum-rec
前者最后当ls为空是,返回0给+这个操作;后者的+操作则在my-sum-rec这个函数的参数位置,因此最后返回的是整个运算的结果n。前者通过不断地加上(car ls)来达到最终的目的;后者则通过不断的循环,将+操作的最终结果赋值给n。
三、named let
named let也可以用来表示循环,以下这个fact-let函数使用了一个loop,这和上文中的fact-rec函数是有很大区别的。在代码的第二行,代码将参数n1和p都初始化为n。当每次循环后,参数都在最后一行进行更新,此处的更新为:将n1减1,而将p乘以(n1-1)。
当然了,如果觉得有了一个let在这里比较难以理解,下面这样也是可以的,不过上面这张方式更加简洁明了罢了。
(define (fact-let n)
(let loop ((n1 n) (p n))
(if (= n1 1)
(loop (- n1 1) (* p (- n1 1)))))
同样,我们通过对比递归来理解named let。
我们要做的是通过函数求出x元素在ls中的位置,索引从0开始,如果不在ls中则返回#f。
position-aux
position-aux
position-aux
named let版:
后者就像嵌套一般,进入了递归版的第二行代码。前者的else后面,通过函数调用返回自身;后者则很直接地通过更新参数来达到和递归同样的目的。后者我们先将ls赋值给ls0,通过不断的(cdr ls0)来更新,先将0赋值给i,通过不断的(1+ i)来更新,这和递归中最后一行有着异曲同工之妙。
下面我们再通过尾递归来理解named let,多角度的对比,能够使我们更清晰的理解和加深印象。
这些的示例都很简单,基本上各大书籍文档中都大同小异,下面我们通过一个函数来反转ls中的所有元素。
尾递归版:
my-reverse
my-reverse-rec
my-reverse-rec
my-reverse-rec
named let版:
my-reverse-let
&&&&&&&ls1
我们很容易的看到两个版本的最后一行几乎一模一样;后者的第二行也相当于将前者的第二行代码并到第三行代码一样。由此可见,named let也不过是个皮囊而已,正在的动力依旧来源于不断的更新。
四、letrec
letrec类似于let,不过它允许让一个名字递归地调用它自身。通常letrec都用于定义复杂的递归函数。
依旧是这个经典的示例:
fact-letrec
&&&&&&&&&&&&&&&&&(
倒数第二行的代码中,局部变量iter可以在它的定义里面引用它自己。而语法letrec是定义局部变量约定俗成的方式。
还是老规矩,对比出真知,我们先来看看上面第二大节中用来对比过的求和的例子。
我还在再次将它们贴出来好了。
尾递归版:
my-sum-tail
my-sum-rec
my-sum-rec
my-sum-rec
my-sum-letrec
我们可以看出后者的最后一行的ls和0被赋值到第二行的ls0和n中,然后再倒数第二行中得到更新。下面我们再来看一个示例,这是将一个代表正整数的字符串转化为对应整数。例如“ 3389”会被转化为3389。不过只是个示例而已,不需要去检查那些不合法的输入。符到整数的转化是通过将字符#\0……#\9的ASCII减去48,可以使用函数
char-&integer
来获得字符的ASCII码。函数
string-&list
可以将字符串转化为由字符构成的表。
尾递归版本:
my-string-&integer
string-&list
&&&&&&&&&&&&&&& (
char-&integer
named let版本:
my-string-&integer-let
string-&list
char-&integer
&&&&&&&&&&&&&&&& (
letrec版本:
my-string-&integer-letrec
char-&integer
&&&&&&&&&&&&&&&&&&&&&&&&&&&&(
string-&list
将尾递归中的第二行并到第三行就相当于named let版本的第二行了,更新的过程也大同小异。letrec版本的也和这个类似,将最后一行并到第二行也是一样的,第五行到第七行均为参数的更新,更新的过程也就是求解的过程。
就像在C系列语言中我们通常用while比较多而do比较少一样,在scheme中do也并不常见,但语法do也可以用于表达重复。它的格式如下:
(predicate value)
变量在binds部分被绑定,而如果predicate被求值为真,则函数从循环中逃逸(escape)出来,并返回值value,否则循环继续进行。binds部分的格式如下所示:[binds] - ((p1 i1 u1) (p2 i2 u2)...)
变量p1,p2,...被分别初始化为i1,i2,...并在循环后分别被更新为u1,u2,...。
最后一次fact函数的do表达式版本。
变量n1和p分别被初始化为n和n,在每次循环后分别被减去1和乘以(n1-1)。当n1变为1时,函数返回p。此处的n1和p分别相当于上文中的p1和p2,n1后面的n和p后面的n分别相当于上文中的i1和i2,(- n1 1)和(* p (- n1 1))分别相当于上文中的u1和u2。
do也挺难的,不过我觉得letrec更加难以灵活运用。
下面我们换一种方式,通过各个示例的do版本之间的联系来对比加深对这些语法的理解。
my-reverse-do
my-string-&integer-do
string-&list
char-&integer
加色部分通过上文的讲解相信很容易理解了,最后一行都是do的终止的判断,为真的时候则求值并返回最后一个ls1(或n)。
通过这一节的学习,相信大家都对讲过的语法有了一定的理解,大家可以利用这些函数来编写自己的程序了。简单的循环用let就够了,至于复杂的局部递归函数则可以使用letrec。至于do,如果能够灵活运用,相信也是威力无穷的。那么,我们下节见咯。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 篆刻初学用哪本书最好 的文章

 

随机推荐