actor 模式与 transducer 的关系——进一步思考

2016-07-28
阅读 2 分钟
3.3k
显然,actor 本身实现中用函数来进行循环与 transducer 的思想高度一致。实际上,两者都通过封装状态来实现了纯函数化的外在表现。由于 transducer/transformer 在 clojure 中已经被实现为通用的模式,我们是否还有必要来使用 actor 呢?

clojure 中使用 actor

2016-07-26
阅读 2 分钟
3.8k
Actor 模型 是让 Earlang 声名卓著的关键特性。它是 Erlang 平台实现分布式编程的关键内容,在 Clojure 语言设计时, Rich Hickey 考虑过在 Clojure 语言中是否实现 Actor,他最终认为:这仅仅是适合于分布式编程的一种特征,如果成为语言的本质,将限制 Clojure 成为一种服务器领域语言,因此他决定使用其他更简单直接...

Clojure 的身份与状态思想

2016-06-07
阅读 1 分钟
2.2k
Clojure 语言中没有简单的变量。但 Clojure 却声称最擅长管理状态,为什么?靠的是仔细设计的状态类型们,其中最引人注目和最常用的是 Atom 和 Ref(ClojureScript 中不可用)。

配置迷思

2016-04-08
阅读 1 分钟
1.9k
几乎每个程序都需要处理一些配置。这些配置可以有各种形式: 通过系统属性或者环境变量,呈简单的 x = y 通过配置文件,例如 .properties 文件,.ini 文件,.yml 文件,.edn 文件。 通过高大上的配置平台,例如 etcd, zookeeper 等。 但最影响程序设计的并非这些形式,而是如何在程序中使用这些数据。 最直接的想法是用...

典型 Clojure 工作过程

2016-01-30
阅读 1 分钟
3.8k
许多 Java 程序员在开始写 Clojure 程序的时候,将写 Java 程序的工作习惯一道带了过来。但是,这两种语言是非常不同的,在 Java 方面工作良好的工作习惯,却不能发挥出 Clojure 的威力。

clojure 中文标识符

2015-11-19
阅读 1 分钟
2.6k
对于英文水平马马虎虎的中国程序员来说,使用 clojure 语言比起 Java 来说,还有一个额外的好处:clojure 程序中中文是合法的字符,可以替换任何英文字符。例如:

docker 简介

2015-08-10
阅读 1 分钟
2.6k
Docker 是 Linux 下的“轻量化虚拟”,是一种虚拟化容器。对于容器中的程序来说,它看起来就像是一个彻底的虚拟机或者彻底的硬件系统一样,拥有自己的文件系统、网络系统,自己的操作系统和配置,与实际硬件上跑的其他的容器中的进程互不可见,只能通过网络进行通信。但它与传统的 kvm 等硬件虚拟技术很不同:

搭建本地的 vm 开发测试平台: vagrant

2015-08-08
阅读 2 分钟
3.3k
服务器开发现在经常涉及分布式系统,不再是仅仅管理好自己的进程就可以了,需要管理进程间的协作,服务器间的协作。这就需要启动多个 vm,没有一个自动化的方案,这个过程会非常烦人。

Midje 测试框架

2015-04-24
阅读 1 分钟
2.4k
Clojure 内置了测试框架 clojure.test,它很简单好用。但喜欢其他测试风格的人们也完成了不少其他框架。例如 Midje。它的设计目标是支持从顶到下的测试,很容易写出隔离调用的真正的单元测试:

程序在哪里集成?

2015-04-23
阅读 2 分钟
2.7k
不管我们的程序写了多少漂亮的模块,最终它总是要集成的,将不同来源的输入,如用户输入、网络服务的结果、数据库保存的数据,经过各种各样的业务处理,输出成观众喜闻乐见的输出格式。

让 bug 越早暴露越好 (1)

2015-03-17
阅读 2 分钟
3.3k
预期之外的用户输入或系统输入。典型的缓冲区越界、SQL 注入等攻击手段,或者网络异常等。它的特点是在通常的用户输入时,程序表现得非常正常;但对于不普通、或者异常的用户输入没有做任何防御。

设计:选择恰当的类型

2015-01-12
阅读 1 分钟
2.2k
程序员整天在和各种值和变量在打交道。变量类型似乎是一种不用动脑筋的选择:名字 name 应该肯定是字符串吧?重量 weight 肯定是一个浮点数?

TDD 单元测试测什么?

2014-11-10
阅读 1 分钟
4k
在我们的项目中常常有数据库的身影出没。如何测试数据库相关的内容,就成了一个重要的问题。 传统的 SQL 数据库程序与数据库是通过字符串—— SQL 语句来交互的。这让组合、重用变得非常困难,因为涉及解析和字符串组合。 对于 Clojure 界新型数据库 Datomic,程序是直接用 Clojure 数据结构来与它交互的: 如果要改变数据...

完美的编程节奏

2014-10-15
阅读 2 分钟
3.7k
超爽感觉 写程序的时候最爽的感觉可能就是一切顺利了: 每段代码一写出来就立即可以工作。 自己心里对于新代码的工作能力极为自信。 不会被 bug 或者一个问题卡住,而是不断向前进展,即使遇到问题也可以在很短时间搞定 在我们有这些感觉的时候,往往也是生产力最高的时候,而且结果一般也非常好。反之,我们代码磕磕绊...

Intellij + Cursive: 最佳 Clojure/Java 开发环境组合

2014-09-26
阅读 1 分钟
13.5k
几乎从 Clojure 诞生时候起,它的标准开发环境就是 Emacs,对 Lisp 的亲近感、slime 对 Lisp 系列语言的支持、paredit 等 Lisp 的模式,都带来了这个结果。当然,用 Emacs 开发的逼格也很高。 坏处当然也有一票。最大的几个:

不规范的命名带来的 maven 问题

2014-09-14
阅读 1 分钟
6.1k
不过,这个命名是不规范的:maven 实际要求 groupId 应该是全部小写(就像 Java 包名一样)。过去这样的不规范命名好像没啥问题,但如果恰巧你还有一个叫做 hjdserver 的小写 groupId,maven 会认为这是同一个,而在 install 的时候默默地把文件复制进这个文件夹。你在其他地方引用的时候就会非常郁闷地发现找不到了!

初尝 core.typed

2014-09-06
阅读 1 分钟
2.4k
core.typed 是一个有趣的项目:它试图给 duck type 的 clojure 语言加上一个可选的类型系统。这个类型系统与 Haskell 语言的类型有些相似,比 Java/C++ 等语言的类型系统要强大得多:毕竟 Clojure 是一个函数式语言。例如:

区分 procedure 和 function:返回值是函数最大的资产

2014-06-24
阅读 2 分钟
4.3k
在当年流行的学院式语言 Pascal (也是我第一种实际使用的语言)中,特意区分了有无返回值的过程:有返回值的是 function (函数),无返回值的叫做 procedure (过程)。对于过程式的语言,procedure 意味着必须通过某种全局变量或者直接的 IO 过程来实现它的目标,当然是邪恶的了。这也是区别这两种语义的设计原因。对于 P...

创建 datomic 的数据库函数

2014-06-22
阅读 1 分钟
3.7k
这样实现的好处不只是使用 ' 来创造 quote 的代码,它的另一个玄机在于它返回了一个真正的函数!这个 add-doc 是可以在你的本地代码上调用的,这让单元测试数据库函数成为可能。

Datomic 的几个简单处理函数

2014-06-20
阅读 2 分钟
2.7k
这几个函数能增加一点数据库结构的可读性,简单地省掉一些键盘时间: {代码...} 下面这个数据库函数是传统的数据库上必不可少的: {代码...} 使用例子 {代码...}

程序基本设计可以犯的最大错误

2014-06-20
阅读 1 分钟
3.9k
我们让用户输入自己的年龄。当然在数据库中设计一个年龄字段。看起来很普通,是吗?但如果你没有同时在这条记录中加上一个输入日期字段,你实际上就丢失了信息。当然,更好的输入设计是让用户输入出生日期。之所以如此,是因为年龄不是一个基本事实信息,它不过是出生日期这个基本事实的递延数据。

推敲你的函数参数表

2014-06-18
阅读 2 分钟
3.3k
“推敲”这个词来源于唐朝诗人贾岛的故事,说他为诗中的“推”“敲”一字之差,反复思索。 Clojure 程序的基础是函数,函数和使用者唯一的合同是它的参数表,我们 Clojure 对待它也应该有推敲的精神! 不应该有不被引用的参数 这看起来是显然的,但我们经常就在反复改动一个函数实现的时候,忘记检查它有没有没有用的参数。 参...

穷人的错误检查器

2014-06-17
阅读 1 分钟
2.5k
Clojure 是一个 duck type 语言,编译器检查很少。一段程序通过编译器也非常容易。尽管如此,我们提交代码前却往往连每段程序送进编译器这点事情都没有做。把这件小事加入到最基本的持续集成工作,既很容易,也经常能起到作用。

使用 System Façade 开始重构程序

2014-06-17
阅读 3 分钟
2.5k
我这次的重构工作就面临这样的麻烦。在动手之前,我知道必须非常谨慎。重构工作中常常遇到的诱惑是可以改进的地方太多,我经常会抵抗不住这些诱惑顺手改动几个,可是这是有风险的,我很可能会在哪里犯下一点小错误,但在没有保护的情况下代价巨大。所以我知道我必须对一些小的毛病视而不见,甚至准备好用这程序当前的风...