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 。如果一个列表被 ' 引用了,则求值规则对列表自身来求值;如果没有被引用,则列表被视为是代码,依求值规则对列表求值后,返回它的值。
注释
最后再简单提一句,
单行注释用 ;
多行:
#|
多行注释
以#|开头 |#结尾
#|
当然你也可以内嵌注释
|#
|#
CLISP学习(二)的更多相关文章
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- TweenMax动画库学习(二)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- Hbase深入学习(二) 安装hbase
Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...
- Struts2框架学习(二) Action
Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- Quartz学习--二 Hello Quartz! 和源码分析
Quartz学习--二 Hello Quartz! 和源码分析 三. Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...
- SpringCloud学习(二):微服务入门实战项目搭建
一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...
- DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer
DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...
- SpringMVC入门学习(二)
SpringMVC入门学习(二) ssm框架 springMVC 在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...
随机推荐
- 京东云TiDB SQL优化的最佳实践
京东云TiDB SQL层的背景介绍 从总体上概括 TiDB 和 MySQL 兼容策略,如下表: SQL层的架构 用户的 SQL 请求会直接或者通过 Load Balancer 发送到 京东云TiDB ...
- java中GC的日志认识详解
不同的垃圾回收器 他们的日志都是完成不一样的,看懂日志是解决和发现问题的重中之重. Parallel Scavenge + Parallel Old 日志 启动参数 -XX:+UseParallelG ...
- 题解UVA10948 The primary problem
前言 前置 \(\sf{Solution}\) 既然有了 \(n\) ,那找出 \(a\) 和 \(b\) 就只要枚举 \(a\) 的范围 \(1\sim n\),判断 \(a\) 和 \(n-a\) ...
- Oracle部署,关于日志文件系统选择(硬盘格式化、挂载)
之前部署过好多Oracle服务,采用的日志文件系统一直是ext3.但是我观察到很多人在格式化/挂载数据盘时,采用的日志文件系统类型有ext3.ext4.xfs等,这不禁让我发出疑问,哪个类型的数据处理 ...
- natapp内网穿透
NATAPP 官网地址 https://natapp.cn/ 下载 点击下载,选择符合自己的版本 注册 下载完成后解压是个natapp.exe程序,这里先不用动,回到官网首页 完成注册并登录,选择免费 ...
- 2022春每日一题:Day 39
题目:[USACO1.4]等差数列 Arithmetic Progressions 一个很显然的做法,枚举公差,首项,p,q这样的话复杂度爆炸,不过可以肯定的一点,如果我们这样做,找到了答案就可以直接 ...
- 2018 Web开发人员学习路线图
以下 Web 开发人员学习路线图是来自 Github developer-roadmap 项目,目前已经有繁体版翻译 developer-roadmap-chinese. 主要有三个方向,分别为前端开 ...
- Java-数组工具类Arrays
java.util.Arrays是一个与数组相关的工具类,里面提供了大量静态方法,用来实现数组常见的操作. toSting方法 public static String toString(数组):将参 ...
- 【第7篇】AI语音交互原理介绍
本章主要介绍AI语音交互的原理,包括语音交互的流程以及各流程节点所涉及的相关知识,如语音采集.语音识别.自然语言处理.语音合成等. 2.1 AI语音交互 AI语音交互通俗点说就是人与机器间进行语音理解 ...
- Halo 主题 Redemption 首发版
Redemption 一款专注阅读.写作的 Halo 博客主题.主要设计思想即是专注阅读.写作,是一款极简类型的博客主题. Redemption 部分设计灵感借鉴 Halo 博客 Zozo 主题,感谢 ...