clojure学习笔记1(代码片段)

uwgl uwgl     2022-10-22     127

关键词:

Clojure 是一门运行在 JVM 上的 Lisp 方言。我的学习方式是通过看官网的Getting Started

Mac OS 下配置开发环境

用 homebrew 先安装 Java:

brew install java

然后安装 Clojure 的 REPL 解释器:

brew install clojure

暂时只安装了这么多,没有安装 Leiningen 和 Boot。

字面值(Literals)

Clojure 有下面几种数据类型:

;; 数字类型
42              ; Long - 64 bits 整数
6.022e23        ; Double - 64 bits 浮点数
42N             ; BigInt - 高精度整数
1.0M            ; BigDecimal - 高精度定点数
22/7            ; 分数

;; 字符类型
"hello"         ; 字符串
\e              ; 字符

;; 其他类型
nil             ; 空值
true            ; Boolean 类型(还有 false)
#"[0-9]+"       ; 正则表达式
:alpha          ; 关键字
:release/alpha  ; 带 namespace 的关键字
map             ; 符号(symbol)
+               ; 符号可以是标点符号
clojure.core/+  ; Namespaced symbol

; 表示注释,两个分号表示首行。

另外还有四种 collection 类型:

‘(1 2 3)     ; 列表(list)
[1 2 3]      ; 向量(vector)
#1 2 3     ; 集合
:a 1, :b 2 ; map

求值(Evaluation)

Clojure 不同于传统的 源代码 -> 编译 -> 运行的方式,Clojure 的每一个表达式都能够求值,通过 Reader 读取用户输入,然后编译到 JVM 的字节码,然后在 JVM 上运行求值。

结构(Structure)和语义(Semantics)

技术分享图片

示意图种的绿字表示符号,蓝色字表示语义。大部分 Clojure 的表达式对自身求值,除了符号和列表。

如图所示,(+ 3 4) 读入一个列表,包含一个符号(+)和两个数字(3、4),列表中的第一个元素(图片中 + 所在的位置)被称作“function position“,表示要调用的函数。

Delaying evaluation with quoting

不知道这里怎么翻译,简单的说就是用引号表示“推迟求值”,暂时不求出来。

举个例子:

user=> ‘x
x

这里 x 前面加了一个引号,解释器不会对这个符号进行求值,而是保留了这个符号。

我们还可以用引号表示一个列表(list),而不进行求值:

user=> ‘(1 2 3)
(1 2 3)

REPL

REPL(Read-Eval-Print-Loop) 由以下四步组成:

  1. 读出表达式
  2. 对 #1 的表达式进行求值
  3. 输出 #2 中求出的值
  4. 回到最开始

探索 REPL

绝大多数 REPL 环境都有一些小技巧可以交互使用。比如:

  • *1 表示上一个结果
  • *2 表示上上个结果
  • *3 表示上上上个结果
user=> (+ 3 4)
7
user=> (+ 10 *1)
17
user=> (+ *1 *2)
24

还有一个 namespace 叫 clojure.repl 包含了标准 Clojure 库,里面有几个有用的函数,首先我们要载入这个库:

(require ‘[clojure.repl :refer :all])

然后我们就可以用这几个函数了:docfind-docapropossourcedir

这几个函数的具体作用可以在官网上看,我就不列举出来了。

Clojure 基础

def

如果你想要在 REPL 环境中用你求值后的值,可以这样写:

user=> (def x 7)
#‘user/x

然后我们就把符号(symbol)x 和值(var) 7 关联起来了,接下来就可以直接用这个符号了:

user=> (+ x x)
14

需要注意的是这个符号默认是 user 这个namespace 中的符号。我们调用的时候也默认实在 user 这个 namespace 中。

打印

Clojure 提供了四种打印函数:

  • println 是给人读的带换行的打印函数
  • prn 是给机器读的带换行的打印函数
  • print 是给人读的不带换行的打印函数
  • pr 是给机器读的不带换行的打印函数

简单的说,给人读的会对字符进行转义,而且会把其中的表达式的值求出来:

user=> (println "This is a\ttest" (+ 1 2 3))     
This is a   test 6

机器读的不会转义,而且也不会把表达式的值求出来。

机器学习基础教程笔记---机器学习概述(代码片段)

目录机器学习概述1.1人工智能概述1.1.1机器学习与人工智能、深度学习1.1.2机器学习、深度学习能做些什么1.1.3人工智能阶段课程安排1.2什么是机器学习1.2.1定义1.2.2解释1.2.3数据集构成1.3机器学习算法分类学习目标分析1.2中的例子... 查看详情

python学习笔记(代码片段)

...1.2.继承1.3.属性设置校验1.4.定制类1.5.枚举类1.6.杂供个人学习笔记回顾时使用.1.类天下语言是一家,你抄我完,我抄他.没错,python的没啥特殊的,先来个简单的例子:classStudent(object):def__init__(self,name,score):self.name=nameself.score=scoredef... 查看详情

千锋javascript学习笔记(代码片段)

千锋JavaScript学习笔记文章目录千锋JavaScript学习笔记写在前面1.JS基础1.1变量1.2数据类型1.3数据类型转换1.4运算符1.5条件1.6循环1.7函数1.8对象数据类型1.9数组和排序1.10数组常用方法:1.11字符串常用方法1.12数字常用方法1.13时间... 查看详情

理解clojure语法(1)(代码片段)

写在开头的话:clojure中的很多语法现象都值得去思考。有时候稍微一点认知的错误,都容易导致“失之毫厘,差之千里”,这篇文章就是一个clojure变量counter(其实是不变量~immutable)引发的血案:(—... 查看详情

学习笔记(代码片段)

....1癌症案例附录右截断数据展示主函数参考文献0引言开始学习生存分析了,选择了StatisticalAnalysisofFailureTimeData2nd1这本书来学习。为保证学习效果。会把一些知识点以及总结发出来共同学习。水平有限,发现错误希望评论... 查看详情

ts学习笔记1(代码片段)

目录TS学习笔记1安装示例TS学习笔记1安装vscode安装,code.visualstudio.comnode.js安装,nodejs.org借助npm安装tsc,npmi-gtsc终端执行tsc,权限修改,set-ExecutionPolicyRemoteSigned配置编译,这样就不用每次都tscindex.ts了;tsc 查看详情

ts学习笔记1(代码片段)

目录TS学习笔记1安装示例TS学习笔记1安装vscode安装,code.visualstudio.comnode.js安装,nodejs.org借助npm安装tsc,npmi-gtsc终端执行tsc,权限修改,set-ExecutionPolicyRemoteSigned配置编译,这样就不用每次都tscindex.ts了;tsc 查看详情

spring5学习笔记(代码片段)

文章目录Spring5学习笔记1.简介1.1介绍1.2发展历程1.3理念1.4优点1.4组成1.4.1SpringCore1.4.2SpringContext1.4.3SpringAOP1.4.4SpringDAO1.4.5SpringORM1.4.6SpringWeb1.4.7SpringWebMVC1.5扩展2.控制反转2.1原型2.1.1`UserDao`2.1.2` 查看详情

spring5学习笔记(代码片段)

文章目录Spring5学习笔记1.简介1.1介绍1.2发展历程1.3理念1.4优点1.4组成1.4.1SpringCore1.4.2SpringContext1.4.3SpringAOP1.4.4SpringDAO1.4.5SpringORM1.4.6SpringWeb1.4.7SpringWebMVC1.5扩展2.控制反转2.1原型2.1.1`UserDao`2.1.2` 查看详情

matplotlib学习笔记1(代码片段)

Matplotlib学习笔记1-上手制作一些图表吧!Matplotlib是一个面向Python的,专注于数据可视化的模块。快速上手这是使用频率最高的几个模块,在接下来的程序中,都需要把它们作为基础模块importmatplotlibasmplimportmatplotlib.pyplotaspltimportn... 查看详情

python机器学习笔记(代码片段)

Python机器学习笔记一机器学习概述1.1人工智能概述1.1.1机器学习与人工智能、深度学习关系机器学习和人工智能、深度学习的关系机器学习是人工智能的一个实现途径深度学习是机器学习的一个方法发展而来达特茅斯会议(Da... 查看详情

python机器学习笔记(代码片段)

Python机器学习笔记一机器学习概述1.1人工智能概述1.1.1机器学习与人工智能、深度学习关系机器学习和人工智能、深度学习的关系机器学习是人工智能的一个实现途径深度学习是机器学习的一个方法发展而来达特茅斯会议(Da... 查看详情

django学习笔记1(代码片段)

重点在注释#1.views.py1fromdjango.shortcutsimportrender2fromdjango.httpimport*3#fromdjango.templateimportRequestContext,loader45#Createyourviewshere.67defindex(request):#request是已经封装好的,包括请求头8#temp=loader.ge 查看详情

mybatis学习笔记-06(代码片段)

mybatis学习笔记-061.动态SQL环境搭建1.1、实体类1.2、BlogMapper接口1.3、BlogMapper.xml配置文件1.4、mybatis-config.xml核心配置文件1.5、唯一的id标识(Idutil)1.6、测试2、动态SQL之if语句3、choose、when、otherwise4、trimwhereset5、forEach这篇... 查看详情

mybatis学习笔记-06(代码片段)

mybatis学习笔记-061.动态SQL环境搭建1.1、实体类1.2、BlogMapper接口1.3、BlogMapper.xml配置文件1.4、mybatis-config.xml核心配置文件1.5、唯一的id标识(Idutil)1.6、测试2、动态SQL之if语句3、choose、when、otherwise4、trimwhereset5、forEach这篇... 查看详情

mybatis学习笔记-06(代码片段)

mybatis学习笔记-061.动态SQL环境搭建1.1、实体类1.2、BlogMapper接口1.3、BlogMapper.xml配置文件1.4、mybatis-config.xml核心配置文件1.5、唯一的id标识(Idutil)1.6、测试2、动态SQL之if语句3、choose、when、otherwise4、trimwhereset5、forEach这篇... 查看详情

shell学习笔记(代码片段)

shell学习笔记一.基本语法1.1基本操作1.2变量1.3数组1.4命令行获取参数1.5数学运算多种方法数学运算方式1数学运算方式2数学运算方式3数学运算方式41.6if语句1.61if整数比较整数比较方式1整数比较方式21.62if字符串比较字符串比较方... 查看详情

risc-v学习笔记(代码片段)

RISC-V学习笔记(1)作者:夏风喃喃参考:计算机组成与设计:硬件/软件接口(RISC-V版)文章目录RISC-V学习笔记(1)第1章计算机抽象及相关技术1.6性能1.6.1性能的定义1.6.2性能的度量1.6.3CPU性能... 查看详情