查看原文
其他

请问你为什么学习Lisp?

抓狂 码农翻身 2018-10-26

前言:本文来自于我的知识星球“码农翻身”的一个提问:“请问你为什么要学习lisp?” 嘉宾抓狂的回答我很喜欢,略作修改分享给大家。

如果你是问“我”为什么要学,那是因为《黑客与画家》这本书里面作者Paul Graham说它很牛x,不是针对谁,是说在座的所有语言都是辣鸡。


Paul是谁? 


人称“硅谷创业教父”,哈佛大学计算机博士,1995年,创办世界上第一个互联网应用程序Viaweb。1998年,Yahoo以5000万美元收购。2005年建立创业孵化器Y Combinator ,已经帮助建立了多达200家创业公司,其中包括Dropbox、Reddit和Airbnb在内的重量级创业公司。


当时我就想虽然你很牛,但是你说Lisp厉害就真的很厉害吗?我得亲自体验一下是不是和宣传的一个效果咯。


硬着头皮试着使用过一段时间之后发现这已经不是很牛x的程度了,对于当时只接触过 C 和 Java 不知道天有多大的我来说已经是颠覆级别了,颠覆啊!到后来都是吃惊到张着嘴在学习啊!从来不知道还能这么玩儿啊!


到后来我学了编译原理......我的妈呀,有一种醍醐灌顶的感觉,原来 Lisp 是这么一个意思啊。


这就是我从入坑到入门的经历。再往后的故事就离题了。这就是我学 Lisp 的机缘巧合。


如果是你想问“作为一门语言,而且是一门极为小众的,上手门槛貌似巨高的,乍一看语法诡异到反人类的语言,到底还有没有学习的意义?既然这么小众难道学来就为了装逼?”这个问题的话,那我就一个一个回答。


1. 小众不代表不好。


我一直认为 Lisp 是“屠龙之技”。什么叫屠龙之技,绝世武功,但是根本没几个人会用,也没有那么多龙让你屠,反而没有普通的功夫来的人气高。


2. 上手门槛其实很低。


门槛高就高在太小众,资料相对别的主流语言太少太少,而且 Lisp 本身又有一堆方言,也就是 Lisp 不是像 Java 那样有大公司来维护,也不像 C 那样有相对公认的标准,Lisp 是由一堆变种组成的,大同小异,就像方言一样。所以新手就算装个 Lisp 环境就已经要累死了,文化人的说法就是,“望而却步”。


3. 语法反人类?


语法层面我敢说没有任何一门语言能超过 Lisp。为啥?优点列出来比这篇文章还长。语法层面我敢说没有任何一门语言能超过 Lisp。为啥?优点列出来比这篇文章还长。 这里就简要说几点。


所谓的语法奇葩就是因为 Lisp 直接采用语法树(前缀表达式,S-表达式)作为语言本身的表示形式。(但严格说来并不是采用 S-表达式 就能号称是 Lisp,Lisp 的特点是基于那几个原语推导出整个系统。)


S-表达式这种东西表面上容易体会到的优点大概也就是:


(1) 砍掉了优先级这个无聊的东西 

中缀表达式 1 + 2 * 3 

使用 S-表达式表达 

如果先算乘再算加是 (+ 1 (* 2 3)) 

如果先算加再算乘是 (* 3 (+ 1 2)) 

如你所见,不可能搞混。


 (2) 统一了各种操作的表达方式 

中缀表达式: 1 + 1 

S-表达式: (+ 1 1) 


大部分语言中的函数调用: plus(1, 1)

S-表达式: (plus 1 1)  


大部分语言中的条件判断: if (A) B else C,或者 A?B:C 

S-表达式: (if A B C) 


我们放在一起对比一下 

1 + 1 

plus(1, 1) 

if (A) B else C 

A?B:C 


 (+ 1 1) 

(plus 1 1) 

(if A B C)  


所以如果你第一次学编程,你会选择哪种表达形式? 所以到底哪个才是奇葩?


(3) 其它优点给你个眼神自己体会


再扯得『高端』一点,因为有了很奇葩的 S-表达式,才有可能统一各种表示形式 --- 不论是代码本身还是数据结构,统统用 S-表达式。(同像性)


也正因如此,才可能有 Lisp 宏这种东西存在。别的语言中即使有宏,也需要先转换成语法树,再操作语法树。所以如果有种语言想不做转换就操作语法树,那这种语言看起来就是 Lisp。。。


这东西就是如果你能听懂那你一定已经接触过 Lisp,也就不用我说。如果听不懂,那我解释有啥用。。。


所以这也是为啥你看到这么多传教的,却好像不想泄露天机一样,不是不想告诉你,是这东西实在太奇葩,没有办法做类比啊。


说到底,大家最关心的,到底有啥用!能赚钱么!能找工作么!


没办法,大家都是实在人。我就在这明说吧。


只学Lisp,然后只找 Lisp 工作那是不可能滴,也许这辈子都不可能找到工作。


但是学会了之后你有很大概率开启上帝视角,能站在一个相当高的高度去审视别的语言,这不是在吹牛,这是真的,真的相当高。


你可以看穿为什么别的语言要这么设计,为什么要提供这种语法糖,为什么要有这种设计模式,可以快速上手绝大多数所谓新语言。


面试的时候能写的一手风骚的 Lisp 也能唬住面试官啊。(我会告诉你我就是这么找到工作的?)当然这一切都建立在你能基本掌握 Lisp,以及有一颗刨根问底的心。 最后,点题!点题很重要!


为什么要学!程序语言界最亮最酷炫的奇葩就在那里!为什么不学!



欢迎加入我的知识星球“码农翻身”,在那里给大家分享我是如何积累起现在的知识结构,学习过程的血和泪,职业发展的经验和教训,日常的所思所想,希望能帮助大家少走点儿弯路。


详情参见参见这篇文章:2018,开通一个交流新渠道!


对于加入知识星球的同学提供特别的福利,即2017编程提高群第一季第二季的部分“加餐”视频


漫谈计算机组成原理和计算机编程语言

程序的机器级表示

漫谈操作系统之虚拟内存

进程和线程

新人在职场

Java并发编程

如何用Antlr实现自定义的简单脚本语言

缓存

BTree及其在数据库的应用

分布式文件系统FastDFS


欢迎大家加入, 二月份优惠期 99元/年, 从三月份起恢复为128元

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存