Programming Clojure学习笔记——探索Clojure

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
2.5  流控制
if
Clojure的if计算第一个参数值,如果第一个参数值为true,则返回第二个参数值;如果为false,则返回nil或第三个参数值(如果有第三个参数)
user=> (defn is-small? [number]
              (if (< number 100) "yes"))
#'user/is-small?
user=> (is-small? 50)
"yes"
user=> (is-small? 500)
nil
user=>  (defn is-small? [number]
                (if (< number 100) "yes" "no"))
#'user/is-small?
user=> (is-small? 500)
"no"
说明:if每个分支只能有一个form

do
do后面能跟多个form,返回最后一个。如:
user=> (defn is-small? [number]
               (if (< number 100)
                  "yes"
                  (do
                      (println "Saw a big number" number)
                      "no")))
#'user/is-small?
user=> (is-small? 200)
Saw a big number 200
"no"

loop/recur
loop语法:
(loop [bindings *] exprs*)
loop形式像let一样,建立绑定(bindings),然后计算表达式(exprs)值,但是它可以使用recur形式设置循环点:
(recur exprs*)
recur给loop的绑定赋予新值,然后返回loop开头。如:
user=> (loop [result [] x 5]
              (if (zero? x)
                  result
                  (recur (conj result x) (dec x))))
[5 4 3 2 1]

recur也可以返回到函数开头,实现函数体循环:
user=> (defn countdown [result x]
               (if (zero? x)
                 result
                 (recur (conj result x) (dec x))))
#'user/countdown
user=> (countdown [] 5)
[5 4 3 2 1]

for循环在哪里?
Clojure没有for循环和直接的可变变量。Clojure的for不是循环而是序列映射。
user=> (defn indexed [coll] (map vector (iterate inc 0) coll))
#'user/indexed
user=> (defn index-filter [pred coll]
              (when pred
                 (for [[idx elt] (indexed coll) :when (pred elt)] idx)))
#'user/index-filter
user=> (index-filter #{\a \b} "abcdbbb")
(0 1 4 5 6)

Clojure Programming Clojure Programming by Chas Emerick, Brian Carper, and Christophe Grand Copyright © 2012 Chas Emerick, Brian Carper, and Christophe Grand. All rights reserved. Printed in the United States of America. Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. 立即下载

相关推荐

深入解析WIFI与蓝牙模块电路设计:从原理到实战

本文深入解析了WIFI与蓝牙模块的电路设计,从核心原理到实战应用。文章以AP6256模块为例,详细拆解了电源树、时钟电路、接口设计及天线射频路径等关键环节,并提供了PCB布局布线的实用准则与调试方法,旨在帮助硬件工程师设计出稳定可靠的无线产品,规避常见陷阱。

weixin_29186249的博客 119

Clojure Programming读书笔记(0)

Down the Rabbit Hole   1. REPL is short for Read, Eval, Print and Loop 2. Clojure代码都是基于表达式(expressions)的,这些表达式基于以下规则: list,例如(+ 1 2),代表着调用,表达式的值就是调用的返回结果。list中第一个值相当于操作符,剩下的都是参数符号,比如

星星灿灿的笔记 760

论文理解【LLM-OR】——【OptMATH】A Scalable Bidirectional Data Synthesis Framework for Optimization Modeling

本文提出 LLM-OR 领域的双向数据合成框架 OptMATH,从已有 MF/PD 出发反向生成 NL,再使用 AutoFormulator 进行正向建模,通过最优值匹配 rejection sampling 确保语义一致性。实现了难度可控的语义一致数据合成

佚失的诗篇 460

探索Clojure编程的艺术:一个开源学习资源的深度解析

探索Clojure编程的艺术:一个开源学习资源的深度解析 项目简介 是一个开源的在线书籍项目,旨在帮助开发者和新手深入理解Clojure这门富有创新的函数式编程语言。本书籍不仅详尽地介绍了Clojure的基础语法和核心概念,还涵盖了高级特性,如多态性、并发处理及与Java平台的互操作性。 技术分析 Clojure 是一门静态类型系统下的动态语言,它运行在JVM(Java虚拟机)上,因此可以充分利用...

gitblog_00093的博客 567

ThingsBoard 多租户备份怎么做?定时任务、完整性校验与恢复演练全拆解

多租户的 IoT 平台里,备份是最容易被拖延、出事时最要命的一环。手动 pg_dump 几十个租户,既慢又容易漏;漏了也不知道,等真丢数据才发现备份根本不可用。读完这篇,你会给 [ThingsBoard](https://link.gitcode.com/i/8ca61f3ffe721ed74691cdd24409a271) 搭好一套"凌晨自动跑 + 失败自动告警 + 定期恢复演练"的备份方案,核

gitblog_00483的博客 569

如何写出极致优雅的Clojureprogramming-clojure的惰性求值与trampoline优化技巧

**programming-clojure** 是经典书籍《Programming Clojure》(第二版,Stuart Halloway 与 Aaron Bedra 著)的官方示例代码仓库,汇集了数十个可运行的 Clojure 示例。其中**惰性求值**(lazy sequences)与 **trampoline 优化**最能体现 Clojure 的优雅写法:让数据“用到才算”,让递归永不撑爆

gitblog_00675的博客 699

Clojure调Java互操作速查手册:programming-clojure的interop与import_static实例精讲

Clojure时,很多人卡在同一个地方:**Clojure怎么调用Java?** 本文基于《Programming Clojure》官方示例仓库 **programming-clojure**,用最少的代码把互操作(Java Interop)常用技巧一次讲清,带你读懂 [interop.clj](https://link.gitcode.com/i/2fb89cd3581275ac496d9ac

gitblog_00309的博客 1084

Programming Clojure学习笔记——与Java一起工作

3.3  使用Clojure创建和编译Java类 Clojure的所有对象都实现了Java的特定接口: 1. Clojure数据结构实现了Java集合接口 2. Clojure函数实现了Runnable和Callable接口 Clojure可以在需要时很方便地在磁盘上生成一次性的代理或类,使用必要的一些Java代码片段。 创建Java代理 在Clojure中,可以使用代理来扩展

蓝猫的专栏 2815

Programming Clojure学习笔记——并发

6.5 使用Vars管理线程本地状态 当你调用def或defn创建一个动态变量时,只是创建了一个变量。 当你传一个初始值给def时,该初始值就成了def创建变量的根绑定(root binding),如: (def foo 10) 变量foo的根绑定被所有线程共享,验证如下: 当前线程中 user=> foo 10 新起的线程中 user=> (.start (Thread. (f

蓝猫的专栏 938

为什么选择Clojure做并发?programming-clojure并发编程示例深度剖析

做并发编程为什么越来越多团队选择 Clojure?答案在于它用**不可变数据 + 四大并发原语**(Atom、Ref、Agent、Trampoline)取代了传统的锁和共享可变状态。本文以《Programming ClojureClojure编程)》第二版的官方示例仓库 programming-clojure 为主线,带你深度剖析这些并发编程示例,看看没有一行"锁"的代码是如何做到线程安全的。

gitblog_00068的博客 71

Programming Clojure学习笔记——多重方法

8.2 定义多重方法 定义多重方法使用defmulti: (defmulti name dispatch-fn) name为多重方法的名字,Clojure将针对方法的参数调用dispatch-fn来选择多重方法的一个特定的方法(实现)。 考虑前一节的my-print函数,它只有一个参数,即需要打印的东西,可以基于参数的类型选择特定的实现。因此dispatch-fn必须是一个能返回参数类

蓝猫的专栏 1438

Programming Clojure笔记之二——探索Clojure

Clojure具有同像性(homoiconic),即代码与其数据的结构一致。 Clojure代码主要由以下形式(Forms)构成。这些形式可以理解为其他程序设计语言中的数据类型。 Form Example(s) Boolean true, false Character \a Keyword :tag, :doc List (1 2 3), (println “h

coderock 1068

Clojure测试最佳实践:用programming-clojure学会Cucumber风格测试与expectorate快照

programming-clojure 是《Programming Clojure》一书的官方示例代码库,内含一套可运行的 Clojure 测试示例。本文带你用这个真实项目学会 Clojure 测试最佳实践:clojure.test 的 Cucumber 风格(行为驱动)测试写法、`are` 数据表测试,以及 expectorate 快照式校验,帮你写出既简洁又可读的高质量测试。 ## 📦 项

gitblog_01195的博客 1406

5步掌握Clerk:Clojure开发者的终极实时编程指南

Clerk是一款专为Clojure设计的Moldable Live Programming工具,它能将标准的Clojure命名空间转化为交互式笔记本,为开发者提供本地优先的实时编程体验。无论你是数据分析师、科研工作者还是Clojure开发者,Clerk都能帮助你快速构建数据分析和可视化工作流。 ## 为什么选择Clerk?传统笔记本的革新方案 传统计算笔记本如Jupyter存在诸多问题:代码难

gitblog_00460的博客 492
上一篇: Programming Clojure学习笔记——探索Clojure
下一篇: Programming Clojure学习笔记——探索Clojure
zh2qiang
博客等级 码龄20年 23粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值