从Hello World到defmacro,那些令人惊叹的代码!

前言

自从看到那个征文活动便灵感突现,这是个为大家介绍Lisp语言的机会,也是个赞扬最让我心动的语言的机会。

毕竟还是学生党,还未有太多时间来学习它,但内心满满的都是热爱与兴奋。文中如有疏漏,还请各位指教!

一次偶然在《黑客与画家》第二版中了解到这门神奇的语言,瞬间便被”洗脑“,立刻找到一大堆资料,前前后后的兴奋的学了几个月,无奈于就业压力,还是选择先将C++/Java等作为主力。

这篇文章主要面向没见过Lisp语言的同学,否则就会觉得这些太简单了,Lisp的博大精深也不是能三两句话讲个明白的。

我并不喜欢讲废话,所以,开始吧!

Hello World

曾看到有人将Common Lisp的Hello World程序来同C++、Java等做对比。在这里并不需要函数或方法,更不需要类,一行代码足矣:

CL-USER> "hello, world"
"hello, world"

那么这是怎么回事呢?因为在这里字符串有着Lisp能够理解的字面语法并且它是自求值对象。

你觉得这没有打印(Print)出来,所以还不完整么?没问题:

CL-USER> (format t "hello, world")
hello, world
NIL

NIL可不是表示出了错,而是像你们所知道的”return 0;“一样是FORMAT语句的返回。

你还觉得不服认为没有用到函数?满足你!

CL-USER> (defun hello-world() (format t "hello, world"))
HELLO-WORLD

上面就是函数的定义了,接下来,就让我们使用它来打印吧!

CL-USER> (hello-world)
hello, world
NIL

这里写图片描述

好了,这种小儿科的hello world就不继续了,来点炫酷的。

100的阶层

看到这个标题可能有同学会想到,”100的阶层,哦,就是1乘以2乘以3,一直乘到100……for循环就能搞定了。”

那么试试呢?

要用int?还是用long?亦或long long?

那1000的阶层呢,10000的阶层呢?

然而在Lisp中,很容易就可以求出来:

CL-USER> (defun fact (n)
            (if (= n 1)
                1
                (* n (fact (- n 1)))))
FACT
(define (fact n)
    (if (= n 1)
        1 
        (* n (fact (- n 1)))))
;Value: fact

上面两段代码分别是Common Lisp和Scheme方言的,没错 ,是方言。

但当真能求100的阶层么?有图有真相!

这里写图片描述

这里写图片描述

Lambda表达式

C#在2007年发布C# 3.0中引进了Lambda,C++在2011年发布的C++11版中引进了Lambda,Java则在2014年发布的Java SE 8中引进了Lambda。而以Lambda为核心的Lisp则在半个世纪前就用上了这一特性。

Lisp能够以此为基础做些什么呢?

这是一门函数式语言,数学是基础,下面就来看看丘奇计数(由数理逻辑学家Alonzo Church发明,其还发明了 λ 演算)。

如SICP这本书的练习2.6(相关的习题解见此专栏:SICP练习 )所介绍:在一个对过程做各种操作的语言里,我们完全可以没有数(至少在只考虑非负整数的情况下)。大家编程的时候相比都要用到各种数字,而在这里,我们可以将0和加一实现为:

(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n)
    (lambda (f) (lambda (x) (f ((n f) x)))))

以上这种表示形式就是Church计数。

那么有了0和“加一”该如何定义1呢,其实也不难,对0执行“加一”操作不就等于1了嘛。使用一张之前我博客上用过的图:

这里写图片描述

所以1就可以用如下定义了:

(define one (lambda (f) (lambda (x) (f x))))

同样,通过

(add-1 one)

还可以来定义出 two ,以此便可以无限定义下去,无限,无限,无限……

无穷流

既然谈到了“无限”,那怎么能错过无穷流呢?

流,大家自然都用过,但在这里它还能够表示无穷长的序列。下面就是一个承载了所有正整数的流的定义:

(define (integers-starting-from n)
    (cons-stream n (integers-starting-from (+ n 1))))
(define integers (integers-starting-from 1))

其中的 integersstarting

  • 13
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值