首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是fn*,它与fn有什么不同?

什么是fn*,它与fn有什么不同?
EN

Stack Overflow用户
提问于 2014-05-10 21:50:27
回答 1查看 1.2K关注 0票数 11

我查看了lazy-seq的来源,发现了以下内容:

代码语言:javascript
复制
Clojure 1.4.0
user=> (source lazy-seq)
(defmacro lazy-seq
 "Takes a body of expressions that returns an ISeq or nil, and yields
  a Seqable object that will invoke the body only the first time seq
  is called, and will cache the result and return it on all subsequent
  seq calls. See also - realized?"
  {:added "1.0"}
  [& body]
  (list 'new 'clojure.lang.LazySeq (list* '^{:once true} fn* [] body)))
nil
user=>

我想知道fn*fn有什么不同,但我似乎在文档中找不到对fn*的任何引用。我错过了什么,fn*又有什么不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-11 00:33:10

免责声明:我离Clojure编译器专家还有很长的一段路要走,所以用适当数量的盐来看下面的内容。

fn*fn的一个固有版本。Clojure的大部分都是用Clojure实现的,但是一些低级别的函数是用Java实现的;fn*就是其中之一。

fn是用fn*实现的。消息来源如下:

https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L42

fn*在编译器中实现:

https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java#L47

实际上,fn*有两个不同的版本,它们在Java中被符号FNFNONCE所引用。第一个是“裸”fn*,第二个是带有元数据^{:once true}fn*,元数据^{:once true}lazy-seq使用的版本。

^{:once true}用于让编译器知道包含函数的闭包只会被调用一次,并且它可以执行封闭的本地清除。有关更多详细信息,请参阅this mailing list thread

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23586710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档