有没有办法在clojure线程宏中包含类型提示?
比如说,像这个例子, 我希望能做一些类似的事情有没有办法在clojure线程宏中包含类型提示?,clojure,Clojure,比如说,像这个例子, 我希望能做一些类似的事情 => (-> ^String "a b c " .... etc etc 为了避免反射惩罚,特别是在与java代码接口时 至少在你的情况下,没有反思惩罚 user=> (set! *warn-on-reflection* true) true user=> (-> "a b c " .toUpperCase (.replace "A" "X") (.split " ") first) "X" 如果您想更
=> (-> ^String "a b c " .... etc etc
为了避免反射惩罚,特别是在与java代码接口时 至少在你的情况下,没有反思惩罚
user=> (set! *warn-on-reflection* true)
true
user=> (-> "a b c " .toUpperCase (.replace "A" "X") (.split " ") first)
"X"
如果您想更加确定:
user=> (def i 23)
#'user/i
user=> (.toString i)
Reflection warning, NO_SOURCE_PATH:1:1 - reference to field toString can't be resolved.
"23"
是的,这是可能的
如果需要在->
中键入hint初始参数,可以直接在->
表单内部或外部执行:
(-> ^String (foo) .toUpperCase)
(let [^String f (foo)]
(-> f .toUpperCase))
在这两种情况下都不会有任何反映
如果希望键入提示的值出现在->
链的中间步骤中,则可以通过将类型提示放在->
步骤中键入提示:
;; note the type hints on identity and (identity)
(-> ^String (foo) .toUpperCase ^String identity .toLowerCase)
(-> ^String (foo) .toUpperCase ^String (identity). toLowerCase)
同样,在这两种情况下都不会有任何反映
(在1.7.0-alpha5版本中测试。)可以使用
->
宏键入提示表达式。而下面使用的是反射:
(set! *warn-on-reflection* true)
(def s "1")
(-> s .toString)
;; Reflection warning, NO_SOURCE_PATH:1:1 - reference to field toString can't be resolved.
;;= "1"
这并不是:
(-> ^String s .toString)
;;= "1"
也许,如果您共享一个特定的表达式,您发现很难或不可能键入提示,我们可以更好地帮助您
在已知的情况下,附加到宏的
&form
表达式的类型提示被丢弃,请参阅此JIRA票据。也许这就是你看到的 谢谢,但这只是一个例子——特别是在与w/java代码接口时,有很多(.myMethodOnCustomObject(.mymethodobject))类型的stuff@SteveB. 好的,我明白了。我建议您在项目中(设置!*反射时警告*true)
。clj
。一般来说,Clojure能够检测到一些东西,因此不需要反射。在莱宁根,:反射时警告为真
是的,谢谢。我知道如何找到反射警告,我正在尝试找出是否有可能避免反射这对我不起作用,无论是在1.5、1.6还是您列出的版本中。将把我看到的错误添加到最初的帖子中,以便于格式化/可读性。请参见上文,这是可行的,谢谢-您的示例假设一个函数(foo)而不是字符串,我应该意识到它不是一个函数,只是可以附加元数据的东西(foo)
是一个列表,foo
是一个符号等(宏扩展时间类型很重要)。带有外部let
的版本允许您键入提示文字;但是,这实际上是不必要的,因为Clojure足够聪明,可以注意到它正在处理一个文本值,并且只使用该值的类(它显然是立即可用的)。例如,(.toUpperCase“asdf”)
是无反射的,就像(let[x“asdf”](.toUpperCase x))
一样,而(def x“asdf”)(.toUpperCase x)
不是(>^java.awt.image.buffereImage.getRaster.getDataBuffer^java.awt.image.DataBufferInt(.getData))我收到此反射警告无法解析对java.awt.image.DataBuffer上的字段getData的引用。
似乎第一个提示已被遵守,而最后一个提示已被忽略?是否有任何计划解决此问题?JIRA票证已过期6年。@DavidOngaro您共享的案例中的类型提示似乎放错了位置,请执行以下编译:s没有警告(>^java.awt.image.BufferedImage.getRaster^java.awt.image.DataBufferInt(.getDataBuffer.getData)
@juan.faccoro有趣的是,似乎我对->
是如何展开的感到困惑。另一方面(..^java.awt.image.buffereImage getRaster^java.awt.image.DataBufferInt getDataBuffer getData)
不起作用。似乎->
宏能够在不起作用时保留类型提示。
从查看实现。
我认为->
的区别在于的宏扩展。
构建了一个全新的列表(例如(.x~form)
)并且它不考虑表示方法的符号中的:tag
元数据,而->
如果项是seq?
(检查源代码),则显式保留元数据。
(-> ^String s .toString)
;;= "1"