博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
clojure的参数分解,Binding Forms (Destructuring)
阅读量:5885 次
发布时间:2019-06-19

本文共 1318 字,大约阅读时间需要 4 分钟。

hot3.png

clojure的let参数分解,文档描述的很清楚。比如它举的例子

(let [[a b c & d :as e] [1 2 3 4 5 6 7]]  [a b c d e]) ->[1 2 3 (4 5 6 7) [1 2 3 4 5 6 7]]

这个let,使用其它语言的可以把它当作赋值。比如:java的 int i = 0,也有支持多变量赋值的,比如perl的 my ($a $b) = (不知对不对,就这个意思)。但是clojure变化更大。上面的例子中,最后赋值的结果就是->后面显示的。

(let [[a b & c :as str] "asdjhhfdas"]  [a b c str]) ->[\a \s (\d \j \h \h \f \d \a \s) "asdjhhfdas"]

string也一样,在clolure里面不都是seq嘛。

(let [{a :a, b :b, c :c, :as m :or {a 2 b 3}}  {:a 5 :c 6}]  [a b c m]) ->[5 3 6 {:c 6, :a 5}]

上面是解构map,:or的意思是,如果没有找到,就用默认,:b显然不在{:a 5 :c 6}中,所以最后的值是3。

函数参数的解构:

一般来说函数在定义的时候会指定参数,比如下面的参数,根据显示你呼叫该函数时参数的个数,我这里写到最多接收2个参数,根据Clojure文档描述,最多可以有20个参数(仅仅只这种显式申明的方式)。

(defn- fixargs ([] 0) ([_] 1) [_ _] 2))

如果你执行(fixargs :a :b :c),就会报错。当然我可以这样定义函数:这样不管你传入几个参数,这个函数都会将个数显示出来。但是至少需要2个参数,小于两个参数就会报错。如果把a b 删除,就可以接受任意(包括没有)个数了。

(defn- anyargs    [a b & c]    (+ 2 (count c)))

如果你偶尔看到下面这种类型的函数参数定义,可能会觉得困惑,不过clojure可以repl,所以测试一下就知道结果了。

(defn- hashp-p [a & {:b b}]    [a b])

(hash-p 1 :b 2)  --------------> [1 2]

也就是说,你传入3个参数,a娶了第一个1,剩下2个是 :b 2,可见clojure将剩下的2个组成了一个map,对应解构出来就是2了。

如果你认为 [& c]会自动将vector变成map,那就又错了,让我们试一下。

(defn f-n [& c]    (:b c));然后呼叫(f-n :b 2) ---------->nil

clojure的代码咋一看毫无章法,习惯之后,它其实遵循非常简单统一的原则,都是form,求值,就这么两回事。(当然,就像Clojure文档中提到的,它持一种务实的态度,因此引入var,ref,atom,agent等,用相对自然的方式解决对应问题)

转载于:https://my.oschina.net/jianglibo/blog/337209

你可能感兴趣的文章
发布支持多线程的PowerShell模块 —— MultiThreadTaskRunner
查看>>
Ubuntu ctrl+alt会导致窗口还原的问题
查看>>
第四十期百度技术沙龙笔记整理
查看>>
推荐系统那点事 —— 基于Spark MLlib的特征选择
查看>>
linux 下RTL8723/RTL8188调试记录(命令行)【转】
查看>>
[Contiki系列论文之1]Contiki——为微传感器网络而生的轻量级的、灵活的操作系统...
查看>>
Android 网络编程 记录
查看>>
微软同步发行Windows 10和Windows 10 Mobile系统更新
查看>>
Zeppelin的入门使用系列之使用Zeppelin运行shell命令(二)
查看>>
form表单下的button按钮会自动提交表单的问题
查看>>
那些年追过的......写过的技术博客
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
CSS魔法堂:Transition就这么好玩
查看>>
解决win7远程桌面连接时发生身份验证错误的方法
查看>>
C/C++ 多线程机制
查看>>
python mysql Connect Pool mysql连接池 (201
查看>>
Boost在vs2010下的配置
查看>>
一起谈.NET技术,ASP.NET伪静态的实现及伪静态的意义
查看>>
20款绝佳的HTML5应用程序示例
查看>>
string::c_str()、string::c_data()及string与char *的正确转换
查看>>