【问题标题】:scheme for object-oriented programmers面向对象程序员的方案
【发布时间】:2011-05-25 02:16:38
【问题描述】:

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

我找不到一本书或网站,旨在向“OO 人”教授 Scheme,即像我这样的人,他们 99% 的编码都是用 c++/Java/Python 完成的。

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

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

任何教学线索将不胜感激。

【问题讨论】:

  • 我不认为你会找到这样的东西。当大多数人学习一门新语言时,他们会尝试从该语言的角度来学习它,而不是从另一种语言的角度来学习。此外,OOP 远比函数式复杂。查看 The Little SchemerSICP
  • 我怀疑 CLOS 会成为旧习惯的拐杖,我发现它与 C++/Java/Python 中的 OO 风格有很大不同,而且非常有趣。我不了解所有细节,但我会推荐 Peter Seibel 的 Practical Common Lisp。如果您正在阅读 On Lisp 没有太多麻烦,您应该能够深入了解chapters introducing CLOS in PCL。另外,我推荐他的 Google Tech Talk 比较 Java 和 Common Lisp。
  • @Rafe 你会从阅读我的帖子中发现,从它自己的角度学习 Scheme,而不是移植我的 OO 思维模式,正是我想要做的。我希望通过查看针对同一问题的 OO 和 Scheme 解决方案示例来引导这个过程,尤其是当它们看起来非常不同时。
  • 我认为这是一个有效的观点。正是因为它的 OO 是如此不同,所以它可能是一个问题。在大多数语言中,您定义类,然后在它们上定义方法—— Peter 明智地扭转了这一点,首先执行泛型函数,defclass 在下一章。显然这是 Lisp 程序员常去的地方:xach.livejournal.com/275444.html
  • 感谢@spacemanaki 提供了很好的链接。如果您重新发布作为答案而不是评论,我会选择它作为此问题的答案。

标签: oop functional-programming lisp scheme idioms


【解决方案1】:

我怀疑 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 的一些批评,由 How to Design 的作者撰写程序(我没有读过 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。我不能肯定这是否真的是一本好书,它非常奇怪,并且有一些非常糟糕的排版决定(斜体,衬线,可变宽度,上标不属于编程文本) ,但看看可能会很有趣。无论如何,您可能会发现它很便宜。不要那么认真地对待这个建议。我认为最好还是坚持 Scheme 文本。

附言我不得不不同意一个评论,即函数式编程在 OO 编程中并不复杂,我认为这是严重错误的说法。函数式编程的所有广度确实令人难以置信。当你超越 map/filter/reduce 和一等函数时,看看函数领域的其他东西,比如惰性求值、避免副作用和突变,以及强大的静态类型语言,它会变得非常有趣,并且肯定和传统的 OO 编程一样复杂。我自己只是触及了表面,但发现了很多新想法。编程是一项复杂的业务,无论是 OO 还是函数式。

【讨论】:

    【解决方案2】:

    恭喜你,我的朋友!喜欢cs,喜欢函数式编程。

    如果你是 python 开发者,考虑方案需要 3-4 天

    这是我见过的最好的简单教程http://www.shido.info/lisp/idx_scm_e.html

    我找到了这门课程http://cs.gettysburg.edu/~tneller/cs341/scheme-intro/index.html,它可能对你有用

    【讨论】:

      【解决方案3】:

      "The Adventures of a Pythonista in Schemeland" 是一个非常有用且非常适合休闲读者的初学者资源。它是(显然)从 Python 程序员开始使用 Scheme 的角度编写的。关于它的一个特别好的事情是它包含了当前实现的概述以及每个方案实现之间的兼容性问题,不幸的是,当您刚开始时,这可能会引起一些头痛。

      关于对象系统,这些twodocuments(链接自here)给出了使用闭包的非常简单的玩具实现的很好示例,我发现它们有助于理解它们在捕获状态中的用途。

      【讨论】:

        【解决方案4】:

        如果您刚开始使用 Scheme,请查看 How to Design Programs。本书介绍了解决问题的“方案”方法。我认为没有一本书可以将 OO 和函数式解决方案与相同的编程问题进行比较。但是有一个nice presentation 展示了像 Scheme 这样的动态语言如何为静态类型 OOP 语言中需要复杂设计模式的问题提供简单的解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-28
          • 2012-06-17
          • 2010-09-18
          • 1970-01-01
          • 1970-01-01
          • 2015-04-28
          • 2023-03-23
          • 2015-02-08
          相关资源
          最近更新 更多