在
2024 Clojure现状调查!
中分享您的想法。
欢迎!请查阅
关于
页面了解此功能的一些信息。
GitHub登录
所有活动
问题
未解答
标签
提出一个问题
关于
提出一个问题
锁定表达式会导致变量被解引用,即使没有被执行,除非被let包裹
0
票
提问
Nov 17, 2013
在
Clojure
由
jira
以下是Michał Marczyk在下面的讨论线程中发现的一个性能较差的示例的描述。
以下是以下两个编译版本的差异:
(defn foo [x]
(if (> x 0)
(inc x)
(locking o
(dec x))))
和
(defn bar [x]
(if (> x 0)
(inc x)
(let [res (locking o
">
res)))
相当显著。foo被编译为一个单独的类,通过一个单独的调用方法来处理调用;bar被编译为bar的类和一个额外的类来处理locking o (dec x)部分 -- 可能与手动编写的锁定部分的输出非常相似(尽管我还没有真正看过那个)。内部函数是一个闭包,调用它涉及到分配一个闭包对象;它的构造函数接收封闭的局部变量作为参数并将它们存储在两个字段(lockee和x)中。然后它们被加载到闭包的调用方法体中等。
注意:摘要行可能过于狭隘地描述了根本原因,这仅仅是一个问题被注意到并检查的第一个案例。如果诊断了此问题,请更正摘要和此描述。
在此处查看Clojure组上的讨论线程:
https://groups.google.com/forum/#!topic/clojure/x86VygZYf4Y
请求
jira
请
登录
或
注册
以添加评论。
请
登录
或
注册
以回答此问题。
2
答案
0
票
回答
Apr 18, 2014
由
jira
_评论由:hiredman_发出_
也许它对其他人来说已经很清楚,但对我不太清楚。
原因
(defn bar [x]
(if (> x 0)
(inc x)
(let [res (locking o
">
res)))
生成第二个类的原因是锁定是一个宏,它在其展开中包含了一个try/finally形式。
将try/finally形式的返回结果绑定到一个结果(如在let中)将需要一些非常复杂的代码生成,而不需要添加额外的函数,因此当然,Clojure编译器会添加这个额外的函数。
请
登录
或
注册
以添加评论。
0
票
已解答
Jun 26, 2019
由
jira
参考:
https://clojure.atlassian.net/browse/CLJ-1296
(由jafingerhut报告)
请
登录
或
注册
以添加评论。
欢迎使用Clojure问答,在这里您可以向Clojure社区成员提问并接受回答。
相关问题
cljs.core.specs.alpha:检查let绑定向量是否为偶数
为字符串trim函数添加一个可选的谓词,以确定是否应删除字符
允许使用无限参数列表调用var
clojure.lang.ExceptionInfo不应在它的两个参数构造函数中传递null原因
为什么当*default-data-reader-fn*设置为tagged-literal时,未知标记字面量不能嵌入表达式呢?
分类
所有分类
Clojure
(1.5k)
语法和读取器
(73)
编译器
(135)
宏
(25)
记录和类型
(19)
集合
(76)
序列
(24)
转换器
(27)
多态方法
(9)
协议
(24)
元数据
(6)
命名空间和变量
(18)
引用、代理、原子
(10)
Java互操作
(79)
输入/输出
(20)
错误
(75)
REPL
(48)
打印
(38)
正则表达式
(2)
规范
(169)
测试
(25)
文档
(100)
ClojureScript
(610)
ClojureCLR
(25)
贡献库
(719)
工具
(72)
元
(19)
其他
(91)
...