它是一门函数式语言,你要用函数的思维来思考。

只不过与数学的表达不同的是,数学里的函数是在括号外  f(x) ,而lisp是在括号内,以列表的形式(f x), cos(x) --> (cos x)。lisp不区分大小写。

接下来说一些 lisp 的基本函数

QUOTE函数

我们知道在交互模式中:

[13]> 3
3
[14]> ;我们调用 +函数(用分号 ; 注释)
(+ 3 5)
8

可如果我们想要让它原封不动地返回(+ 3 5)呢, lisp一直在计算,但它有个特殊的函数 quote,它的法则是:什么也不做->保护表达式不被求值

quote 操作符接受一个实参,并完封不动地返回它。

1 [15]> (quote (/ 4 3 (+ 2 3)))
2 (/ 4 3 (+ 2 3))
3 
4 [16]> (quote (/ 4 3) (+ 2 3))
5 
6 *** - EVAL: too many parameters for special operator QUOTE: (QUOTE (/ 4 3) (+ 2 3))
7 The following restarts are available:
8 ABORT          :R1      Abort main loop
9 Break 1 > 

 

注意:quote保护了整个表达式(包含内部的子表达式)不被求值。

但若传入多个实参,lisp则会进入调试模式,表明你在哪里出了错,就像上面示例: 太多参数(parameters)传入特殊操作符(operator)QUOTE:。。。

你可以输入 abort 来退出调试 或按CTRL+D

为了方便 我们可以用 '(英文单引号)来代替 quote,把 ' 写在表达式前

 1 [17]> '(+ 2 3)
 2 (+ 2 3)
 3 [18]> '(= 2 3)
 4 (= 2 3)
 5 [19]> '(2 3 4)
 6 (2 3 4)
 7 [20]> '1eee
 8 1EEE
 9 [21]> '我是谁
10 我是谁
11 [22]> 

(其中 = 也是一个函数,它判断传入的参数是否相等,返回一个 T(真)或NIL(假);只不过在  ' 函数下它并没有被调用,它和2,3的地位相同)

看到后两个可能就有人懵了,这里要说一下lisp的数据

数据

LISP只有两种数据结构,原子(atom)和列表(list)。

  • 原子:为标识符形式的符号或数字的字面值,                                                                           
表达式 也称S-表达式,由原子或列表组成
  • 列表:则是由零个或多个表达式组成的序列。

                                

数据结构包括数据的逻辑结构和物理结构, 而且数据结构操作的就是数据, 数据类型也包括在了数据里面。 
数据类型只是数据的类型而已,它的一个属性,也就是数据类型的取值和操作的集合。

Lisp 的数据类型:

----和其他语言一样有:

  • 整数(integer)和字符串(string),字符串用被双引号包住。
  • 他们都是对自身求值.             

----大多数语言没有的:符号(symbol)与列表(lists),

  • 符号 就是是 单词 (words)。无论你怎么输入,通常会被转换为大写, 一般不对自身求值,所以要是想引用符号,应该像上例那样用 ' 引用它
  • 列表是由被括号包住的零个或多个元素来表示。元素可以是任何类型,包含列表本身。使用列表必须要引用,不然 Lisp 会以为这是个函数调用

 

我把东西一下子都列出来了,仔细理解上面的关系,当然不了解就算了,我们要学就学点有意思的东西,

list函数

注意看,这个男人叫小帅,它是一个lisp函数,它的能力是创建列表.  

(由于 list 是函数,所以它的实参会被求值。这里我们看一个在函数 list 调用里面,调用 + 函数的例子)

[30]> ;这个列表有三个元素 分别是符号 字符串 列表(只不过它会被求值)
(list 'This "is" (+ 10 20))

(THIS "is" 30)
[31]> 

 来分析一下  (list 'This "is" (+ 10 20)) 它本身就是一个列表,它能被求值,但它却能再创建列表.只要是列表,就能被求值.

这意味这什么?

[32]> (list '+ 1 2)
(+ 1 2)
[33]> (list 'list ''+ (+ 7 9) (/ 3 9))
(LIST '+ 16 1/3)
[34]> (LIST '+ 16 1/3)
(+ 16 1/3)
[35]> (+ 16 1/3)
49/3
[36]> 

意味着 代码能自己写代码,

上面只是举了一个简单的例子,但你们可以想象,当它与递归什么的联系起来,那就厉害了.只要你设置的代码足够巧妙.

这是 Lisp 最卓越特性的地方之一。

不过得到以后,我们才来考虑这种程序. 想要高楼建的好,还得基底打的牢.

这也就是为什么我们需要 quote 。如果一个列表被 ' 引用了,则求值规则对列表自身来求值;如果没有被引用,则列表被视为是代码,依求值规则对列表求值后,返回它的值。

注释

最后再简单提一句,

单行注释用 ;

多行:

#| 
  多行注释
  以#|开头  |#结尾
  #|
    当然你也可以内嵌注释
  |#
|#

 

posted on 2023-01-09 12:14  iceshadow  阅读(228)  评论(0)    收藏  举报