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

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

阅读更多
一、标准的流程控制
if:
将一个判断表达式作为它的第一个参数进行求值。如果求值为true,那么就返回它的第二个参数(相当于“then”子句)的求值结果。如果结果为false(包括nil)就返回第三个参数的求值结果(相当于“else”子句),前提是有提供第三个参数并且不为空。
user=> (defn is-small [number] (if (< number 100) "yes" "no"))
#'user/is-small
user=> (is-small 50)
"yes"
user=> (is-small 110)
"no"

if条件中除了false和nil,其他都为true:
user=> (if true "true")
"true"
user=> (if 0 "true")
"true"
user=> (if "" "true")
"true"
user=> (if nil "true")
nil
user=> (if false "true")
nil


if-not:
跟 if 的用法相同,但是作用是相反的。当逻辑为false的时候会去计算第二个参数的值,为true的时候才计算第三个参数的值
user=> (if-not (zero? 0) "no" "yes")
"yes"
user=> (if (not (zero? 0)) "no" "yes")
"yes"


if-let:
if-let宏接受两个参数,第一个参数为绑定变量,第二个参数为表达式。并根据第二个表达式参数返回的值确定执行then、else语句。
user=> (defn if-let-test [arg] (if-let [x arg] "true" "false"))
#'user/if-let-test
user=> (if-let-test 1)
"true"
user=> (if-let-test nil)
"false"
user=> (if-let-test false)
"false"


when:
when没有else子句,如果when后面第一个参数为true,则执行条件后的所有语句,否则返回nil。
user=> (when false (println "is true") "return true")
nil
user=> (when true (println "is true") "return true")
is true
"return true"
user=> (def has-value (when true (println "hello world") "returned value"))
hello world
#'user/has-value
user=> has-value
"returned value"


when-not:
when-not与when类似,只是第一个参数返回false,才执行后面所有语句,否则返回nil。
user=> (when-not  false (println "is true") "return true")
is true
"return true"
user=> (when-not true (println "is true") "return true")
nil


when-let:
when-let与if-let类似,只有绑定变量值不是false、nil时,才执行后面所有语句,否则直接返回nil。
user=> (when-let [a true] (println "true") "return true")
true
"return true"
user=> (when-let [a false] (println "true"))
nil
user=> (when-let [a nil] (println "true"))
nil


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


case:
case可以简单理解为java中switch的case,如下
user=> (let [mystr "hello"];首先绑定mystr的值为hello
          (case mystr  
            "" 0 
            "hello" (count mystr)));case用于匹配mystr的值
5     
user=> (let [mystr "no match"] 
          (case mystr  
                "" 0 
                "hello" (count mystr) 
                "default")) ;最后一个表达式只有匹配不成功时才执行
"default"

case可以用列表一次匹配多个值:
user=> (defn f [x] (case x
       (5 10) "*5"
       (3 6 9) "*3"
       "others"))
#'user/f
user=> (f 5)
"*5"
user=> (f 10)
"*5"
user=> (f 6)
"*3"
user=> (f 1)
"others"


do:
do执行多条语句,返回最后一条语句值
user=> (def v (do (println 123) (println 321) -1))
123
321
#'user/v
user=> v
-1


loop、recur:
如果递归的层次太深的话,那么可能会产生内存不足的情况。所以一些编程语言利用 “tail call optimization” (TCO)的技术来解决这个问题。在Clojure里面避免这个问题的一个办法是使用loop 和recur。
;定义递归语句完成10+9+……1=55
user=> (loop [sum 0 cnt 10] (if (= cnt 0) sum (recur (+ cnt sum) (dec cnt))))
55

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

相关推荐

    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兼容的包装器

    通过提供一个Clojure的包装器,SparkleDriver使得Clojure开发者能够利用其简洁的语法和强大的函数式编程特性来编写Web自动化脚本。这不仅提高了代码的可读性和可维护性,也使得Clojure社区能够充分利用Selenium的...

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

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

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

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

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

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

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

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

    大数据的Java基础.pdf

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

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

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

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

    5. **Clojure语言**:Clojure是一种基于Lisp的函数式编程语言,运行在Java虚拟机上。它以其并发处理能力、简洁语法和强大的元编程特性而闻名,常用于构建Web应用和服务。 6. **库的使用与集成**:在Clojure应用中,...

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

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

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

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

    CS1804_U201814755_彭子晨_函数式编程 1

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

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

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

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

    总而言之,Java采购管理信息系统源码-ClojureFast项目是一个融合了Java和Clojure技术的创新尝试,为开源社区提供了一套强大的工具来构建和改进采购管理流程。通过深入研究和参与这个项目,开发者不仅能学习到采购...

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

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

Global site tag (gtag.js) - Google Analytics