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

欢迎!请查看关于页面以获取更多关于如何使用本站的信息。

0
编译器

我原本预期以下两个Java互操作调用都会避免反射,但只有涉及f1的第一个调用是这样的。

`
Clojure 1.6.0
user=> (set! warn-on-reflection true)
true
user=> (defn f1 ^java.util.LinkedList [coll] (java.util.LinkedList. coll))

'user/f1

user=> (def f2 (fn ^java.util.LinkedList [coll] (java.util.LinkedList. coll)))

'user/f2

user=> (.size (f1 [2 3 4]))
3
user=> (.size (f2 [2 3 4]))
反射警告,NO_SOURCE_PATH:5:1 - 无法解析到size字段。
3
`

不清楚这与CLJ-1232是否有关系,但这个问题是测试该问题的变体时发现的。

8 个答案

0

评论:jafingerhut

这是一个很好的工单编号,1543。哥白尼最著名的书籍出版的年份:http://en.wikipedia.org/wiki/Nicolaus_Copernicus

0

评论:wagjo

参数向量的类型提示不是只针对原始类型提示吗?据我所知,非原始类型提示应该在函数名称上,其他都不是惯用法。

0

评论:bronsa

这不是关于参数向量提示与函数名提示的问题。
这里的问题是,无法在匿名函数上放置返回类型提示,而只能在定义中使用,因为":arglists"将由定义添加到Var的元数据。

这就是我将此信息作为函数字段而不是作为Var元数据的原因之一

0

评论:jafingerhut

Jozef,你可能是对的,参数向量上的非基本类型提示不是典型的。你有没有什么我可以阅读的来源?

0

评论者:tsdh

只有具有参数向量提示的版本在https://clojure.org/java_interop#Java Interop-Type Hints中进行了文档记录。然而,在你只有一个arity(或所有arity返回相同类型值)的情况下,var名称上的提示也有效。但是,这两个版本似乎有不同的语义。查看CLJ-1232。

0
_评论者:wagjo_

类型提示是Clojure的一个复杂部分,但你几乎总是可以在符号上应用"*place提示"惯用语。类型提示在参数向量上的应用只有在两种情况下才有效
- 基本提示
- 不同arity返回不同返回类

在第一种情况下,编译器在编译fn*(参见[1])时需要类型提示,而不是以后,因此你必须在参数向量上指定它们。

第二种情况,也就是这里讨论的问题,只有在用defn定义时才使用。编译器首先在var的元数据中查找标记,如果没有找到,它有一个特殊情况,在其中查找:arglist元数据中的返回类。这显然是一个非常特殊的情况[2],用于处理具有不同arity的不同返回类的情况。显然,使用def而不是defn不会为你创建:arglist元数据,因此你会看到反射警告。示例


user=> (def f2 (fn ^java.util.LinkedList [coll] (java.util.LinkedList. coll)))
#'user/f2
user=> (.size (f2 [2 3 4]))
反射警告,/tmp/form-init.clj:1:1 - 无法解析字段size。
3
user=> (alter-meta! #'f2 assoc :arglists '(^java.util.LinkedList [coll]))
{:ns #<Namespace user>, :name f2, :file "/tmp/form-init.clj", :column 1, :line 1, :arglists ([coll])}
user=> (.size (f2 [2 3 4]))
3


顺便说一下,CLJ-1491对此话题的讨论略有关联。

[1] https://github.com/clojure/clojure/blob/03cd9d159a2c49a21d464102bb6d6061488b4ea2/src/jvm/clojure/lang/Compiler.java#L5134
[2] https://github.com/clojure/clojure/blob/03cd9d159a2c49a21d464102bb6d6061488b4ea2/src/jvm/clojure/lang/Compiler.java#L3572

0
by

评论:wagjo

Andy,我发现了一些反对我的建议的资料 :) 请参阅 CLJ-811 以及(链接:1)。

(链接:1) https://groups.google.com/d/msg/clojure/b005zQCPxOQ/6G0AlWKKKa0J

0
by
参考:https://clojure.atlassian.net/browse/CLJ-1543(由jafingerhut报告)
...