2024年Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解更多关于这个网站如何工作的信息。

+1
编译器

原始函数和 recur 变量无法干净地通过 (try) 传递;它们被装箱为 Object。这会导致使用原始类型的函数或循环出现反射警告。

`
user=> (set! warn-on-reflection true)
true

user=> (fn [] (loop [t 0] (recur t)))

<user$eval676$fn677 user$eval676$fn677@3d80023a>

user=> (fn [] (loop [t 0] (recur (try t))))
NO_SOURCE_FILE:1 recur 参数对于原始局部变量: t 不匹配原始类型,有: Object,需要: long
自动装箱循环参数: t

<user$eval680$fn681 user$eval680$fn681@5419323a>

user=> (fn [^long x] (recur (try x)))
NO_SOURCE_FILE:1 recur 参数对于原始局部变量: x 不匹配原始类型,有: Object,需要: long

CompilerException java.lang.IllegalArgumentException: recur 参数对于原始局部变量: x 不匹配原始类型,有: Object,需要: long,编译:(NO_SOURCE_PATH:1:1)
`

7 个答案

0

评论由:davidj 提出

不评论最理想的行为,以下代码不会引起反射警告

`
user=> (set! warn-on-reflection true)
true
user=> (fn [] (loop [t 0] (recur (long (try t)))))

<user$eval673$fn674 user$eval673$fn674@4e56c411>

`

0

评论由:bronsa 提出

相关问题 http://dev.clojure.org/jira/browse/CLJ-701

0

评论者:hiredman

编译器中的try/catch只实现了Expr,而不是MaybePrimitiveExpr,尝试将TryExpr扩展到MaybePrimitiveExpr似乎非常简单,但实际上recur在语句上下文中分析其参数,这导致(try ...)基本上被包裹在一个像((fn (link: ) (try ...)))这样的函数中,此时它变成了invokeexpr,这使得添加maybeprimitiveexpr变得更加困难,并且它与CLJ-701的情况相同。

0

评论者:hiredman

http://dev.clojure.org/jira/browse/CLJ-701有一个补丁,我认为可以解决这个问题

0

评论者:alexmiller

我应该将此复制到CLJ-701吗?

0

评论者:hiredman

如果你想将try的修复包括在CLJ-701中,那么是的,这是一个重复的,如果你不确定或者更希望701保持更专注(我的补丁可能不可接受,或者太大且做了太多)那么就不是重复的。我在CLJ-701的补丁中解决了这两个问题,因为我是通过Nicola在这里的评论来到CLJ-701的,并且相同的编译器机制可以用于两者。

我认为状态取决于CLJ-701的状态。

0
...