因 AI 而设计的语言 LISP
前言(Lisp 可以做别人告诉你不可能做的事)
LISP(List Processing)由来自麻省理工学院的人工智能研究先驱 约翰·麦卡锡(John McCarthy)在1958年基于 「λ演算」 所创造,采用抽象数据列表与递归作符号演算来衍生人工智能。
创造力
语言是和人相关的,真正有创造力的人不多,大部分人都是应用。语言的核心人物如果不创造出来方便普通人应用的基础,那么就没人用这个语言了。虽然 Lisp 中不缺乏共享资源,但让普通人容易使用的不多,有探索精神的人在人群中比例是很小的,大部分人一听说 Lisp 用的少,就把 Lisp 剔除了。
语言和时代
Lisp 有其辉煌的历史,但时代跟 Lisp 开了个玩笑。十几年前估计没几个人看好 Javascript,可是 Javascript 现在却风生水起。Lisp 同样会像 Javascript 一样由于时代的不同,而重新被人认知。(这点是存在争议的,我会在另一篇文章中说明争议性。
抽象世界和现实世界
Lisp 几乎不是一门语言,而是可以构造一个世界的规则。Lisp 强大到可以构造自己的一个世界,然后活在这个世界里。这个世界和现实世界本身就是一对矛盾,自然就存在两个世界如何对应的问题。
语言特点
- LISP 为「函数式程序设计」语言,所有运算都能以函数作用于参数的方式来实现。
- LISP 没有命令式语言程序中常见赋值语句和变量,重复的过程可以使用递归的函数调用来表示,并不需要使用循环模式。
- LISP 是古老的函数语言、弱类型、动态推断,其代码本身就是各种列表。每一个表项均可以储存任何类型的数据如数字、函数、符号或一个子表等,在编码时,可以随时操作以更新列表。
- LISP 核心的操作符只有7个操作符:
quote
、atom
、eq
、car
、cdr
、cons
、cond
。前三者 quote、atom、eq 用于符号的推断;car、cdr、cons 操纵表格;cond 负责分支判断。这种简洁定义,非常接近「图灵机」原型的纯函数式语言,是现代语言完全无法比拟的。 - LISP 作为弱类型这优点相对缺点则是运行效率的低下。原始定义简洁的缺点使到大型开发工程变得困难,自底层到高层,自二维表查询到面向对象,使用者需要嵌入更多的函数来实现,致使LISP众多方言的衍生。
语言组成
数据类型
LISP 只有两种数据结构,原子
(atom)和表
(list)。原子为标识符形式的符号或数字的字面值,表则是由零个或多个表达式组成的序列。基本上,LISP 程序,并不需要使用一般表处理所必需的任意插入及删除操作。
语句结构
LISP 的语法是简洁的典型,程序代码与数据的形式完全相同,以圆括号为边界的表。
表:(A B C D)
按数据来解释时,它是一个有 4 个元素的表,按代码来解释时,它是将名为 A 的函数作用于 3 个参数 B、C、D。在 指定表结构
时将表的元素放在圆括号中,简单的表的元素仅限原子而成的方式是:
(A B C D)
嵌套表结构
亦是以圆括号来表示,表:(A (B C) D (E (F G)))
由 4 个元素组成。
第 1 个元素是原子 A
,第 2 个是子表 (B C)
,第 3 个是原子 D
,第4个是子表 (E (F G))
,它的第2个元素是子表 (F G)
。
关键字
LISP是一个函数式程序语言,并无关键字或保留字设,置使用者可自行再定义。
语言执行
LISP语法,可透过执行 Hello World 程序来体现。此程序透过 XLISP-STAT 2.1,3.45 Beta 版编译器执行。
(DEFUN HELLO ()
"HELLO WORLD"
)
语言应用
LISP是函数式程序设计的先锋,其诸多革命性的创新思维影响了后续编程语言的发展,亦完全垄断人工智能领域的应用长达三分之一个世纪。曾在开展初年出现的低效率因素亦在集体改良中被移去,成就了广被应用于软件开发、电子商务及金融系统的 Common Lisp、Scheme、Emacs、Lisp、Clojure 等。
Lisp is a language for doing what you've been told is impossible.
——Kent Pitman
本作品采用《CC 协议》,转载必须注明作者和本文链接