clojure的参数分解,Binding Forms (Destructuring)

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) = @a (不知对不对,就这个意思)。但是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等,用相对自然的方式解决对应问题)

时间: 2024-11-09 13:45:48

clojure的参数分解,Binding Forms (Destructuring)的相关文章

A monad tutorial for Clojure programmers (part 2)

In the first part of this tutorial, I have introduced the two most basic monads: the identity monad and the maybe monad. In this part, I will continue with the sequence monad, which will be the occasion to explain the role of the mysterious m-result 

细说ASP.NET Forms身份认证

用户登录是个很常见的业务需求,在ASP.NET中,这个过程被称为身份认证. 由于很常见,因此,我认为把这块内容整理出来,与大家分享应该是件有意义的事. 在开发ASP.NET项目中,我们最常用的是Forms认证,也叫[表单认证]. 这种认证方式既可以用于局域网环境,也可用于互联网环境,因此,它有着非常广泛的使用. 这篇博客主要讨论的话题是:ASP.NET Forms 身份认证. 有一点我要申明一下:在这篇博客中,不会涉及ASP.NET的登录系列控件以及membership的相关话题, 我只想用比较

Delphi 实现Ini文件参数与TEdit和TCheckBox绑定(TSimpleParam)

本例程在 Delphi XE8 版本下运行 Delphi群:59129236 把Delphi做为工作的辅助技能,走向幸福人生! 晓不得2013 QQ:26562729 SimpleParamDemo 功能: 把ini文件的参数与控件绑定起来,以达到方便使用的目的. 本例程共有2个单元 uSimpleParam->TSimpleParam;//本功能 uSimpleList->TSimpleList;用泛型实现的TList,更实用一点 源码下载:http://files.cnblogs.com/

细说ASP.NET Forms身份认证 别人写的不过很透彻就转来了以后用时再看

阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份认证标识 在多台服务器之间使用Forms身份认证 在客户端程序中访问受限页面 用户登录是个很常见的业务需求,在ASP.NET中,这个过程被称为身份认证. 由于很常见,因此,我认为把这块内容整理出来,与大家分享应该是件有意义的事. 在开发ASP.NET项目中,我们最常用的是Forms认证,也叫[表单认

yii database操作绑定参数防止sql注入

绑定参数(Binding Parameters) 当使用带参数的 SQL 来创建数据库命令时, 你几乎总是应该使用绑定参数的方法来防止 SQL 注入攻击,例如: $post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status') ->bindValue(':id', $_GET['id']) ->bindValue(':status', 1) ->queryOne

Sth about 函数式编程(Functional Programming)

今天开会提到了函数式编程,针对不同类型的百年城方式,查阅了一部分资料,展示如下: 编程语言一直到近代,从汇编到C到Java,都是站在计算机的角度,考虑CPU的运行模式和运行效率,以求通过设计一个高效的编程语言,作为人与计算机之间沟通的桥梁.因为计算机本质上是串行执行一个个指令流,因此编程语言也被设计为命令式编程(Imperative Programming),先算什么再算什么,怎么输入怎么计算怎么输出,全部由编程人员决定. 后来,大家发现冯·诺伊曼结构将数据和指令平等化的思想能够帮助我们更好地对

Function program language

历史 Lambda演算为描述函数及其评估提供了理论框架.它是一种数学抽象而不是编程语言 - 但它构成了几乎所有当前函数式编程语言的基础.等效的理论公式,组合逻辑,通常被认为比lambda演算更抽象,并且在发明之前.组合逻辑和lambda演算最初都是为了更清晰地接近数学基础而开发的. 一种早期功能性语言是Lisp,它是由John McCarthy在麻省理工学院(MIT)于20世纪50年代后期开发的IBM 700/7000系列科学计算机. Lisp首先介绍了函数式编程的许多范式特性,尽管早期的Lis

一个小例子道破函数式编程

若想实现一个将多位数组的数值累加的总和的需求: 方式一: let arr = [1, [2, 2], [3, 3]]; let arr1 = arr.flat(Infinity).reduce((total, value, index, arr) => { return total + value; }, 0); console.log('arr1:', arr1); 通过函数式编程方式 方式二: //es5 function add(x) { return function addFun(y)

jQuery基础(动画篇 animate,显示隐藏,淡入淡出,下拉切换)

1.jQuery中隐藏元素的hide方法 让页面上的元素不可见,一般可以通过设置css的display为none属性.但是通过css直接修改是静态的布局,如果在代码执行的时候,一般是通过js控制元素的style属性,这里jQuery提供了一个快捷的方法.hide()来达到这个效果   $elem.hide() 提供参数: .hide( options ) 当提供hide方法一个参数时,.hide()就会成为一个动画方法..hide()方法将会匹配元素的宽度,高度,以及不透明度,同时进行动画操作