Clojure笔记——apply

学习clojure的apply函数。

函数形式

(apply f args)
(apply f x args)
(apply f x y args)
(apply f x y z args)
(apply f a b c d & args)

文档


Applies fn f to the argument list formed by prepending intervening arguments to args.

对clojure的参数命名不太熟悉,对上面的英文有点困惑,看了源码就清楚了。
先将arguments插入到args的前面(也就是将x y z a b c d这些参数插入到args这个列表的前面,比如参数部分的形式是这样,x y [1 2 3],那么先将参数整理成[x y 1 2 3]这种形式),再将函数f应用到这个整理后的参数列表上。

源码

(defn apply
  "Applies fn f to the argument list formed by prepending intervening arguments to args."
  {:added "1.0"
   :static true}
  ([^clojure.lang.IFn f args]
     (. f (applyTo (seq args))))
  ([^clojure.lang.IFn f x args]
     (. f (applyTo (list* x args))))
  ([^clojure.lang.IFn f x y args]
     (. f (applyTo (list* x y args))))
  ([^clojure.lang.IFn f x y z args]
     (. f (applyTo (list* x y z args))))
  ([^clojure.lang.IFn f a b c d & args]
     (. f (applyTo (cons a (cons b (cons c (cons d (spread args)))))))))

注:clojure中的每个函数都实现了IFn接口,而AFn是实现了IFn接口的抽象类,位于clojure.lang包下面。在AFn抽象类中,包含了apply方法。

apply先将变长参数部分(arguments)插入到列表式参数(args)的前端,然后再调用f的applyTo方法。
applyTo的方法代码如下,利用了Helper方法,Helper主要是完成从列表到独立参数的转换。
public Object applyTo(ISeq arglist) {
	return applyToHelper(this, Util.ret1(arglist,arglist = null));
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值