clojure 词法变量lexical和动态变量dynamic

clojure中变量可以分为词法变量(lexical)和动态变量(dynamic),有点类似于其它语言中的局部变量和全局变量。

引入变量:

1。函数定义:形参列表定义了在函数被调用的时候保存实参的变量。

eg:(defn foo [a b c] (+ a b c))

每次函数调用的时候clojure会创建新的绑定保存有调用者传递来的实参,该绑定的生命周期一直到运行期结束。(递归函数的形参会在每一次函数调用的时候重新绑定)

2。let 绑定

eg:(let [variable*] body-form*)

variable可以赋初值也可以不赋,下面是一个let将x,y,z分别绑定到1,2,nil上:

(let [[x 1] [y 2] z]

...)

let函数是一个调用匿名函数的宏,上面的例子可以展开为((fn [x y z] (...)) 1 2 nil)

let在调用结束后,如果该变量在let之前有引用,则会重新指向所引用的对象。
函数定义和let这两种形式我们称之为绑定形式,多个嵌套对同名变量的绑定,内层的变量绑定会覆盖外层的。

动态变量

Clojure里面有4种动态变量类型:Vars,Refs,Atoms 和Agents.

下面这个表格是它们之间的比较:


注:

1:Software Transactional Memory (STM):

STM事务里面做的修改只能在事务提交之后才能被别的线程看到。这实现了ACID里面的A(原子性)和I(隔离性)

事务开始之后,如果有别的线程对这个Ref做了改动,事务将会回滚到开始的状态,这就实现了C(一致性)

2:send 在分配一个action给Agent之后会立刻返回,action运行结束后,将返回值赋值给Agent。
使用的线程池是(java.util.concurrent.Executors.newFixedThreadPool)线程个数是cpu个数+2
send-off与set类似,使用的线程池是(java.util.concurrent.Executors.newCachedThreadPool)
线程的个数按照实际需要分配。
当send,send-off 函数在事务里调用的时候。该action会一直等到线程提交的时候才被发送给另外一个线程去执行。






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值