24

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

4

18 回答 18

16

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

有人提到了《小计谋者》这本书,这是一本很好的读物。尽管它针对的是 Scheme,但实际问题还是值得解决的。

祝你好运!

于 2009-03-03T14:30:23.647 回答
14

好吧,对我来说,当我开始做 OCAML 时,我遇到了和你一样的问题,但诀窍是你必须开始思考你想要从代码中得到什么,而不是 如何去做!!!

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

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

  • 如果没有,那么列表必须有头和尾->您计算头的平方,然后要求您的函数对尾执行相同的操作。

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

祝你好运!

于 2009-03-03T16:30:16.247 回答
6

你可以看看The Little Schemer

于 2009-03-03T14:21:02.313 回答
5

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

这是从常规命令式程序员(Java、C# 等)的角度对 lisp 进行思考的非常简单的分步介绍。

于 2009-10-27T22:56:00.817 回答
4

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

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

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

问候

于 2009-03-03T14:40:58.117 回答
4

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

AST 中的编码

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

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

一种可编程的编程语言

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

这使得在 Lisp 中构建DSL或解释器变得非常容易(另请参见元循环评估)。

永远不要重启任何东西

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

高级面向对象

然后,大多数 Lisp 系统都有某种派生自 CLOS 的对象系统,这是一种高级(与许多 OOP 实现相比)和可配置的对象系统(请参阅元对象协议的艺术)。

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

于 2009-03-03T15:48:20.653 回答
4

看看99 个 Lispy 问题

于 2009-03-25T06:22:00.813 回答
3

请记住:都是数据!

于 2009-03-03T14:44:56.670 回答
2

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

  • 反转列表

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

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

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

  • 写 SUBST,然后写 SUBLIS

  • 符号分化

  • 代数化简

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

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

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

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

于 2009-03-03T17:45:26.283 回答
2

简单的!

M-x  lisp-mode

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

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

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

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

于 2009-03-04T03:32:48.260 回答
1

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

于 2009-03-03T14:31:03.240 回答
1

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

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

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

祝你好运!!

于 2009-03-03T14:38:27.153 回答
1

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

用 Lisp 编写一个 Lisp 解释器。

于 2009-03-03T14:55:46.677 回答
1

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

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

盒子里的 Lisp是让你的脚湿透的好方法。

于 2009-03-03T15:14:46.443 回答
1

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

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

:)

于 2009-03-03T17:24:59.127 回答
1

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

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

编辑:选择函数式语言的荣誉,较小的学生会用Java完成它:)

于 2009-03-03T17:34:45.607 回答
1

我会看看 Programming Clojure。对于非 lispers 来说,这是一本很棒的书。

于 2009-03-03T17:58:22.650 回答
1

除了其他 SO'ers 已经建议的内容之外,这是我的 2 美分:

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

祝你好运!

于 2009-03-04T03:16:12.903 回答