学习Clojure

  1. 纯函数—对于给定的输入,函数始终返回相同的输出,而不更改任何其他变量。 将函数应用于输入数据以将数据从一种状态转换为另一种状态
  2. 不变性-对对象的任何更改都不会更改现有值,而是返回具有更改的新对象
  3. 引用透明性-永远不会更改传递给函数的变量的值
  4. 使用表达式—在OOP / Omping编程代码中,代码表示为具有本地分配的语句(对引用进行突变)。 由于FP无法对数据进行变异,因此无法为变量赋值,因此FP使用表达式来求结果。
  5. 尾递归—您必须听说过递归,但不确定尾递归。 在递归中,对结果的评估从最后一次递归调用的返回开始,并且所有中间函数都被堆叠以供以后执行。 众所周知,堆栈的大小有限。 使用具有不变性的递归意味着创建更多变量和函数调用,这将导致堆栈溢出错误。 To正是为什么使用尾部递归而不是递归的原因。 两者之间的唯一区别是对结果的评估从第一个函数调用开始,结果在下一个函数调用中传递。 有限的对象创建和函数调用。 请参阅此处http://sercanulucan.com/blog/2017/01/four-ways-of-fibn-with-clojure/
  6. 函数是一流的实体—您可以想到的任何问题都始于可以通过一组函数传递以达到数据结束状态的数据。
  7. 高阶函数-可以返回函数并将函数作为参数传递给其他函数。
  8. 并发性和并行性-由于具有不变性和参照透明性,因此可以在多个线程之间使用变量,而不会产生任何副作用。

请参考此处以找到这些概念的详细说明。 您对这些概念了解得越多,学习clojure就会越容易。

带走— Clojure的基础很强,很容易

概念2:Clojure是动态的编译语言。 在JVM上运行

动态和能够编译是强大的组合。 前者提供了编写代码的灵活性,而后者则使其执行效率更高。

Jvm接收字节码并将其转换为机器可理解的代码。 不管谁产生字节码或后面使用哪种语言。 在Java中,编译器将高级代码转换为字节码。 在Clojure中,使用读取器将代码转换为数据结构,然后将其馈送到clojure编译器以转换为字节码。

在jvm上运行提供了在Clojure代码中使用Java库的额外优势,而不必重写很多现有的东西

请参阅此处以找到详细说明

带走—除非绝对必要,否则不要重新发明轮子

概念3:Clojure使用不可变的数据结构

您是否想过使用不可变ds是否足够有效? 不变性不是意味着创建更多的对象和频繁的垃圾回收吗? 不变性如何实现?

这些是尝试学习新语言时要问的正确问题

这是有关幕后不变性的详细说明的链接

概念6:代码就是数据;数据就是代码

是的,你没有看错。 您是否想知道代码如何成为数据?

作为一种声明性语言,它遵循一种表达性语法。 该语法易于遵循,并且在评估期间具有优势。 Clojure代码可以区分为符号或文字。 文字是保存数据的东西,而符号是数据或操作的名称。 在评估期间,clojure读取器会识别这些符号和文字并将其转换为数据结构。 现在您的代码就是数据

请参阅此处以找到详细说明

概念7:clojure中的破坏

在编写代码时,声明变量确实需要花费一些时间。 有时,使用过多的声明会使您的代码变得复杂。 Clojure具有解构的概念,用于在函数参数或单行中声明变量。 这使代码易于阅读且不那么复杂

请参阅此处以找到详细说明

概念:Clojure中的宏

Clojure的优点在于,它鼓励思考编码的“什么”部分而不是“如何”。 大多数现有的宏(即现有的宏函数)即使函数可重用的方法,都已经弄清楚了“如何”。

参考宏以查找详细说明

概念4:Clojure是为并发和并行而构建的

非功能语言需要付出额外的努力才能实现并发和并行性。 就像clojure一样,线程管理的三个地精问题是在语言的核心以不变性和STM(软件事务性存储)来处理的。

与并发,

  1. 将来-为任务创建一个新线程并使当前线程成为非阻塞
  2. 延迟-按需执行任务
  3. 承诺-完成任务后,结果可以实现承诺

实现并行化,

  1. Pmap —并行处理地图

请参阅此处以获取详细说明

阅读完所有这些主题后,请勇敢地阅读Clojure,并深入了解Clojure中的每个主题。 这是Clojure爱好者必读的书。 跟随我将来的帖子,对此处提到的每个主题进行详细讨论。

谢谢阅读…。

参考文献

  1. https://hypirion.com/musings/understanding-persistent-vector-pt-2
  2. https://zh.wikipedia.org/wiki/Functional_programming
  3. https://clojure.org/guides/learn/syntax
  4. https://yogthos.github.io/ClojureDistilled.html
  5. https://hypirion.com/musings/understanding-persistent-vector-pt-1
  6. http://sercanulucan.com/blog/2017/01/four-ways-of-fibn-with-clojure/
  7. https://spin.atomicobject.com/2013/07/23/homoiconicity-clojure-macros/
  8. https://clojure.org/guides/destructuring
  9. https://www.braveclojure.com/read-and-eval/
  10. https://www.braveclojure.com/concurrency/
  11. https://www.braveclojure.com/