Clojure语法学习-循环
do和块语句
在Scala中,花括号{}括起来的语句构成一个block,它的值就是最后一个语句的值。
scala> val a = {
| println("a")
| 1}
a
a: Int = 1
{println("a"); 1}的值为1。
在Clojure中,有时需要使多个form组成一个block, 这个block的值是最后一个form的值。这时候就用do
user=> (def a (do (println "a") 1))
a
#'user/a
user=> a
1
do takes any number of forms, evaluates them all, and returns the last.
do接受任意多的form作为参数,对它们分别求值,然后返回最后一个form的值。
循环
有哪些要素才能构成一个循环?
在Java中
- 首先,我们需要提供一个在每次循环中都会被执行的语句——循环体
- 如果不是无限循环,我们需要提供退出条件,当这个条件满足时,不再循环。
在Clojure中
- 首先,我们需要提供一个在每次循环中都会被执行的语句——循环体
- 我们需要提供循环条件。它这个条件满足时,继续下一次循环。
也就是说Java需要我们告诉它什么时候退出循环,而Clojure需要我们告诉它何时继续循环。
Java的for循环是这样的
for(int i = 0; i < 10; i++)
System.out.println(i);
可以认为 i< 10, i++以及System.out.println(i)构成了循环体。退出条件为i<10。
while循环与for循环的不同之处在于while无法声明只在循环内部使用的变量。在上边的for循环中, i只在循环内部使用。如果我们想让while有类似的功能(当然,while没这功能),那么while需要接受一个初始化语法,变成
while(int i = 0)(i < 10){
println(i);
i++;
}
在Clojure中,同样可以以binding的形式提供初始化语句, 以及提供循环体。这通过loop这种form来实现
(loop [bindings *] exprs*)
这就类似前边这个加强版的while。同时,在while循环中需要break来打破循环; 在Clojure中,我们需要一种form来继续循环,这就是recur。可以认为Java的循环是主动的,而Clojure中的是被动的,你必须在代码中驱动它前进。
(loop [a 0] (if (< a 10) (do (println a) (recur (+ 1 a)))))
recur使得程序重新开始执行loop。但是如何程序中是简单地重新执行loop,它就只是原地踏步,因为所有的绑定都始终是初始值。所以recur不仅转变了程序的执行流,而且修改了loop开始的绑定。即,recur使得loop开始对a的绑定变成了(+ 1 a)。
假如,我们在loop开始的时候多提供一个绑定
(loop [a 0 b 1] (if (< a 10) (do (println a) (recur (+ 1 a)))))
REPL就会告诉我们提供给recur的参数个数不对
CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 2 args, got: 1
实际上,recur不仅可以用于loop,也可以用于函数,它使得函数被重新执行。
举个书上的例子
(defn countdown [result x] (if (zero? x)
result
(recur (conj result x) (dec x))))
执行(count down [] 5)会输出返回值[5 4 3 2 1]
这种代码怎么看着这么眼熟呢?这不就像是尾递归吗?
Clojure语法学习-循环的更多相关文章
- doy05循环语法学习笔记
doy05循环语法学习笔记 一.while循环语法: 1.基本用法示例 x = 1 while x <= 5: print(x) x += 1 2.死循环:永远不结束的循环 如:while Tr ...
- Golang 语法学习笔记
Golang 语法学习笔记 包.变量和函数. 包 每个 Go 程序都是由包组成的. 程序运行的入口是包 main. 包名与导入路径的最后一个目录一致."math/rand" 包由 ...
- Swift高级语法学习总结(转)
Swift高级语法学习总结 1.函数 1.1 func funcNmae()->(){} 这样就定义了一个函数,它的参数为空,返回值为空,如果有参数和返回值直接写在两个括号里就可以了 1.2 参 ...
- Swift基础语法学习总结(转)
Swift基础语法学习总结 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型 ...
- Swift高级语法学习总结
Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.函数 1.1 func funcNmae()->(){} 这样就定义了一个函数,它的参数为空,返回值为空,如 ...
- Swift基础语法学习总结
Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift ...
- Robot Framework语法学习(一)
Robot Framework语法学习: 一.变量的声明.赋值与使用 1.变量标识符:每个变量都可以用 变量标识符 ${变量名} 来表示. 2.变量声明:可以在TestSuite上点右键或者在Edi ...
- clisp, scheme 和 clojure 初学习
clisp, scheme和clojure 初学习 1 clojure "clojure绝对会成为你的编程工具箱里的终极武器" "其他语言可能只是工具,但 Clojure ...
- 毕业设计 之 五 PHP语法学习笔记
毕业设计 之 四 PHP语法学习笔记 作者:20135216 平台:windows10 软件:XAMPP,DreamWeaver 说明:该笔记是对网站编程语言的详细学习 一.PHP基础 0. 关于环境 ...
随机推荐
- ms mpi error: unable to allocate launching block
问题描述: 在VS 2015中使用Microsoft MPI(ms mpi)构建控制台应用,使用" mpiexec -n 4 myprog.exe"运行时退出并提示"un ...
- 本招聘信息2014年长期有效!杭州派尔科技高薪诚聘android开发(10K-20K),web前端开发(8K-15K),IOS开发(15K-25K)
杭州派尔科技有限公司发展至今,离不开员工的无私奉献和辛勤耕耘,在努力创造更好成绩的同时,公司也不忘回馈每一位员工的努力与付出.1.全面的绩效考核机制,让发展空间近在眼前!公司力争让每一位员工都了解自己 ...
- Swift结构体与类
在面向过程的编程语言(如C语言)中,结构体用得比较多,但是面向对象之后,如在C++和Objective-C中,结构体已经很少使用了.这是因为结构体能够做的事情,类完全可以取而代之.而Swift语言却非 ...
- c# using 引用和别名的使用
1.使用别名 在同时引用的两个命名空间中有相同的类型时,可以使用别名来区分.如下所示: using System; using System.Threading; using System.Timer ...
- spring mvc 拦截器
拦截器作用:可以用于用户操作的安全检查,如:登录.权限等 package com.tool; import java.util.List; import javax.servlet.http.Http ...
- 生成随机字符串(UUID方法)
这是另一种用UUID生成随机字符串的方法. public class RandomGenerator{ private int length; public void setLength(int le ...
- Bitmap、CBitmap、HBITMAP以及BITMAP的相互转换
Bitmap.CBitmap.HBITMAP以及BITMAP的相互转换 构建CBitmapCBitmap bmp;bmp.LoadBitmap(ID); 构建HBITMAPHBitmap = (HBI ...
- 哈希表的C++实现(转)
哈希表的几个概念: 映像:由哈希函数得到的哈希表是一个映像. 冲突:如果两个关键字的哈希函数值相等,这种现象称为冲突. 处理冲突的几个方法: 1.开放地址法:用开放地址处理冲突就是当冲突发生时,形成一 ...
- 输入与enter
#include<iostream> using namespace std; int main() { char a,b,c; while(scanf("%c%c%c" ...
- java实现多模匹配算法
这个是好几年前写的了.都统一放到cnblogs上面. --------------------------------Node ---------------------------------- p ...