面向对象程序员的方案

Sup*_*ric 10 lisp oop scheme functional-programming idioms

我对Scheme非常感兴趣,并开始使用一些玩具编程示例,并正在阅读Paul Graham的On Lisp.

我无法找到的一件事是一本书或网站,旨在向"OO人"教授Scheme,即像我这样的人,他们用c ++/Java/Python完成了99%的编码.

我看到闭包是一种对象,在某种意义上它们具有本地状态,并提供一个或多个可以访问该状态的函数.但我不想学习Scheme只是为了将我现有的习惯移植到它上面.这就是为什么我现在正在学习Scheme而不是Common Lisp; 我担心CLOS可能会成为我现有OO习惯的拐杖.

理想的是一本书或网站,提供用OO语言解决的问题的案例研究,以及以Schemey方式在Scheme中解决的问题.我想我最欣赏科学计算和/或计算机图形学问题,但任何事都可以.

任何教学领导都会非常感激.

mic*_*kig 11

我怀疑CLOS会成为旧习惯的拐杖,我发现它与C++/Java/Python中的OO风格完全不同,而且非常有趣.我不明白所有细节,但我会推荐Peter Seibel的Practical Common Lisp.如果您正在阅读On Lisp而不会遇到太多麻烦,那么您应该能够深入了解在PCL中引入CLOS的章节.另外,我建议他比较Java和Common Lisp的Google Tech Talk.

这里有一些建议可以让这个答案更加全面:

计算机程序的经典文本结构和解释涵盖了使用闭包构建模块化系统的第3章中的很多示例(并解决了引入状态和可变性的问题).第2章包括一些通用和数据/类型导向的编程,这些编程可能有助于激发CLOS的研究.这本书真的不需要介绍,这是一项高耸的工作,我从春天起就只是慢慢阅读它.如果您对Scheme感兴趣,强烈推荐.

虽然SICP是一本很好的书,但它并非没有它的缺陷:一篇非常有趣的文章是"计算机科学课程的结构和解释",其中详细阐述了对SICP的一些批评,并由How的作者撰写.设计程序(我没有读过HTDP,但我听说它非常好).虽然这篇文章不会特别教你如何寻找 - 比较功能和OO编程 - 但无论如何它真的很有趣.他们的新生本科课程开始于使用Scheme(我认为是PLT/Racket)的第一学期函数式编程,然后是一个用C++或Java编写的OO编程学期......至少这是他们在论文中描述的课程.

Peter Norvig的这些幻灯片解决了OO编程中常见的一些设计模式,并说明了它们在动态函数语言(如Scheme和Lisp)中缺少或不必要的原因:http://norvig.com/design-patterns/

谨慎地推荐与Little Schemer书籍相同的作者的书:一个小Java,几个模式.我不能肯定地说这是不是一本真正好的书,它是非常奇怪的,并且有一些非常糟糕的排版决定(斜体,衬线,可变宽度,上标不属于编程文本) ,但看一看可能会很有趣.无论如何,你可能会发现它很便宜.不要认真对待这个建议.我认为坚持计划文本会更好.

ps我不得不同意一条评论说明功能编程在面向对象编程时不那么复杂,我认为这是非常错误的.功能性编程的广度是真正令人难以置信的.当你超越map/filter/reduce和一流函数,并看看功能领域中的其他东西,如懒惰评估,避免副作用和变异,以及强大的静态类型语言,它变得非常有趣,当然和传统的 OO编程一样复杂.我自己只是抓住了表面,但发现了很多新的想法.编程是复杂的业务,无论是OO还是功能.