Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在clojure线程宏中包含类型提示?_Clojure - Fatal编程技术网

有没有办法在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"