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 ...
随机推荐
- 6.RabbitMQ系列之direct直连交换器
我们通过fanout exchange(扇型交换机)实现生产者发送一个消息,这个消息同时被传送给所有队列.但是有时我们不希望所有的消息都被所有队列接收,我们希望可以指定类型为a的消息只能被队列A接收, ...
- Vue学习之--------绑定样式、条件渲染、v-show和v-if的区别(2022/7/12)
文章目录 1.绑定样式 1.1 基础知识 1.2 代码实例 1.3 测试效果 2.条件渲染 2.1 基本知识 2.2 代码实例 2.3 测试效果 1.绑定样式 没啥好说的.我觉得还没直接引入外部写好的 ...
- SQL分层查询
数据中可能存在层次关系,本文章主要介绍查询这种关系的实例.会大量使用递归式 CTE. Emps 表中 EName 员工和 MGR 上级之间的关系如下: 每个上级也同样是员工,主管和员工之间为父子关系. ...
- 在Rocky8中安装VMware Workstation 的方法
在Rocky8中安装VMware Workstation 的方法 1.Rocky必须是图形界面 2.下载wmware workstation(下载地址:https://www.vmware.com/i ...
- 【Java复健指南09】项目练习全解--房屋出租系统
一个基于文本界面的综合练习,主要用于串联和回忆知识点,比较简单 各个界面的设计样式 主菜单 =============房屋出租系统菜单============ 1 新 增 房 源 2 查 找 房 屋 ...
- python(27)反射机制
1. 什么是反射? 它的核心本质其实就是基于字符串的事件驱动,通过字符串的形式去操作对象的属性或者方法 2. 反射的优点 一个概念被提出来,就是要明白它的优点有哪些,这样我们才能知道为什么要使用反射. ...
- Https Webservice接口的免证书调用
目录 前言 思路 方案 Axis调用 HttpClient调用 参考链接 前言 在调用https协议的Webservice接口时,如果没有做证书验证,一般会报javax.net.ssl.SSLHand ...
- Rust Aya 编写 eBPF 程序
本文地址:https://www.ebpf.top/post/ebpf_rust_aya 1. 前言 Linux 内核 6.1 版本中有一个非常引人注意的变化:引入了对 Rust 编程语言的支持.Ru ...
- AArch32/AArch64应用程序级内存模型(五)
本文主要为了记录在学习armv8的过程中的一些感悟.由于原文部分章节晦涩难懂,作者参考了网上很多优秀博主的部分章节(可能是直接摘录)并结合自己的理解重新整理了当前这个版本.文中不免有部分章节讲解很浅, ...
- C++期末考试题库
哈尔滨商业大学计算机专业C++期末考试题库 下载:题库 示例: 一.单选题:1.能作为 C ++程序的基本单位是( C )A .字符 B .语句 C .函数 D .源程序文件2.程序中主函数的名字为( ...