二、异常处理
Clojure代码里面抛出来的异常都是运行时异常。当然从Clojure代码里面调用的java代码还是可能抛出那种需要检查的异常的。try,catch,finally 以及throw 提供了和java里面类似的功能:
try、catch、throw、finally:
user=> (try (throw (Exception. "error")) (finally (println "final")))
final
Exception error user/eval310 (NO_SOURCE_FILE:1)
user=> (try (/ 3 0) (catch Exception e (println e)))
#<ArithmeticException java.lang.ArithmeticException: Divide by zero>
nil
assert:
它测试一个表达式, 如果这个表达式的值为false的话,它会抛出异常。
user=> (assert true)
nil
user=> (assert false)
AssertionError Assert failed: false user/eval317 (NO_SOURCE_FILE:1)
user=> (assert nil)
AssertionError Assert failed: nil user/eval319 (NO_SOURCE_FILE:1)
user=> (assert 0)
nil
user=> (assert [1 2 3])
nil
user=> (assert "foo")
nil
三、基于函数的流程控制
repeatedly:
repeatedly字面意思为重复函数。一般的用法如下:
user=> (repeatedly 5 #(rand-int 11))
(6 8 2 6 6)
重复产生5次随机数。rand-int 11表示0至11的随机数。
这里顺便提一下repeat函数:repeat函数接受一/两个常量参数,用法如下:
user=> (repeat 5 (int (rand-int 100)))
(30 30 30 30 30)
当repeat、repeatedly函数只接受一个参数时(即没有重复次数的参数),需要配合take来中止,否则会产生内存溢出的错误。如下:
user=> (repeatedly #(rand-int 11))
OutOfMemoryError Java heap space java.util.Arrays.copyOf (Arrays.java:2882)
user=> (take 5 (repeatedly #(rand-int 11)))
(10 7 0 2 8)
iterate:
迭代函数形式如下:
(iterate f v)
相当于:
while(true) { v = f(v) }
所以一般要配合(take n sequence)来中止:
user=> (take 10 (iterate inc 5)) ; (5 6 7 8 9 10 11 12 13 14)
user=> (take 10 (iterate #(+ % 5) 5)) ; (5 10 15 20 25 30 35 40 45 50)
user=> (take 10 (iterate #(* % 2) 2)) ; (2 4 8 16 32 64 128 256 512 1024)
四、基于序列的流程控制
dotimes:
dotimes 会执行给定的表达式一定次数, 一个本地binding会被给定值:从0到一个给定的数值。如下:
user=> (dotimes [num 3] (println "number:" (inc num)))
number: 1
number: 2
number: 3
nil
doseq:
doseq和for的语法是一样的,只不过for返回lazy seq而doseq接受任意数量的表达式, 以有副作用的方式执行它们, 并且返回nil
user=> (doseq [i (range 10)] (println i))
0
1
2
3
4
5
6
7
8
9
nil
user=> (doseq [i [1 2 3] j [10 20]] (println i "-" j))
1 - 10
1 - 20
2 - 10
2 - 20
3 - 10
3 - 20
nil
for:
for、doseq都支持遍历多个集合(最右边的最快),同时还可以用:when 和 :while来过滤。
user=> (for [x (range 3 7)] (* x x))
(9 16 25 36)
user=> (for [x [0 1 2 3 4 5] :let [y (* x 3)] :when (even? y)] y)
(0 6 12)
上面第二条语句可理解为:先定义x为集合,再使用let将y赋值为x*3,最后判断y是否为偶数,偶数才返回
分享到:
相关推荐
clojure-1.5.1.jar
clojure-cheatsheet, 用于Emacs的Clojure Cheatsheet 用于Emacs的难以置信方便的 Clojure Cheatsheet,更新为 Clojure,打包成简单,快速,可以搜索的离线形式: 状态准备使用基于 Clojure 1.7.0.安装如果你连接到 ...
clojure-csv, 从Clojure读取和写入CSV文件的库 csvclojure CSV是一个用于读取和写入CSV文件的小型库。 主要功能:接受两个常见行终止符。CSV字段内的引号和转义符是正确的句柄。解析时支持在CSV字段中嵌入未转义的行...
java运行依赖jar包
clojure 1.8.0
programming-clojure-3rd第三版,mobi,epub,azw3格式
clojure-1.3.0 clojure-1.3.0 clojure-1.3.0 clojure-1.3.0
clojure-sha-3-源码.rar
clojure-must-watch-源码.rar
氯菊酯 Clojure的。 采用类似于草书的方法静态分析代码。 •••••• 总览 该项目的目标是为所有编辑人员带来适用于Clojure的出色... clojure-lsp启动了一个NREPL服务器,可以更改正在运行的实例的代码并实时查看客
clojure-basics-源码.rar
Clojure入门介绍: Clojure - Functional Programming for the JVM
clojure-1.6 java jvm
Fork of http://code.google.com/p/clojure-jsr223/ that loads the Clojure runtime lazily. Copyright (c) 2009 Armando Blancas. All rights reserved. The use and distribution terms for this software are ...
clojure-utils, 各种小型但方便的clojure实用程序函数库 各种小型但方便的Clojure实用程序函数库特别关注:Clojure.java - 用于从Java调用Clojure的实用工具函数的Java类arrays.clj - 操作Java数组core.clj - 应该在...
clojure-tensorflow, Java api的Java上的一个极轻层 和 TensorFlowJava互操作上的包装器层,用于处理 TensorFlow 。 正在启动神经网络示例(ns example.core (:require [clojure-tensorflow.ops :a
Nginx-Clojure 是一个 Nginx 的模块,用于嵌入 Clojure 或者 Java 或者 Groovy 程序。 可以通过nginx-clojure实现JAVA扩展nginx的功能,如权限验证。
该版本为稳定版,将zip文件解压,放到某个指定目录,cd进入这个目录,执行以下命令即可java -cp clojure-1.5.0.jar clojure.main。 当今最主流的运算平台JVM,把函数式编程语言引入JVM也是新方向。
来源clojure-toolbox.com___下载.zip
clojure-twitter, 面向 Twitter API的Clojure客户端 面向Clojure的 Twitter 客户端 API从Clojure访问 Twitter API 。建筑lein depslein jar示例(require 'twitter ['oauth.