一、标准的流程控制 

if: 
将一个判断表达式作为它的第一个参数进行求值。如果求值为true,那么就返回它的第二个参数(相当于“then”子句)的求值结果。如果结果为false(包括nil)就返回第三个参数的求值结果(相当于“else”子句),前提是有提供第三个参数并且不为空。

  1. user=> (defn is-small [number] (if (< number 100) "yes" "no"))
  2. #'user/is-small
  3. user=> (is-small 50)
  4. "yes"
  5. user=> (is-small 110)
  6. "no"

if条件中除了false和nil,其他都为true:

  1. user=> (if true "true")
  2. "true"
  3. user=> (if 0 "true")
  4. "true"
  5. user=> (if "" "true")
  6. "true"
  7. user=> (if nil "true")
  8. nil
  9. user=> (if false "true")
  10. nil

if-not: 
跟 if 的用法相同,但是作用是相反的。当逻辑为false的时候会去计算第二个参数的值,为true的时候才计算第三个参数的值

  1. user=> (if-not (zero? 0) "no" "yes")
  2. "yes"
  3. user=> (if (not (zero? 0)) "no" "yes")
  4. "yes"

if-let: 
if-let宏接受两个参数,第一个参数为绑定变量,第二个参数为表达式。并根据第二个表达式参数返回的值确定执行then、else语句。

  1. user=> (defn if-let-test [arg] (if-let [x arg] "true" "false"))
  2. #'user/if-let-test
  3. user=> (if-let-test 1)
  4. "true"
  5. user=> (if-let-test nil)
  6. "false"
  7. user=> (if-let-test false)
  8. "false"

when: 
when没有else子句,如果when后面第一个参数为true,则执行条件后的所有语句,否则返回nil。

  1. user=> (when false (println "is true") "return true")
  2. nil
  3. user=> (when true (println "is true") "return true")
  4. is true
  5. "return true"
  6. user=> (def has-value (when true (println "hello world") "returned value"))
  7. hello world
  8. #'user/has-value
  9. user=> has-value
  10. "returned value"

when-not: 
when-not与when类似,只是第一个参数返回false,才执行后面所有语句,否则返回nil。

  1. user=> (when-not  false (println "is true") "return true")
  2. is true
  3. "return true"
  4. user=> (when-not true (println "is true") "return true")
  5. nil

when-let:
when-let与if-let类似,只有绑定变量值不是false、nil时,才执行后面所有语句,否则直接返回nil。

  1. user=> (when-let [a true] (println "true") "return true")
  2. true
  3. "return true"
  4. user=> (when-let [a false] (println "true"))
  5. nil
  6. user=> (when-let [a nil] (println "true"))
  7. nil

cond: 
cond 可以有任意个“判断/表达式”对,作为它的参数。如果满足第一个判断,就执行第一个判断对应的表达式。如果没有满足第一个条件,就会尝试后面的判断表达式,以此类推。如果一个都没有满足,那么返回 nil 除非你用一个 :else 关键字放在最后来抓住剩下的所有可能性。cond类似于java中的switch..case..default语句,如:

  1. user=> (defn f [n] (cond (< n 0) "<0" (< n 10) "<10" :else ">=10"))
  2. #'user/f
  3. user=> (f -2)
  4. "<0"
  5. user=> (f 2)
  6. "<10"
  7. user=> (f 10)
  8. ">=10"

case: 
case可以简单理解为java中switch的case,如下

  1. user=> (let [mystr "hello"];首先绑定mystr的值为hello
  2. (case mystr
  3. "" 0
  4. "hello" (count mystr)));case用于匹配mystr的值
  5. 5
  6. user=> (let [mystr "no match"]
  7. (case mystr
  8. "" 0
  9. "hello" (count mystr)
  10. "default")) ;最后一个表达式只有匹配不成功时才执行
  11. "default"

case可以用列表一次匹配多个值:

  1. user=> (defn f [x] (case x
  2. (5 10) "*5"
  3. (3 6 9) "*3"
  4. "others"))
  5. #'user/f
  6. user=> (f 5)
  7. "*5"
  8. user=> (f 10)
  9. "*5"
  10. user=> (f 6)
  11. "*3"
  12. user=> (f 1)
  13. "others"

do: 
do执行多条语句,返回最后一条语句值

  1. user=> (def v (do (println 123) (println 321) -1))
  2. 123
  3. 321
  4. #'user/v
  5. user=> v
  6. -1

loop、recur: 
如果递归的层次太深的话,那么可能会产生内存不足的情况。所以一些编程语言利用 “tail call optimization” (TCO)的技术来解决这个问题。在Clojure里面避免这个问题的一个办法是使用loop 和recur。

  1. ;定义递归语句完成10+9+……1=55
  2. user=> (loop [sum 0 cnt 10] (if (= cnt 0) sum (recur (+ cnt sum) (dec cnt))))
  3. 55

loop/recur 组合把一个看似递归的调用变成一个迭代 — 迭代不需要占用栈空间。 loop special form 跟let special form 类似的地方是它们都会建立一个本地binding,但是同时它也建立一个递归点, 而这个递归点就是recur的参数里面的那个函数。loop给这些binding一个初始值。对recur 的调用使得程序的控制权返回给loop 并且给那些本地binding赋了新的值。给recur传递的参数一定要和loop所创建的binding的个数一样。同样recur只能出现在loop这个special form的最后一行

Clojure 学习入门(15)- 条件判断相关推荐

  1. C++学习笔记3[条件判断语句]

    C++学习目录链接: C++学习笔记目录链接(持续更新中) 文章目录 一.条件判断语句 1.判断语句 二.使用条件运算符进行判断 三.switch语句 四.判断语句嵌套 总结 一.条件判断语句 1.判 ...

  2. php基础教程 第六步 学习数组以及条件判断switch补充

    条件语句 switch 在上一节的学习中,学习了php的条件语句if.在php编程中进行条件判断还可以使用switch语句.switch语句语法如下: <?php switch (值或表达式) ...

  3. Clojure 学习入门(6)- 函数定义

    一.创建函数:  fn: fn是一个宏,用于定义一个简单的函数,如下:  [python] view plaincopy print? user=> (fn [] "hello&quo ...

  4. JavaScript学习笔记(条件判断)

    JavaScript使用if(){-}else{-}来进行条件判断 ,例如: //单个if else分支 var age = 20; if (age >= 18) {alert('adult') ...

  5. Clojure 学习入门(6)—— 函数定义

    一.创建函数: fn: fn是一个宏,用于定义一个简单的函数,如下:  user=> (fn [] "hello") #<user$eval375$fn__376 us ...

  6. Clojure 学习入门(14)- 循环控制

    Clojure 基于函数的流程控制  repeatedly 字面意思为重复函数.一般的用法如下: user=> (repeatedly 5 #(rand-int 11)) (6 8 2 6 6) ...

  7. Clojure 学习入门(1) - 学习资料

    转自:http://blog.csdn.net/ithomer/article/details/17225813 Clojure(发音类似"closure",['kləʊʒə(r) ...

  8. linux循环判断输出结果,Linux Shell基础学习——循环与条件判断

    for循环 1. 注意do必须换行 for i in {1..10} do echo $i done 2. 注意do必须换行 for i in 1 2 3 4 5 do echo $i done 3. ...

  9. Clojure 学习入门(13)- binding

    Clojure里面是不支持变量的.Binding跟变量有点像,但是在被赋值之前是不允许改的,包括:全局binding, 线程本地(thread local)binding, 以及函数内的本地bindi ...

最新文章

  1. thinkPHP 模板的使用技巧(十三)
  2. [Poi2010]Antisymmetry
  3. 如何用c语言实现贪吃蛇登录界面,c语言贪吃蛇UI界面版.docx
  4. 【Linux系统编程】进程间通信--共享内存
  5. Oracle 变量绑定与变量窥视合集系列一
  6. jzoj6297-世界第一的猛汉王【切比雪夫距离,扫描线】
  7. 联万物,+智能,为行业,华为云升级OceanConnect IoT全栈云服务
  8. vue3没了$children,如何获取子组件???
  9. 数据结构实验3-带头结点的单链表
  10. java修改头像代码_用户修改头像功能
  11. 一文搞懂函数计算及其工作原理
  12. 【Codeforces】A1组刷题记录(50/ 50)完结
  13. Windows XP支持的最大内存是多少?
  14. 如何理解「朝闻道,夕死可矣」?
  15. 中英文切换_值得收藏|不重装软件实现ArcGIS中英文版本之间切换
  16. 中国天气预报数据API收集
  17. JAVA 赛码网|笔试时输入输出的控制
  18. Spring漫画学习笔记(二) 什么是BeanFactory
  19. shell技巧4 - nm命令解决AppStore2.5.2被拒问题
  20. 物联网开发笔记(31)- 使用Micropython开发ESP32开发板之手机扫二维码远程控制开关灯(1)

热门文章

  1. 我是怎么找电子书的?
  2. java发送短信的发送报告处理
  3. 《干货集锦》——前端大牛 Addy Osmani 的15个精彩PPT
  4. 《算法导论》读书笔记之第10章 基本数据结构之二叉树
  5. 创业6年,网络营销真的很重要
  6. ubuntu 装完系统之后的简单配置
  7. 一个优秀的 Node.js 开发者
  8. linq to sql 行转列_n套SQL面试题--行转列、留存、日活等
  9. spss无法连接到本地计算机,有关IBM SPSS Statistics无法打开的几个原因,附带解决方法...
  10. android 混淆移除log,关于安卓代码混淆和Release版本中去除Debug信息