它是一门函数式语言,你要用函数的思维来思考。
只不过与数学的表达不同的是,数学里的函数是在括号外 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
。如果一个列表被 ' 引用了,则求值规则对列表自身来求值;如果没有被引用,则列表被视为是代码,依求值规则对列表求值后,返回它的值。
注释
最后再简单提一句,
单行注释用 ;
多行:
#| 多行注释 以#|开头 |#结尾 #| 当然你也可以内嵌注释 |# |#
标签:函数,lisp,quote,list,列表,学习,CLISP,求值 From: https://www.cnblogs.com/iceshadow/p/17036668.html