Clojure基础语法学习笔记(一)

2023-05-16

首先推荐两个目前正在学的免费学习资源:

Functional programming in Clojure

Clojure for the Brave and True

都是英文的,第一个是边学边练的形式,很容易测试自己是否真的学懂了,在实践中也能学到更多的东西;第二个是一本Clojure的入门书籍,第二章介绍了Emacs的安装配置以及一些常用的快捷键,很适合作为新手入门教程。

一、注释和命名空间

目前学到的就两种:

; 为单行注释

#_ 可以注释掉之后的一个完整形,即#_后面第一个括号里面的内容

(ns namespace) ;改变命名空间后可以直接用该空间定义的函数变量等

命名空间用-,而对应的实际文件名用下划线_
user=> (use example.hello) ;使用use时,在后面的namespace前需要加单引号,否则会报错
java.lang.ClassNotFoundException: example.hello (NO_SOURCE_FILE:1)

(use 'clojure.repl)
(doc +) ;可以查看函数的说明
(user/clojuredocs function)
;to see some examples for function. This should work for most of the built-in functions.

二、数据类型

数值Numbers:11 2/3 3.2 整数 分数 浮点数等

运算符 + - * / mod ;mod返回两数相除的余数
逻辑 not = == >= <= > <
(== 42  42) ;=> true
(== 5.0  5) ;=> true
(=  5.0  5) ;=> false ! 即==要求值相等就行,=要求类型也一致,条件更严格

字符串Strings:"hello" "abc"用双引号表示

字符Characters:\x \b \? \√  用反斜杠表示特定字符

关键字Keywords::a :b :keyword 用英文的冒号开头表示

布尔值Booleans: true false nil 均为小写,nil表示为空,逻辑判断上是属于false的,但是跟false又有一些差别

(boolean ) ;返回true或false
(and true)                      ;=> true
(and true true true)            ;=> true
(and true true true true false) ;=> false
(and)                           ;=> true
;返回第一个非true值(nil或者false),或最后一个值
(or false false false false true) ;=> true
(or false false false)            ;=> false
(or)                              ;=> nil
(not true)        ;=> false
(not false)       ;=> true
对于booleans, and, or 和 not 均接受非布尔值作为参数.

(记住false 、nil 逻辑上都是false,除此之外的其他任何东西逻辑上都是true.)

三、数据结构

似乎初步区分为Collections集合和Sequences序列两大类,Lists,Vectors,Sets,Maps等都属于Collections,很多操作符也都是通用的(还在学习中,对这块认知还不是很清晰)

列表Lists:(1 2 3)

数组Vectors:[1 2 3]

集合Sets:#{1 2 3} 集合特点是元素是唯一的,不会有重复

集合Sets的字面量表示方法:#{an-elem another-elem ...}

(set ["^^" "^^" "^__*__^"]) ;=> #{"^__*__^" "^^"}
(set [1 2 3 1 1 1 3 3 2 1]) ;=> #{1 2 3}

contains? 用来测试集合是否包含一个值
(conj set elem) 在集合中加入一个元素
(disj set elem)  在集合中移除一个元素
(clojure.set/union set1 set2 ...) 合并多个集合
(clojure.set/union #{1 2} #{2 3} #{1 2 3 4} #{7 8}) ;=> #{1 2 3 4 7 8}
(apply clojure.set/union [#{1 2} #{5} #{7 8}])      ;=> #{1 2 5 7 8}

字典Maps:{:a 1 :b 2 :c 3} {"foo" 42, "bar" 666} {"mehmeh" (+ 2 5) "rupatipor" "ropopo"}

在Maps里你需要分清楚key和keyword,map里面成对出现的第一个是key,key常用keyword关键字来作为key,但是key也可以不是关键字而是其他类型
;关键字keyword是以":"开头的字符,如 :title  :authors

;关键字可以像函数一样用来索引查找关键字对应的值

如(:a {:a 1 :b 2 :c 3} ) ;=> 1

序列Sequences
(seq collection)  ;把集合转变为序列
(first sequence) ;返回序列中第一个元素
(rest sequence) ;返回序列中第一个元素外的其余元素
(cons item sequence) ;返回一个新序列,item是整个序列的第一个元素,sequence是剩下的其余元素

get的用法:

(get ["a" "b" "c"] 15) ;=> nil
;超出index范围时不会报错而是返回nil,中间分隔符可以是空格也可以是",",第一个元素index是从0开始的,如想要“a“需要get 0

 对maps用get,把后面的index序号替换为key:
(let [ages {"Juhana" 3
            "Ilmari" 42
            "King of All Cosmos" -6}]
  (get ages "King of All Cosmos"))
;=> -6


;vectors是不可变的,你只能创建新的vector
(conj [1 2 3] 4)          ;=> [1 2 3 4]

;assoc 有的替换,没有的新增
(assoc [1 2 3 4] 2 "foo") ;=> [1 2 "foo" 4] 这里把3替换成了”foo“
(assoc {:a 1} :b 2) ;=> {:b 2, :a 1}
(assoc {:a 1} :a 2) ;=> {:a 2}

;index: 0 1 2                0   1   2
(assoc [3 2 1] 1 "~o~") ;=> [3 "~o~" 1]

一些常用到的函数:

(str "Hello" 886 "!") ;连接字符串

(interpose ":" [1 2 3])        ;=> (1 ":" 2 ":" 3)
(interpose " and " ["a", "b"]) ;=> ("a" " and " "b")
(interpose ", " [])            ;=> ()
(apply str (interpose " and " ["a", "b"])) ;=> "a and b"

(count [1 2 3]) ;=> 3
(count {:name "China Miéville", :birth-year 1972}) => 2 ;注意到字典maps里一对算一个元素
(count ":)") => 2

(filter pos? [-4 6 -2 7 -8 3]) ;filter返回一个指示符为true的序列
;=>       (      6         7          3  )
; value    -4    6    -2   7     -8   3
; pos?   false true false true false true
(filter (fn [x] (> (count x) 2)) ["ff" "f" "ffffff" "fff"])
;=> ("ffffff" "fff")

(take 20 (cycle ["foo" "bar"])) ;,cycle是虚幻,take取循环的前20次
(get "Clojure" 2) ;=> \o
(repeat 5 "*") ;=> ("*" "*" "*" "*" "*")
(repeat 3 "~o~") ;=> ("~o~" "~o~" "~o~")

一些指示符:

(number? n) returns true if n is a number.
(empty? coll) returns true if coll is empty.
(list? coll) and (vector? coll) test if coll is a list or a vector.
(count coll) returns the length of a list or a vector.
(contains? {"a" 1} "a")   ;=> true
(contains? {"a" 1} 1)     ;=> false ;注意到contains?用于字典maps时,只有包含key才返回true,并不匹配值
(contains? {"a" nil} "a") ;=> true
(contains? cities :title) ;=> true
(contains? cities :name)  ;=> false

有点烧脑子的函数:

 (map function collection)
;map有两个参数,第一个是函数,第二个是一个集合序列
;map会对集合中的每一个元素应用这个函数,并将求值后的结果返回成一个序列
(apply function a-seq)
;apply有两个参数,第一个是函数,第二个是序列,apply会对序列中的每一个值应用这个函数
;apply和map有什么区别,光看描述感觉两者很像,简单来说map返回的还是一个序列,apply则不是
(apply concat [["China Miéville"] ["Octavia E. Butler"]])
;=> (concat ["China Miéville"] ["Octavia E. Butler"])
;=> ("China Miéville" "Octavia E. Butler")


;(mapv) 和(filterv), map和filter返回值为数组Vectors而不是序列的另一个版本.

四、定义函数

(defn square [x]
  "square a number"
  ( * x x))
;[ ]内的是参数,“ ”内描述函数功能,函数的返回值为最后一个表达式

let的用法:
(defn hypotenuse [x y]
  (let [xx (* x x)
        yy (* y y)]
    (Math/sqrt (+ xx yy))))
(let [name1 value1
      name2 value2
      ...]
  (expression1)
  (expression2)
  ...)
;let提供本地变量绑定,仅在let句式内生效
;let绑定的变量可以是在let里才刚刚声明的变量,但是有先后顺序的要求,即可以是a=1,b=a+1,但不能是a=b+1,b=1
(let [[x y z] [1 2 3 4 5 6]]
  (str x y z))
;=> "123"
;let另一种绑定的对应方式

(defn sum-pairs [first-pair second-pair]
  [(+ (first  first-pair) (first  second-pair))
   (+ (second first-pair) (second second-pair))])

(defn sum-pairs [[x1 y1] [x2 y2]]
  [(+ x1 x2) (+ y1 y2)])

(def x 1) ;绑定全局变量和值或函数

(if 判断条件 为真执行 为假执行) ;if后面的为判断条件,如果true执行第一个表达式,如果false执行第二个


(cond
  condition1 true1
  condition2 true2
  condition3 true3
  :else true4)  ;cond用于分情况执行,如果condition1条件为false则跳到condition2,如果123都不是那么执行:else后面的

五、其他

linux安装lein用到的一些命令:
cd ~
mkdir bin
export PATH=$PATH:~/bin
source ~/.bashrc
chmod +x ~/bin/lein

lein常用命令:
lein midje  :autotest  运行midje测试,在后面加  :autotest 可以在每次保存变更后自动运行
lein repl      打开Clojure repl循环
lein new     创建一个新的Clojure项目

lein help <command> 查找帮助

关于lein midje是如何测试的,是通过申明一系列的facts事实,然后测试函数运行结果与预期值是否相符

(facts "square"
  (square 2) => 4
  (square 3) => 9)

git常用命令:
git clone +链接 克隆文件到本地
git commit -a -m "message goes here" 把你的改动写入git关系,并在终端汇总显示你的改动
git push 上传你之前的改动到github需要账户及密码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Clojure基础语法学习笔记(一) 的相关文章

  • 只使用7次比较,完成5个元素的排序

    背景 考虑快速排序为什么最坏情况下时间复杂度为O n2 xff1f 这是因为每次进行划分的时候 xff0c 都有一个部分大小为0 xff08 或者说为一个常数 xff09 如果我们能够找到一种时间复杂度为O n 的划分方法 xff0c 使得
  • 在windows下进行Openvidu webAPP开发

    在windows下进行Openvidu webAPP开发 64 Openvidu web IDE 概述 Openvidu视频会议包括KMS 媒体服务 xff09 Openvidu server xff08 会议服务 xff09 WebAPP
  • 参考 | Win11 开启热点之后电脑不能上网

    讲道理 xff0c Win11 就很离谱 Win11 开了移动热点之后 xff0c 电脑居然不能上网了 xff01 震怒 xff01 解决办法 打开控制面板 gt 程序 gt 程序和功能 gt 已安装更新右键卸载用于 Microsoft W
  • 参考 | 升级 Win11 移动热点开不了或者开了连不上

    讲道理 就很离谱 一开始我升级了 Win11 后 突然发现 移动热点 开不了了 就是那种 开了之后 手机 ipad 能检测到电脑移动热点的信号 但是会出现这两种情况 死活连不上连上了 在移动端显示 无互联网连接 解决办法 打开 移动热点 打
  • Ajax学习资源大全

    本欲放转载区 但是这样一文章放那里基本是没有用的 帮助不了任何人 所以放新手了 我一般非经典或者自己用不上不转载 所以如果你不幸看见了的话 恰恰你又对AJAX有兴趣的话不防看下 也许对你有用的 一 资源类网站 1 国内网站 1 Ajax中国
  • Apache+PHP5+MySQL4(5)+PHPMyAdmin 的简易安装配置

    先从各官方网站下了APACHE2 050 PHP5 MYSQL4 0 20 现在是5 有一些改变 xff0c 比如设置变成用向导next的方法 PHPMYADMIN2 57 最好下载最新客户端软件这里不是最新的 apache 2 0 50
  • 搜索引擎技术:系统架构

    互联网发展的今天 xff0c 一方面离不开其开放 共享的特性带给人们的全新体验 xff0c 另一方面也离不开数以亿计的为其提供各类丰富内容的网络节点 互联网被普及前 xff0c 人们查阅资料第一想到的便是拥有大量书籍资料的图书馆 xff0c
  • 行业门户搜索引擎方案

    案背景 xff1a 网站站内搜索引擎逐渐称为网站不可缺少的组成部分 xff0c 同时也成为网站地位的象征 然而 xff0c 随着网络的发展 xff0c 组织和组织之间的关系越来越紧密 xff0c 简单的站内搜索引擎已经不能满足网站的需求 特
  • SQL一般操作

    asc 按升序排列 desc 按降序排列 下列语句部分是Mssql语句 xff0c 不可以在access中使用 SQL分类 xff1a DDL 数据定义语言 CREATE xff0c ALTER xff0c DROP xff0c DECLA
  • 挑战30天 C/C++ 入门极限系列教程-引言

    作为一个长篇的C 43 43 入门教程 xff0c 无论如何也应该有这么个引言 xff0c 可是文笔并不好的我 xff0c 想了很久也不知道该如何写 仔细想想 xff0c 与其把这篇短文当作教程的引言 xff0c 其实它更应该是一篇引导初学
  • 战30天C++入门极限-C/C++中的结构体(1)

    什么是结构体 xff1f 简单的来说 xff0c 结构体就是一个可以包含不同数据类型的一个结构 xff0c 它是一种可以自己定义的数据类型 xff0c 它的特点和数组主要有两点不同 xff0c 首先结构体可以在一个结构中声明不同的数据类型
  • C#中如何实现C++中的const reference

    C 中如何实现C 43 43 中的const reference 在读C in depth时 xff0c 作者曾经感慨过 xff0c 可惜C 中没有类似于C 43 43 的const机制 xff0c 没有办法方便的返回一个对象的只读视图 读
  • VC环境下创建生成EXE的symbian工程问题集

    问 xff1a 1 我在VC下都是生成APP文件 xff0c 那么有没办法生成EXE呢 xff1f 如果不能直接在VC里生成 xff0c 那有其它的什么办法吗 xff1f 答 xff1a 1 生成什么类型的目标文件跟使用的IDE无关 xff
  • 图像处理中常见的滤波器小结

    在图像处理 计算机视觉领域 xff0c 我们有时需要对原始图像进行预处理 图像滤波是一种比较常用的方法 xff0c 通过滤波操作 xff0c 就可以突出一些特征或者去除图像中不需要的成分 通过选取不同的滤波器 xff0c 在原始图像上进行滑
  • CentOS7关闭默认firewall启用iptables防火墙

    CentOS7关闭默认firewall启用iptables防火墙 CentOS7关闭firewall启用iptables防火墙 CentOS 7系统默认的防火墙是firewall xff0c 但是我们很多人还是习惯使用iptables xf
  • Supervisor的安装与使用

    简介 Supervisor 是用 Python 开发的一套通用的 进程管理程序 xff0c 能将一个普通的命令行进程变为后台daemon xff0c 并监控进程状态 xff0c 异常退出时能自动重启 它是通过fork exec的方式把这些被
  • devenv使用方法

    CD C CD C Program Files Microsoft Visual Studio NET 2003 Common7 IDE DEL D KTAPP KTUI1601 licx devenv build debug 34 D K
  • usb连接ubuntu,fdisk -l 查不出usb信息

    问题 xff1a 想要通过usb连接在虚拟机上的Ubuntu xff0c 但连接上后linux系统有图标但是却是灰色的 xff0c 在虚拟机 可移动设备 xff0c 那里的USB 断开与主机连接也是灰色 通过fdisk l 查不到usb信息
  • 树莓派——开启xrdp,换镜像,双击打开sh等等__一蓑烟雨任平生

    文章目录 前言一 树莓派是什么 xff1f 二 烧卡开机1 镜像用树莓派官网的镜像2 开机基本设置3 设置SSH和VNC4 查看本地IP5 设定固定IP 二 深度设置1 更换镜像源2 安装远程桌面3 修改sh脚本 Linux基本命令使用总结
  • 关于QImage无法设置透明色的问题

    明明在setPixelColor时 xff0c 设置的QColor为 xff08 254 254 254 0 xff09 xff0c 但是最后的结果却是白色 这是由于在设置QImage格式时 xff0c 该格式不支持透明色 xff0c 可以

随机推荐

  • 程序员必备的 40 个 VSCode 扩展

    在编写代码时 xff0c 一个富有成效的工作空间不仅仅是要找到合适的代码编辑器 开箱即用的VS Code是为开发人员制作的 根据2021年StackOverflow的调查 xff0c 71 06 的受访者将Visual Studio Cod
  • django debug toolbar 不显示

    python3 6 43 django2 0 xff0c 安装了django debug toolbar xff0c 根据官方文档配置之后却没看到调试栏 xff0c 增加了SHOW TOOLBAR CALLBACK字段后才显示 settin
  • 驳 GarbageMan 的《一个超复杂的简介递归》——对延迟计算的实验和思考

    这是一篇因骂战而起的博文 xff0c GarbageMan 在该文章回复中不仅对我进行了侮辱 xff0c 还涉及了我的母校 xff0c 特写此文用理性的分析和实验予以回击 在此也劝告 GarbageMan xff0c 没什么本事就别在那叫嚣
  • Debian_DNS服务搭建

    DNS是什么 xff1f DNS xff0c Domain Name System或者Domain Name Service xff08 域名系统或者余名服务 xff09 域名系统为Internet上的主机分配域名地址和IP地址 用户使用域
  • 解决MySQL无法插入中文数据问题(UTF-8编码)

    我花了好几个小时找过各种方法 xff0c 最终靠这个方法实现了中文插入 xff0c 我都快要喜极而泣了 xff0c 分享给大家 xff0c 真的很实用 一些关于查看和修改字符集的MySQL知识 xff1a 查看mysql的字符集 xff1a
  • PHP判断IP是否属于某个网段

    IP通过ip2long转换后可以进行比较 span class php span class hljs preprocessor lt php span span class hljs comment 判断IP是否在某个网络内 span c
  • phpstore 2016.1版激活方法

    激活请填写下面的地址吧 xff1a span class hljs label http span idea span class hljs preprocessor qinxi span 1992 span class hljs prep
  • Group by无法排序,但可以通过子查询实现

    lt pre name 61 34 code 34 class 61 34 sql 34 gt select from table where id in select max id from table where tid in 0 10
  • ext4文件系统恢复被删除的文件

    ext4magic工具 可以恢复出被rm f删除的文件 xff08 只要原始数据块未被新数据所覆盖 xff09 ext4magic device M d savedir 可参考 https sourceforge net projects
  • nginx反向代理经验整理

    location flag proxy pass http 127 0 0 1 19999 上面这段配置的反向代理实际访问路径是 usr www location flag proxy pass http 127 0 0 1 19999 上
  • Git一些使用注意事项

    Git创建远程空仓库时要注意加上 shared 61 group 即命令 xff1a 初始化远程空仓库 xff1a git init bare shared 61 group 给空仓库设置组共享 xff1a git config core
  • 使用WSL在Windows上安装Ubuntu

    1 清理环境 查看当前的wsl 状态 xff0c wsl list 可以列出当前系统中已安装的子系统 选择需要清理的系统 xff0c 然后用 wsl unregister lt DistributionName gt 即可完成卸载 将 ws
  • CentOS/Ubuntu/Debian常用版本更换国内源的方法

    Linux系统安装完后软件源一般都是国外服务器 xff0c 在国内特别慢 xff0c 这时候就需要更换国内的镜像源 如163 aliyun 还有各高校镜像源等 记住先备份原始源在更换源 xff0c 以防以后备用 一 centos 1 备份
  • C++ 的引用类型

    C 43 43 的引用类型 在翻旧文的时候 xff0c 发现这么一篇文章 xff1a 关于一道C 43 43 笔试题的纠结 xff0c 学计算机的伤不起啊 当时可能是觉得 Placement new 的语法1比较新鲜 xff0c 所以印象比
  • Debian 10(buster) 更换国内软件源

    今天安装了个debian10 xff0c 发现网上包括各大镜像网站提供的源地址都有点问题 xff0c 经测试 xff0c Debian 10 xff08 buster xff09 可用的国内软件源如下 xff08 阿里云源 xff09 xf
  • 华为交换机SNMP配置

    华为交换机SNMP配置 snmp服务配置 交换机内设置snmp一般只需要启动snmp服务和配置团体名称 xff0c 然后设置下版本就可以了 全局模式下 xff0c 配置命令 1 启动snmp服务 xff1a snmp agent 2 设置团
  • qt 菜单栏创建

    h文件内容 xff1a pragma once include lt QtWidgets QMainWindow gt include 34 ui QtWidgetsApplication2 h 34 include lt QLabel g
  • 立志学习编程的第一天 2021-05-06

    一直很遗憾大学没能报计算机专业 xff08 还一直觉得自己是被耽误的程序员来着 xff09 现在且用业余时间来试试 xff0c 且拭目以待吧 xff01 学习内容 xff1a Clojure for the Brave and True 工
  • 关于Clojure的Emacs配置 2021-05-07

    首先安装lein和Emacs xff1a https leiningen org http www gnu org software emacs 安装好Emacs之后 xff0c 找到 emacs d 对windows系统 xff0c 文件
  • Clojure基础语法学习笔记(一)

    首先推荐两个目前正在学的免费学习资源 xff1a Functional programming in Clojure Clojure for the Brave and True 都是英文的 xff0c 第一个是边学边练的形式 xff0c