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

只不过与数学的表达不同的是,数学里的函数是在括号外  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学习(二)的更多相关文章

  1. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  2. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  3. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  4. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

  5. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  6. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  7. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

  8. SpringCloud学习(二):微服务入门实战项目搭建

    一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...

  9. DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer

      DjangoRestFramework学习二之序列化组件.视图组件   本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...

  10. SpringMVC入门学习(二)

    SpringMVC入门学习(二) ssm框架 springMVC  在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...

随机推荐

  1. 华为设备配置和使用FTP服务命令

    配置SFTP Server与Client server:aaa 进入aaa视图 local-user huawei2 password cipher huawei2 设置用户名和密码 local-us ...

  2. 使用 nvm 对 node 进行版本管理

    前端项目工程化,基本都依赖于 nodejs, 不同的项目对于 nodejs 的版本会有要求,nvm 就是可以让我们在各个版本之间进行快速切换的工具. Linux 系统 下载解压 查看所有版本 , 选择 ...

  3. XAF新手入门 - 类型子系统(Types Info Subsystem)

    类型子系统概述 类型子系统是XAF的核心概念,但我们平时却很少关注它,它集中存储了模块中的类型,它是生成应用程序模型(Application Model)的基础,它与XAF中其它的概念都有所关联,了解 ...

  4. 使用jmx exporter采集kafka指标

    预置条件 安装kafka.prometheus 使用JMX exporter暴露指标 下载jmx exporter以及配置文件.Jmx exporter中包含了kafka各个组件的指标,如server ...

  5. Oracle数据泵导入dmp文件,报UDI-00013、UDI-00019错误原因

    这个问题挺简单,想了想,还是记录下吧. [root@ufdb165 bin]# ./impdp cwy_init0914/cwy_123456789@ufgovdb1 directory=DATA_P ...

  6. JavaScript常用工具函数

    检测数据是不是除了symbol外的原始数据 function isStatic(value) { return ( typeof value === 'string' || typeof value ...

  7. 微信小程序的学习(一)

    一.小程序简介 1.小程序与普通网页开发的区别 运行环境不同 网页运行在浏览器环境中 小程序运行在微信环境中 API不同 小程序无法调用浏览器中的DOM和BOM的API 但是小程序可以调用微信环境提供 ...

  8. 还在为数据库事务一致性检测而苦恼?让Elle帮帮你,以TDSQL为例我们测测 | DB·洞见#7

    数据库用户通常依赖隔离级别来确保数据一致性,但很多数据库却并未达到其所表明的级别.主要原因是:一方面,数据库开发者对各个级别的理解有细微差异:另一方面,实现层面没有达到理论上的要求. 用户在使用或开发 ...

  9. Kubernetes集群YAML文件详解

    Kubernetes集群YAML文件详解 概述 k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到YAML 格式文件中,我们把这种 ...

  10. Go实现常用软件设计模式二:工厂模式

    目录: 举个栗子 概念介绍 使用场景 1.举个栗子 类图 ``` @startuml'https://plantuml.com/class-diagramclass Elephant { String ...