我对Scheme非常感兴趣,并开始使用一些玩具编程示例,并正在阅读Paul Graham的On Lisp。
我无法找到的一件事是一本书或网站,旨在向“OO人”教授Scheme,即像我这样的人,他们用c ++ / Java / Python完成了99%的编码。
我看到闭包是一种对象,在某种意义上它们具有本地状态,并提供一个或多个可以访问该状态的函数。但我不想学习Scheme只是为了将我现有的习惯移植到它上面。这就是为什么我现在正在学习Scheme而不是Common Lisp;我担心CLOS可能会成为我现有OO习惯的拐杖。
理想的是一本书或网站,提供以OO语言解决问题的案例研究,以及以Schemey方式解决的问题。我想我最欣赏科学计算和/或计算机图形学问题,但任何事情都可以。
任何教学领导都会非常感激。
答案 0 :(得分:11)
我怀疑CLOS会成为旧习惯的拐杖,我发现它与C ++ / Java / Python中的OO风格截然不同,非常有趣。我不明白所有细节,但我会推荐Peter Seibel的Practical Common Lisp。如果您正在阅读 On Lisp 而不会遇到太多麻烦,您应该可以深入了解PCL中的the chapters introducing CLOS。另外,我建议他Google Tech Talk比较Java和Common Lisp。
以下是一些建议,使其成为一个更为成熟的答案:
经典文本Structure and Interpretation of Computer Programs涵盖了使用闭包构建模块化系统的第3章中的大量示例(并解决了引入状态和可变性的问题)。第2章包括一些通用和数据/类型导向的编程,这些编程可能有助于激发CLOS的研究。这本书真的不需要介绍,这是一项高耸的工作,我从春天开始就只是慢慢阅读。如果您对Scheme感兴趣,强烈推荐。
虽然SICP是一本很好的书,但它并非没有缺陷:一篇非常有趣的文章是"The Structure and Interpretation of the Computer Science Curriculum",其中详细阐述了对SICP的一些批评,并由如何撰写设计程序(我没有读过HTDP,但我听说它非常好)。虽然这篇文章不会特别教你如何寻找 - 比较功能和OO编程 - 但无论如何它真的很有趣。他们的新生本科课程开始于使用Scheme(我认为是PLT / Racket)的第一学期函数式编程,然后是一个用C ++或Java编写的OO编程学期......至少这是他们在论文中描述的课程。
Peter Norvig的这些幻灯片解决了OO编程中常见的一些设计模式,并说明了它们在动态函数语言(如Scheme和Lisp)中缺少或不必要的原因:http://norvig.com/design-patterns/
我小心地推荐与Little Schemer书籍相同作者的书: A Little Java,A Few Patterns 。我不能肯定地说这是不是一本真正好的书,它是非常奇怪的,并且有一些非常糟糕的排版决定(斜体,衬线,可变宽度,上标不属于编程文本) ,但看一看可能会很有趣。无论如何,你可能会发现它很便宜。不要认真对待这个建议。我认为坚持计划文本会更好。
P.S。我不同意一条评论,指出函数式编程在面向对象编程时并不复杂,我认为这是非常错误的。功能性编程的广度是真正令人难以置信的。当你超越map / filter / reduce和一流函数,并看看功能领域中的其他东西,如懒惰评估,避免副作用和变异,以及强大的静态类型语言,它变得非常有趣,并且肯定和传统的 OO编程一样复杂。我自己只是抓住了表面,但发现了很多新的想法。编程是复杂的业务,无论是OO还是功能。
答案 1 :(得分:4)
恭喜你,我的朋友!爱cs,喜欢功能性编程。
如果你是python开发人员,需要3-4天才能在方案中思考
以下是我见过的最好的简单教程http://www.shido.info/lisp/idx_scm_e.html
我找到了这个课程http://cs.gettysburg.edu/~tneller/cs341/scheme-intro/index.html,它可能对你有用
答案 2 :(得分:3)
一位初学者的资源非常有用,非常适合随意的读者"The Adventures of a Pythonista in Schemeland"。它(显然)是从Python程序员采用Scheme的第一步开始编写的。关于它的一个特别好的事情是它包含了每个方案实现之间当前实现和兼容性问题的概述,不幸的是,当你刚刚开始时,这可能会引起一些麻烦。
关于对象系统,这些two documents(从here链接)给出了使用闭包的非常简单的玩具实现的很好的例子,我发现它有助于理解它们在捕获状态中的用途
答案 3 :(得分:2)
如果您从使用Scheme开始,请查看How to Design Programs。本书介绍了解决问题的“方案”方法。我不认为有一本书将OO和功能解决方案与相同的编程问题进行比较。但是有一个nice presentation显示了像Scheme这样的动态语言如何为需要复杂设计模式的静态类型OOP语言的问题提供简单的解决方案。