如何让我的大脑进入“Lisp模式”?

24

我的教授告诉我们可以为下一次编程作业选择一个编程语言。我一直想尝试一下函数式编程语言,所以我决定试试Clojure。问题在于,我理解语法和基本概念,但是我在让所有东西在我的脑海中"点击"方面遇到了问题。是否有人有什么建议?或者我可能选择了错误的语言来开始函数式编程?


坚持下去!转向函数式编程需要一点思维上的转变。我还没有看到任何简单的方法让它“顿悟”——只要足够学习,就会理解! - MichaelGG
1
http://www.4clojure.com/ 上的在线问题非常棒 - 解决测试用例,然后研究其他人是如何解决它们的。 - mikera
18个回答

16

就像骑自行车一样,掌握它需要练习。试着用它来解决一些问题,也许可以尝试一下ProjectEuler,最终你会懂的。

有人提到了《The Little Schemer》这本书,非常值得一读。虽然目标是Scheme语言,但实际的问题都值得去尝试解决。

祝好运!


14

对我来说,在开始使用OCAML时,我遇到了与您同样的问题,但诀窍在于您必须开始思考 您希望代码实现什么 ,而不是如何实现它!!!

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

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

  • 如果不是,则该列表必须有一个头部和尾部-> 您可以计算头部的平方,然后请求函数对尾部执行相同的操作。

只需考虑一般情况和基本情况,以及您正在发出数据而不是修改它(除非您想修改它;))。

祝你好运!


6

5

4

出于教育目的,我建议使用PLT Scheme。它是一个便携且功能强大的环境,有非常好的示例和更好的文档。它将帮助您逐步清晰地了解函数式编程背后的思想。选择一个小应用程序来实现将有助于您学习新语言。

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

此外,H. Abelssn、G. Sussman和J. Sussman的《计算机程序的构造和解释》是一本关于Scheme(和编程)非常好的书籍。
问候,
mue

4

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

在AST中编码

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

这就是“代码=数据”意味着的部分,使用Lisp编码很像使用AST节点填充数据结构(嵌套列表)。令人惊叹,并且它也很容易阅读(使用正确的文本编辑器)。

可编程编程语言

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

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

永远不要重新启动任何东西

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

高级OOP

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

所有这些功能都很久以前发明了,但我不确定它们在许多其他编程语言中是否可用(尽管大多数正在赶上,例如使用闭包),因此您必须通过实践“重新发现”并适应这些功能(请参见其他答案中的书籍)。


4

3
只需记住:这一切都是数据!

数据无处不在。 :) - Domchi

2

编写一些Lisp擅长的简单经典函数,例如:

  • 反转列表

  • 判断原子是否在s表达式中

  • 编写EQUAL函数,用于判断两个s表达式是否相等

  • 编写FRINGE函数,用于获取s表达式边缘的原子列表

  • 编写SUBST函数,然后编写SUBLIS函数

  • 符号微分

  • 代数化简

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

了解到Lisp适用于这些无副作用的函数程序。

它也适用于有状态副作用(非函数式)程序,但这些更像是“程序”而不是“函数”。

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


2

简单!

M-x  lisp-mode

好的,好的,也许你的大脑里没有Emacs。但是说真的,你需要做的是变得非常擅长递归。一开始尝试将递归的概念扩展到非经典示例之外可能会有些困难,但最终它将导致更流畅、更Lispy的代码。

此外,很多人对括号感到困惑,我不知道为什么——语法非常简单和一致,可以在几分钟内掌握。对我来说,在学习了C++和Java之后,我一直认为“函数”和“运算符”的区别是一种虚假的二分法,看到这种区别被消除是令人耳目一新的。

就函数式编程而言,只要您能理解函数是一等值并且可以传递到其他函数中和从其他函数中返回,您就应该没问题。这种用法随着时间的推移会变得清晰明了,但足以编写接受函数和返回函数的函数。

最后,我不确定Clojure对宏的支持如何,但它们被认为是Lisp的基本部分。然而,除非您对上述项目非常熟悉,否则不要担心学习它们——尽管宏非常有用和多才多艺,但它们使用的次数比我提到的其他技术少。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接