`
Dead_knight
  • 浏览: 1201012 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
752c8642-b795-3fe6-946e-a4e845bffdec
Spring Securi...
浏览量:240207
33caa84e-18a6-3036-a82b-6e2106a4de63
clojure专题
浏览量:48915
E17ca077-44df-3816-a3fe-471c43f6e1e5
WebLogic11g
浏览量:236876
社区版块
存档分类
最新评论

clojure-基本语法-流程控制(二)

阅读更多
二、异常处理
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电子书

    这本书不仅讲解了Clojure的基本语法和API,而且通过实例展示了如何使用Clojure解决实际问题。Halloway详细阐述了Clojure的REPL(Read-Eval-Print Loop)工作原理,以及如何利用它进行开发和测试。他还讨论了Clojure...

    inf-clojure:与Clojure子流程的基本交互

    inf-clojure就是这样一个工具,它提供了与Clojure子流程进行基本交互的能力,使得开发者可以在一个Clojure进程中启动另一个Clojure进程,并进行通信。本文将深入探讨inf-clojure的使用方法和背后的原理。 首先,...

    Python-利用Clojure实现的一个可拖放的看板示例

    1. **Clojure编程**:了解Clojure的基本语法、函数式编程概念、宏(macros)以及如何使用它来构建用户界面。可能涉及的库包括Reagent或React Clojure绑定,用于创建可交互的前端组件。 2. **Datomic或其它数据库...

    clojure programming

    此外,Clojure还使用特殊形式(Special Forms)来控制程序的执行流程,例如条件表达式、循环和函数定义。书中还解释了如何使用集合字面量(Collection Literals)来创建列表、向量、映射和集合等数据结构。 此外,...

    fletching-macros:与clojure.core线程(箭头)宏互补的Clojure宏

    在Clojure的世界里,宏(Macros)是其独特魅力的一部分,它们允许程序员在编译时对代码进行操作,创造出新的语法结构。"fletching-macros"正是这样一个针对Clojure编程语言的宏库,它旨在作为clojure.core库中线程...

    sparkledriver:jBrowserDriver的Clojure包装器,它是JFX嵌入式WebKit的与Selenium兼容的包装器

    使用SparkleDriver进行测试的基本流程可能如下: ```clojure (require '[sparkledriver.core :as sd]) (def driver (sd/start-driver)) (sd/open-url driver "http://example.com") (let [element (sd/find-...

    hello-clojurescript:简单的clojurescript启动项目

    在描述中提到的是该项目的简洁性,意味着它包含的基础元素和基本设置,适合初学者用来了解Clojurescript的开发环境和基本语法。通常,这样的项目会包括一个简单的源代码文件,用于输出“Hello, World!”字符串,以及...

    figwheel-main-template:一个模板,用于生成最小的基于figwheel-main的ClojureScript项目

    ClojureScript是一种基于Clojure的、编译为JavaScript的方言,它允许开发者利用Clojure的强大语法和函数式编程特性来编写前端或全栈应用。ReactJS是一个流行的JavaScript库,用于构建用户界面,特别是单页应用程序...

    re-jump.el:重新框架项目的emacs导航

    1. **Emacs Lisp**:了解Emacs的内建语言,包括基本语法、宏定义、函数和变量等,是使用和定制Emacs的基础。 2. **Clojure/ClojureScript**:学习这两门语言的基本概念,如S-expressions、VIM数据结构、宏系统,以及...

    大数据的Java基础.pdf

    2. 基本语法和数据类型:介绍Java的基本语法规则,如变量声明、运算符、流程控制等,以及基本数据类型(如整型、浮点型、字符型和布尔型)。 3. 对象导向编程:讲解类、接口、方法、访问控制等概念,以及封装、继承...

    ksbysample-antora:AsciiDoc形式のドキュメントを置くレポジトリ

    2. **AsciiDoc语法**: AsciiDoc的基本元素、格式指令、图片插入、表格创建、链接和引用的使用,以及如何转换为不同格式。 3. **Clojure**: Clojure的基础概念,如Lisp风格的语法、函数式编程原则、闭包、邓巴数、...

    buddy-auth:用于基于环和环的Web应用程序的身份验证和授权功能

    `buddy-auth`旨在简化身份验证与授权流程,使开发人员能够更专注于业务逻辑,而不是安全细节。 【知识点详解】: 1. **Ring框架**:Ring是Clojure社区的一个核心组件,它定义了一个简洁的HTTP服务器接口,将HTTP...

    clojurescript-threejs-playground:玩转 Clojurescript 和 Three.js,中间有 figwheel

    通过这个项目,开发者可以学习ClojureScript的基本语法、函数式编程的理念,以及如何利用Three.js创建3D场景。例如,ClojureScript中的向量化数据处理能力与Three.js的几何体、材质和光照相结合,可以创造出复杂的3D...

    time-travel-pong:乒乓球与时间旅行能力。 ClojureScript 项目

    1. **ClojureScript基础**:了解ClojureScript的基本语法、数据结构、函数式编程思想以及如何使用它进行面向对象的设计。 2. **游戏逻辑编程**:学习如何编写乒乓球游戏的规则,如球的运动轨迹、碰撞检测、得分系统...

    cture:用于ClojureScript的前端开发工具包

    由于ClojureScript的语法与Clojure基本一致,但编译结果是可运行的JavaScript,因此它成为了跨平台Web应用开发的理想选择。 **2. Reagent与React** Reagent是ClojureScript中的一个轻量级库,它提供了与React.js...

    clojurescript-reagent-pexeso:示例ClojureScript应用程序,显示使用Reagent编写的简单应用程序

    总的来说,`clojurescript-reagent-pexeso`项目展示了如何使用ClojureScript和Reagent构建一个交互式的Web应用,它涵盖了ClojureScript的基本语法、Reagent组件的使用、状态管理和事件处理等多个重要知识点。...

    CS1804_U201814755_彭子晨_函数式编程 1

    在学习函数式编程时,理解λ演算和组合子逻辑的基本概念,掌握LISP或Haskell等语言的基本语法,以及熟悉如何利用高阶函数和递归解决实际问题,是至关重要的。此外,了解函数式编程在实际项目中的应用,如使用Scala...

    Java采购管理信息系统源码-clojurefast:克洛乔法斯特

    ClojureFast项目选择Clojure的原因可能包括其简洁的语法、强大的并发处理能力以及对数据结构的高效操作。通过使用Clojure,开发者可以构建高度模块化和可维护的代码,同时利用Java生态系统中的丰富库和框架。 该...

    go.blog:我的博客的源代码

    通过学习和研究这个开源项目,开发者不仅可以提升Go或Clojure编程技能,还能掌握Web开发流程、数据库设计、API设计、项目管理等多个方面的能力。同时,参与开源社区的讨论和贡献,也能提高自身的协作能力和影响力。

Global site tag (gtag.js) - Google Analytics