前言
最近因为用emacs了解到了Lisp这个语言。网上一查,神的编程语言云云,那叫一个天花乱坠。说实话,确实有种激动与希望,但神不神的我估计也感觉不到,也许就像emacs一样,用了两天也就光觉着麻烦了。但话又说回来,在网上众多的吹嘘声中,有两点很有吸引力:
- Lisp本意并非作为实用编程语言,而是一种基于所谓Lambda Calculus的数学玩具。却也因其与数学的密切关系,令其拥有了超脱时代经久不衰的活力。用常闻其名却不识其人的“阮一峰”大佬翻译Paul Graham的话说:越是靠后出现的语言,其形式越像Lisp。1
- Lisp作为一种动态语言(貌似是吧),其相当一部分的计算中,性能已经逼近需要编译的C、CPP等静态语言。
我擅自将上述两点相互关联,心想这Lisp正是与数学相辅相成互利共生,才让我等无数凡人直呼“神”。那么,被数学虐待千百遍却仍待数学如初恋的我恐怕确实有必要去了解尝试,期冀着能打通我这数学与编程的任督二脉,赐我一眼难以枯竭的快乐之泉。
就这样,挖个坑,希望能填上。
啥是Lisp?
Common Lisp:一种方言
在Common Lisp中,语法主要由称为S表达式(S-expression)的元素构成,而S表达式只可能是原子或列表。
- 原子
- 数字:一大类能够按照特定规则相互作用的元素。
- 符号:除数字以外的一切能够相互作用的元素。
- 关键字:前缀一引号,
- 列表:一簇原子。
一个简单的栗子
输出"Hello, world!"
(format t "Hello, world!")
;;Output:
Hello, world!
NIL
多行注释
#|
这是一行注释
这又是一行注释
|#
(format t "这里回到代码了")
函数
有名函数
利用defun
的宏进行函数定义:
(defun fib (n)
"Return the nth Fibonacci number."
(if (< n 2)
n
(+ (fib (- n 1))
(fib (- n 2))))
随后就可以像调用其他任何元素一样调用它啦:
(fib 30)
;;Output
832040