From ef69d7bff7e5398012cd786ff66806e01b423609 Mon Sep 17 00:00:00 2001 From: Jerry Lee Date: Thu, 18 Oct 2018 14:12:43 +0800 Subject: [PATCH] improve wording for pragmatic-functional-programming --- README.md | 2 +- pragmatic-functional-programming/README.md | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 4891f8e..83db7d2 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ Chinese translations for classic IT resources. # `FP`/`Clojure`/`Lisp` 1. [务实的函数式编程](pragmatic-functional-programming/README.md) - `Bob`大叔对`FP`在软件开发优点上务实的思考,引导大家理解、学习和学习`FP`,文章后半篇还用`FP`语言`Clojure`简约演示了一番。在文末不忘呼吁学习`FP`并推荐`Clojure`语言来上手感受。 + `Bob`大叔的短文,`FP`在软件开发优点上务实的思考,引导大家理解、学习和使用`FP`,文章后半篇还用`FP`语言`Clojure`简约演示了一番。在文末不忘呼吁学习`FP`,并推荐`Clojure`语言。 1. [**_Successful Lisp_** 中的`Lisp`书籍推荐](recommend-lisp-books/suggestions4further-reading-in-successful-lisp.md) - [`Lisp`书籍推荐和点评](recommend-lisp-books/README.md),由于`Lisp`与其它语言从**基本概念**就开始的差异,已有的语言经验反而是个学习阻碍,深入浅出的巧妙讲解对入门太重要了。 - 特别提这篇好文[【转】学习`Lisp`的书籍推荐](recommend-lisp-books/recommend-lisp-books.md) diff --git a/pragmatic-functional-programming/README.md b/pragmatic-functional-programming/README.md index 4e468ae..89a407c 100644 --- a/pragmatic-functional-programming/README.md +++ b/pragmatic-functional-programming/README.md @@ -5,7 +5,7 @@ ## 🍎 译序 -`Bob`大叔对`FP`在软件开发优点上务实的思考,引导大家理解、学习和学习`FP`,文章后半篇还用`FP`语言`Clojure`简约演示了一番。在文末不忘呼吁学习`FP`并推荐`Clojure`语言来上手感受。 +`Bob`大叔的短文,`FP`在软件开发优点上务实的思考,引导大家理解、学习和使用`FP`,文章后半篇还用`FP`语言`Clojure`简约演示了一番。在文末不忘呼吁学习`FP`,并推荐`Clojure`语言。 # 务实的函数式编程 @@ -13,7 +13,7 @@ 摩尔定律告诉过我们,每隔18个月计算机的速度就会翻倍。这个定律从60年代和2000年都是有效的。但是之后失效了。大家冷静想一下。时钟频率到达3G HZ以后不再快了,进入了平台期。这已经达到了光速的物理极限,而在芯片表面上的信号传播速度限制了计算速度。 -所以硬件设计师改变了策略。为了获得更大的吞吐量,在芯片上添加了更多的处理器(核心数);同时为了新加的核腾出空间,在芯片上去掉了很多缓存(`cacheing`)和流水线(`pipelining`)硬件。结果是,单个处理器是比之前的要慢一些的;但是由于有了更多的处理器,吞吐量仍然是提升的。 +所以硬件设计师改变了策略。为了获得更大的吞吐量,在芯片上添加了更多的处理器(核心数);同时为了给新加的核腾出空间,在芯片上去掉了很多缓存(`cacheing`)和流水线(`pipelining`)硬件。结果是,单个处理器较之前要慢一些;但是由于有了更多的处理器,吞吐量仍然是提升的。 > 【译注】:关于流水线(`pipeline`)参见[指令流水线(`instruction pipeline`) - zh.wikipedia.org](https://zh.wikipedia.org/wiki/%E6%8C%87%E4%BB%A4%E7%AE%A1%E7%B7%9A%E5%8C%96)。 @@ -51,7 +51,7 @@ 你可能见过`Lisp`程序,不过不喜欢这些括号。也可能你不喜欢`CAR`、`CDR`和`CADR`。别担心。`Clojure`有着比`Lisp`更多的符号,所以括号相对少一些。`Clojure`用`first`、`rest`和`second`代替了`CAR`、`CDR`和`CADR`。此外,`Clojure`基于`JVM`,完全可以使用所有的`Java`库和任何其他你想要的`Java`框架和库。与`Java`互操作性快速而便捷。更好的是,`Clojure`能够使用`JVM`所有的面向对象功能。 -『等一下!』你可能会说,『`FP`和面向对象是相互不兼容的!』谁告诉你的?胡说八道!在`FP`中,你的确无法改变一个对象的状态。但是那又怎么样呢?就像`push`一个整数栈后会返回一个新的栈,当调用一个方法调整一个对象的值时,返回的是一个新对象而不是改变原来的对象。一旦你习惯了这样的做法,处理起来是很容易的。 +『等一下!』你可能会说,『`FP`和面向对象是相互不兼容的!』谁告诉你的?胡说八道!在`FP`中,你的确无法改变一个对象的状态。但是那又怎样呢?就像`push`一个整数进栈后会返回一个新的栈,当调用一个方法调整一个对象的值时,返回的是一个新对象而不是改变原来的对象。一旦你习惯了这样的做法,处理起来是很容易的。 再回到面向对象。我觉得面向对象最有用的一个特性,在软件架构层面,是动态多态性(`dynamic polymorphism`)。`Clojure`提供了对`Java`动态多态性的完全的使用能力。举个例子解释起来可能最方便: @@ -70,7 +70,7 @@ public interface Gateway { } ``` -在`JVM`层面所生成的字节码是完全相同的。实际上,`Java`写的程序可以实现这个`interface`,就像这个`interface`是用`Java`写的一样。对等的,`Clojure`程序也可以实现一个`Java`写的`interface`。看起来大概像这样: +在`JVM`层面所生成的字节码是完全相同的。实际上,`Java`写的程序可以实现这个`interface`,就像这个`interface`是用`Java`写的一样。对等的,`Clojure`程序也可以实现一个`Java`写的`interface`。看起来大概这个样子: ```clojure (deftype Gateway-imp [db] @@ -82,9 +82,8 @@ public interface Gateway { (public-episodes db))) ``` -注意构造函数的`db`参数,以及所有的方法是如何访问它的。在上面的例了中,接口的实现只是简单地委托给了一些本地函数,并传递上`db`。 +注意构造函数的`db`参数,以及在方法中是如何访问这个参数的。在上面的例子中,接口的实现只是简单地委托给了本地函数,并传入`db`参数。 -(也许)最大的优点,来自于`Lisp`进而也是`Clojure`的,那就是 —— **同像性**(`Homoiconic`),是指代码本身就是程序能够操作的数据。这点不难看出。下面的代码:`(1 2 3)` 表示一个三个整数的列表。如果该列表的第一个元素变成了一个函数,也就是`(f 2 3)`,那么它就变成了一个函数调用。可见,在`Clojure`中所有的函数调用都是列表,而列表可以直接被代码操作。所以,一个程序也可以构造和执行其它的程序。 - -最后说一句,`FP`是重要的。你应该去学习。如果你还在想你应该用哪个语言来学`FP`,我推荐`Clojure`。 +(也许)最大的优点,来自于`Lisp`进而也是`Clojure`的,那就是 —— **[同像性](https://www.wikiwand.com/zh/%E5%90%8C%E5%83%8F%E6%80%A7)**(`Homoiconic`),是指代码本身就是程序能够操作的数据。这点不难看出。下面的代码:`(1 2 3)` 表示一个三个整数的列表。如果该列表的第一个元素变成了一个函数,也就是`(f 2 3)`,那么它就变成了一个函数调用。可见,在`Clojure`中所有的函数调用都是列表,而列表可以直接被代码操作。所以,一个程序也可以构造和执行其它的程序。 +最后说一句,`FP`是重要的。你应该去学习。如果你还在纠结要用哪个语言来学`FP`,我推荐`Clojure`。