【问题标题】:How do I get my brain moving in "lisp mode?"如何让我的大脑以“lisp 模式”运转?
【发布时间】:2010-10-11 00:42:06
【问题描述】:

我的教授告诉我们,我们可以为下一个编程任务选择一种编程语言。我一直想尝试一种函数式语言,所以我想我会尝试 clojure。问题是我理解语法并理解基本概念,但我无法让所有东西都在我的脑海中“点击”。有人有建议吗?还是我选择了错误的语言来开始函数式编程?

【问题讨论】:

  • 坚持住!实现功能需要在思维上稍作转变。我还没有看到任何简单的方法让它“点击”——只要研究它就可以了!
  • 4clojure.com 的在线问题非常好 - 解决测试用例,然后研究其他人如何解决它们。

标签: functional-programming lisp clojure


【解决方案1】:

这个怎么样:http://www.defmacro.org/ramblings/lisp.html

从普通命令式程序员(Java、C# 等)的角度来看,这是对 lisp 思考的非常简单、逐步的介绍。

【讨论】:

    【解决方案2】:

    关于 Lisps 的一些想法,并非特定于 Clojure(我不是 Lisp 专家,所以我希望它们大多是正确和有用的):

    在 AST 中编码

    我对编译器或解释器理论知之甚少,但每次我在 Lisp 中编码时,都会让我感到惊讶,感觉就像直接构建 AST。

    这就是“代码 = 数据”含义的一部分,在 Lisp 中编码很像用 AST 节点填充数据结构(嵌套列表)。太棒了,而且它也很容易阅读(使用正确的文本编辑器)。

    一种可编程的编程语言

    所以代码块只是嵌套列表,列表操作是语言的一部分。因此,您可以非常轻松地编写生成 Lisp 代码的 Lisp 代码(请参阅 Lisp 宏)。这使得 Lisp 成为一种可编程(本身!)的编程语言。

    这使得在 Lisp 中构建 DSL 或解释器变得非常容易(另请参阅 meta-circular evaluation)。

    永远不要重启任何东西

    在大多数 Lisp 系统中,代码(包括文档)可以在运行时进行自省和热交换。

    高级 OOP

    然后,大多数 Lisp 系统都有某种派生自 CLOS 的对象系统,这是一种高级(与许多 OOP 实现相比)和可配置的对象系统(请参阅The Art of the Metaobject Protocol)。

    所有这些功能都是很久以前发明的,但我不确定它们在许多其他编程语言中是否可用(尽管大多数正在迎头赶上,例如闭包),所以你必须“重新发现”并习惯这些练习(参见其他答案中的书籍)。

    【讨论】:

      【解决方案3】:

      嗯,对我来说,我刚开始做 OCAML 时遇到了和你一样的问题,但诀窍是你必须开始考虑 你想从代码中得到什么和 不是 怎么做!!!

      例如,要计算列表元素的平方,忘记列表的长度等技巧,只需像这样数学思考

      • 如果列表为空 -> 我完成了

      • 如果不是,那么列表必须有头和尾 -> 你计算头的平方,然后让你的函数对尾做同样的事情。

      想想一般情况和基本情况,你是在发送数据而不是修改它(除非你想修改它;))。

      祝你好运!

      【讨论】:

        【解决方案4】:

        【讨论】:

          【解决方案5】:

          简单!

          M-x lisp-mode

          好的,好的,所以你的大脑可能没有 Emacs。说真的,你需要做的是真正擅长递归。当试图将递归的概念扩展到规范示例之外时,这可能是一个相当大的脑筋急转弯,但最终它会导致更流畅、更简洁的代码。

          另外,很多人都被括号挂断了,我真的不知道为什么 - 语法非常简单和一致,可以在几分钟内掌握。对我来说,在学习了 C++ 和 Java 之后,我来到了 Scheme,我一直认为“函数”和“运算符”之间的区别是一种错误的二分法,看到这种区别被消除了,我感到很振奋。

          就函数式编程而言,只要您能够理解函数是一等值并且可以传入和传出其他函数的事实,那么您应该没问题。随着时间的推移,它的用处会变得很明显,但是你可以编写函数获取和函数返回函数就足够了。

          最后,我不确定 Clojure 对宏有什么支持,但它们被认为是 lisp 的重要组成部分。但是,在您对上述项目非常熟悉之前,我不会担心学习它们 - 尽管宏非常有用且用途广泛,但与我提到的其他技术相比,它们的使用频率也较低。

          【讨论】:

            【解决方案6】:

            除了其他 SO'ers 已经提出的建议,这里是我的 2 美分:

            1. 开始学习该语言并尝试该语言中的一些简单的数字/爱好问题
            2. 重要提示:将解决方案/代码发布到 StackOverflow,征求人们的意见,这是否真的是 LISPy 的方式

            祝你好运!

            【讨论】:

              【解决方案7】:

              我会看看 Programming Clojure。这是一本适合非 lispers 的好书。

              【讨论】:

                【解决方案8】:

                谁说它会点击? 我总是很困惑

                但是,如果您考虑在 lisp 宏后面可以隐藏多少抽象。然后你的大脑就会爆炸。

                :)

                【讨论】:

                  【解决方案9】:

                  写一些Lisp擅长的简单经典函数,比如

                  • 反转列表

                  • 判断一个原子是否在 s 表达式中的某处

                  • 写 EQUAL 来判断 2 个 s 表达式是否相等

                  • 编写 FRINGE 以获取 s 表达式边缘的原子列表

                  • 先写SUBST,再写SUBLIS

                  • 符号分化

                  • 代数化简

                  • 编写一个简单的 EVAL 和/或 APPLY

                  了解 Lisp 非常适合这类无副作用的函数式程序。

                  它对于有状态的副作用(非功能性)程序也很有用,但它们更像是“程序”而不是“函数”。

                  对于给定的应用程序哪个更好取决于应用程序。一般来说,它包含的状态信息不应少于或多于必要的信息。

                  【讨论】:

                    【解决方案10】:

                    对我来说,重要的是确保你以“lisp-y”的方式做每一件事。不要想‘在 Java 中我会在这里使用 for 循环,我如何在 Lisp 中执行 for 循环?但是要通过足够多的示例和教程(正如有人指出的那样,SICP 非常适合此),您可以开始发现代码看起来“Lisp-y”并识别通用语言范例。

                    我当然知道查看我刚刚编写的一些代码的感觉,并且直观地知道它对于该语言和平台/框架是正确的惯用语 - 我认为这就是它“点击”的时候。

                    编辑:感谢选择函数式语言,较小的学生会在 Java 中完成 :)

                    【讨论】:

                      【解决方案11】:

                      如果您还没有,请阅读是什么让 lisp 成为一种独特的语言。如果您不首先这样做,您将尝试做与其他编程语言相同的事情。

                      然后尝试实现一些小东西(尝试让它对你有用,否则你可能没有动力)。

                      Lisp in a box 是让您的脚湿透的好方法。

                      【讨论】:

                        【解决方案12】:

                        祝你好运。在 Scheme “点击”之前,我花了大约一半的时间完成了大学的“编程语言”课程。然而,一旦发生这种情况,一切都变得有意义了,我爱上了函数式编程。

                        用 Lisp 编写一个 Lisp 解释器。

                        【讨论】:

                          【解决方案13】:

                          请记住:都是数据!

                          【讨论】:

                          • 一直是数据。 :)
                          【解决方案14】:

                          出于教育目的,我会推荐 PLT Scheme。这是一个可移植且功能强大的环境,具有非常好的示例和更好的文档。它将帮助您以非常简洁的方式一步一步地发现函数式编程背后的思想。选择一个小应用程序来实现将帮助您学习新语言。

                          http://www.plt-scheme.org/

                          此外,H. Abelssn、G. Sussman 和 J. Sussman 的“Structure and Interpretation of Computer Programs”是一本关于 Scheme(和编程)的非常好的书。

                          问候

                          mue

                          【讨论】:

                            【解决方案15】:

                            我个人的做法是找到一个小项目(可能需要 3-5 晚才能完成)并实施它。博客过滤工具怎么样?也许只是河内塔或链接列表的实施(这些通常是一晚的项目)。

                            通常的解决方法是我第一次实施得很糟糕,扔掉了我拥有的东西,最后点击了几个小时。

                            一个巨大的帮助是参加类似...嗯... LISP 的课程! :) 作业将迫使您面对很多概念,并且在学期结束之前很久就对我产生了影响。

                            祝你好运!

                            【讨论】:

                              【解决方案16】:

                              我会从一种可以解释的语言开始。我发现Moscow ML 相当容易。它是标准 ML 的轻量级实现。

                              【讨论】:

                              • 强类型可能是一个障碍。如果它不打扰你,太棒了!美妙的语言,恕我直言。
                              • 我在学习编程时发现它很有帮助,因为您需要思考程序要做什么以及将使用什么类型来实现它。作为副作用,您将学习编程类型安全。现在对 Java 非常有用。
                              • “我会从一种可以解释的语言开始”——你的意思是,像 Clojure 一样?
                              • 没错!但我不知道为什么要推出一个完整的 JVM 只是为了使用一种函数式编程语言。但我想这是个人喜好。
                              【解决方案17】:

                              这有点像骑自行车,只是需要练习。尝试用它解决一些问题,也许是ProjectEuler,最终它会点击。

                              有人提到了《小阴谋家》这本书,这本书很好读。虽然它针对的是 Scheme,但实际问题值得解决。

                              祝你好运!

                              【讨论】:

                                【解决方案18】:

                                您可以查看The Little Schemer

                                【讨论】:

                                  猜你喜欢
                                  • 2010-11-08
                                  • 1970-01-01
                                  • 2016-11-30
                                  • 1970-01-01
                                  • 2011-10-20
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多