首页 > 其他分享 >CLISP学习(二)

CLISP学习(二)

时间:2023-01-09 12:22:06浏览次数:47  
标签:函数 lisp quote list 列表 学习 CLISP 求值

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

只不过与数学的表达不同的是,数学里的函数是在括号外  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

相关文章

  • fabric2.2学习笔记1
    fabric2.2学习笔记120201303张奕博2023年1月9日hyperledgerfabric结构分析每个Server作用:AdminServer:控制该节点的命运,可以删除该节点所在的进程。(StartStopGet......
  • CCSP学习笔记-NIST 800-145
    本文英文版来自美国国家标准与技术实验室的文档SpecialPublication800-145《TheNISTDefinitionofCloudComputing》September2011版本。一 云计算概念定义Clo......
  • Linux学习笔记:终端删除键失效解决办法
    一、删除键变空格近日在安装vi时遇到报错,遂卸载了部分包进行重新安装。安装后出现终端乱序,输错命令按Backspace删除键进行删除时不能删除反而添加空格,并且导致某些快......
  • 机器学习16:简单, 直观的方法理解CNN(卷积神经网络)核心原理及实现
    1.CNN(卷积神经网络)的典型应用场景1.1WaveNet模型:​​https://deepmind.com/blog/wavenet-generative-model-raw-audio/​​如果你能训练人工智能机器人唱歌,干嘛还训练它......
  • 【linux】RabbitMQ学习-vhost 详解
    vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的队列、绑定、交换器和权限控制;vhost通过在各个实例间提供逻辑上分离,允许你为不同应用程序安全保密地运行数据;vhost是......
  • Linux学习记录(四)Shell编程
    0、学习shell的目的:方便运维;编写shell程序管理集群、提高开发效率;1、Shell概述(1)shell是解释器;​ 核心:硬件系统(主机+外设);​外层:操作系统;​......
  • Linux学习记录(五)DHCP服务器配置(Net模式)
    一、DHCP协议DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情......
  • 2023.1.9 学习
    一、优势相比传统的机械传感器,MEMS具有着巨大的竞争优势:1.MEMS传感器具有着体积小、重量轻、功耗低的特点。其内部结构可达微米甚至纳米量级。同时其内部的机械部件由于......
  • 近几日的算法学习(背包问题+回溯递归算法)附例题
    最近两天都没有更新博客力(其实是去学了些算法,算是对计算机科学有了全新的认识吧(我之前在课本学的是什么勾八玩意儿)CP1055  有多少个数的和是素数(经典的回溯算法,暴力枚......
  • 学习(追赶)和研究(超越)
    人类的寿命有限,技术的天花板无限。有人穷其一生专研一项技术,有的家族秘法世代相传不断研究,终于成为一项技术的领头羊。研究一套技术需要几年十几年甚至一辈子或是几代人。......