由浅入深学习 Lisp 宏之实战篇

上一篇文章中,介绍了宏(macro)的本质:在编译时期运行的函数。宏相对于普通函数,还有如下两条特点:

  1. 宏的参数不会求值(eval),是 symbol 字面量

阅读全文

由浅入深学习 Lisp 宏之理论篇

宏(macro)是 Lisp 语言中最重要的武器,它可以自动生成运行时的代码。宏也是编写领域特定语言(DSL)的利器,可以在不改动语言本身的基础上,增加新的程序构造体,这在其他语言中是不可能。比如,现在比较流行的同步方式写异步代码的 async/await,在非 Lisp 语言需要语言本身支持,但是在 Lisp 里面可以通过几个宏来解决,可以参考:core.async

阅读全文

《硅谷之谜》读后感

吴军博士的《硅谷之谜》 在年前就买了,可是一直迟迟没翻开。最近在一次出差的动车上把它看完了,可以说是一气呵成,根本停不下来,里面介绍的很多观点都比较深刻,而不仅仅是简单的罗列事实,更像是科学探究,试图找出每一个事情背后的原理。

阅读全文

Clojure Web 开发-- Ring 使用指南

在 Clojure 众多的 Web 框架中,Ring 以其简单统一的 HTTP 抽象模型脱颖而出。Ring 充分体现了函数式编程的思想——通过一系列函数的组合形成了一个易于理解、扩展的 HTTP 处理链。

阅读全文

“玩转” 技术面试——链表的函数表示法

简介

《Acing the technical interview》,老外写的白板面试的调侃文,声色并茂,兼具叙述文的生动与技术文的抽象。文中用函数来模拟链表的表示法我在《编程语言的基石——Lambda calculus》里面有深入讲解,感兴趣的读者可以参考。本文最后,给出了 Python、Ruby 语言中链表的函数表示。

阅读全文

辨析 Ruby 中的 Method 与 Proc

Ruby is simple in appearance, but is very complex inside, just like our human body.

– Matz https://www.ruby-lang.org/en/about

阅读全文

Clojure 运行原理之字节码生成篇

上一篇文章讲述了 Clojure 编译器工作的整体流程,主要涉及 LispReader 与 Compiler 这两个类,而且指出编译器并没有把 Clojure 转为相应的 Java 代码,而是直接使用 ASM 生成可运行在 JVM 中的 bytecode。本文将主要讨论 Clojure 编译成的 bytecode 如何实现动态运行时以及为什么 Clojure 程序启动慢,这会涉及到 JVM 的类加载机制。

阅读全文

Clojure 运行原理之编译器剖析篇

Clojure is a compiled language, yet remains completely dynamic – every feature supported by Clojure is supported at runtime.

阅读全文

2016 年终总结

又到一年总结时,本来想着在农历年前考完科目三拿到驾照后再写的,目前来看希望不大了,这个目标只能留在17年去实现了,有种书到用时方恨晚的感觉。
一个词来总结 16 年——“运动元年”,算是完成了 15 年一小目标。OK,下面简单回顾下 16 年那些“重大事件”吧。

阅读全文

Clojure 开发那些事

Clojure —— 新世纪的 Lisp 方言,相信大多数同学多多少少都听过,毕竟有个杀手级应用 Storm,但是真正去写 Clojure 的同学估计不多,国内也罕见哪个公司招 Clojure 程序员。
作为推广 Clojure 万里长城的第一步,这篇文章首先介绍为什么要使用 Lisp 开发,之后开始介绍 Clojure 语法入门,紧接着介绍 Clojure 开发环境搭建,然后介绍使用第三方库时的一些注意点,最后介绍一下常见的测试方法。本篇文章所介绍内容都是我自己实践得出,不足之处请各位 Clojurians 指出。

阅读全文