尝试LISP-一种神奇的语言

曾经听说LISP的神奇,它是“一门宗教”“一门关于递归的语言”“上帝使用的语言”“函数式编程”,再加上它的古老和诸多笑话如:

上世纪七十年代,苏联情报机构克格勃对美国太空技术软件发生了浓厚的兴趣,派遣了各种各样的间谍来搜集任何可能的相关信息。一天下午,一个间谍气喘吁吁的回到总部,手里拿着一张纸,兴奋的对着他的上司叫喊,“同志!同志!美国人的火箭发射系统是用Lisp语言编写的!”长官很疑惑,”你怎么知道的?”“我闯进了他们的研究室,从他们的电报机上偷了一张纸!这上面不是整个程序,只是最后一页,记录了程序的结束部分的逻辑!你自己看!!!!”长官看着这张纸笑了:

))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

… …

一个绘声绘色的版本

如果有人说“PHP是世界上最好的语言!”那么他在引战。如果说的是“LISP是世界上最好的语言”就不是了。因为大多数人并不知道LISP,剩下的人中的一半没用过,不知道他的优缺点,在剩下的人里面又有一般是赞同的。

都让我很向往它。

言归正传

由于历史悠久和语言特色,LISP有许多的方言。主要的有Scheme、CommonLisp、Clojure等(如果不算上Javascript等😁)。而这些方言又有许多方言,你甚至可以自己写一种方言或者一种解释器,比如(How to Write a (Lisp) Interpreter (in Python))和它的续篇(An ((Even Better) Lisp) Interpreter (in Python))。更不用说众多受它影响的语言了。

我的目的是体验一下“编程还能这样编?”,所以选择了Scheme。如果你也想试试,看看lisp方言有这么多种,我该学哪种?-知乎Lisp 几种方言的一些区别-CSDN。因为Scheme的编译器解释器文本编辑器有点麻烦,遂直接选择了它的一个方言Racket(仅仅是因为他有一个很简单易使用的IDE)。

我照着Yet Another Scheme 入门教程-看云学了学语法,感受到了”Lots of Irritating Silly Parentheses“(或者随便你怎么说)的魅力,刷新了我的三观。作为一种函数式编程语言,他只有递归没有循环… (真的很神奇 (与 S表达式 (概念 表)))。

(是 S表达式 (表 (它的第一项是函数 后面是数据)))

其实只要看看刚才的入门教程就差不多了,更深入的我也不会了。但是LISP真的刷新了我的认知。

代码及简单分析

绝对值计算

 #lang scheme

(define abs (lambda (number)
              (if (> number 0)
                  number
                  (- 0 number)
                  )
              ))

>(abs -5)
5

你看,使用分支的方法也是一个函数(if 判断规则 为真时… 为假时…);定义函数或者变量的define也是函数,使用方法是(define 名字 值);值又可以一个函数(lambda 参数 操作)。

又如一个简单的猜数游戏:

#lang racket
(define main (lambda (the_num times)
               (let ((t (guess the_num times)))
                 (if t (displayln (+ 1 t)) (displayln "you lose")
                 )
               )))
(define guess (lambda (the_num n)
               (if (not (= (string->number (read-line)) the_num))
                   (if (> n 0)
                      (let ((m (- n 1)))
                        (let ((t (guess the_num m)))
                          (if t (+ 1 t) #f)
                          ))
                      #f)
                   0)))
(main 4 5)

let是定义局部变量,方法为(let ((变量名1 值) (变量名2 值) …) 操作)。函数可以作为值,如果直接写就是执行该函数的返回值,前面加上’或者(quote …)就是一个表。

关于 “尝试LISP-一种神奇的语言” 的 3 个意见

  1. 如果你问我为什么lisp没有流行,我觉得原因有二:
    1 打‘(’在键盘上需要按shift
    2 打‘)’在键盘上需要按shift

发表评论

电子邮件地址不会被公开。 必填项已用*标注