- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在阅读 O'Reilly 的 Clojure Programming 一书..
我遇到了一个头部保留的例子。第一个示例保留对 d
的引用(我想),因此它不会被垃圾收集:
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count d) (count t)])
;= #<OutOfMemoryError java.lang.OutOfMemoryError: Java heap space>
虽然第二个例子没有保留它,所以它没有问题:
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count t) (count d)])
;= [12 99999988]
我在这里没有得到的是在哪种情况下究竟保留了什么以及为什么。如果我尝试只返回 [(count d)]
,像这样:
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count d)])
它似乎会造成同样的内存问题。
此外,我记得读过 count
在每种情况下都实现/评估一个序列。所以,我需要澄清一下。
如果我首先尝试返回 (count t)
,与我根本不返回它相比,它的速度/内存效率如何?什么以及为什么在这种情况下被保留?
最佳答案
在第一个和最后一个示例中,传递给 split-with
的原始序列在内存中完整实现的同时被保留;因此 OOME。这种情况发生的方式是间接的;直接保留的是 t
,而原始序列由 t
保留,这是一个惰性序列,处于未实现状态。 p>
t
使原始序列保持不变的方式如下。在实现之前,t
是一个 LazySeq
对象,存储一个 thunk,它可能在某些时候被调用以实现 t
;这个 thunk 需要在实现将其传递给 take-while
之前将指向原始序列参数的指针存储到 split-with
-- 查看 的实现>拆分
。一旦 t
被实现,thunk 就可以在 t
不再持有巨大输入序列的头部。
输入序列本身完全由(count d)
实现,它需要实现d
,因此原始输入序列。
继续讨论为什么要保留 t
:
在第一种情况下,这是因为 (count d)
在 (count t)
之前被求值。由于 Clojure 从左到右计算这些表达式,本地 t
需要在第二次调用 count 时停留,并且由于它恰好持有一个巨大的 seq(如上所述),这导致OOME。
最后一个只返回 (count d)
的例子最好不要保留 t
;不是这种情况的原因有些微妙,最好通过引用第二个示例来解释。
第二个例子恰好工作正常,因为在 (count t)
被求值后,不再需要 t
了。 Clojure 编译器注意到这一点,并使用一个巧妙的技巧在进行 count
调用的同时将本地重置为 nil
。关键的 Java 代码片段做了类似 f(t, t=null)
的事情,以便将 t
的当前值传递给适当的函数,但局部是在控制权移交给 f
之前清除,因为这是表达式 t=null
的副作用,它是 f
的参数;很明显,Java 的从左到右语义是这项工作的关键。
回到最后一个例子,这是行不通的,因为 t
实际上并没有在任何地方使用,而且未使用的局部变量不会被局部变量清除过程处理。 (清除发生在最后一次使用时;如果程序中没有这样的点,则没有清除。)
至于 count
实现惰性序列:它必须这样做,因为没有通用的方法可以在不意识到的情况下预测惰性序列的长度。
关于Clojure 头部保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15994316/
head 元素包含了所有的头部标签元素。在 head 元素中你可以插入脚本(scripts), 样式文件(CSS),及各种meta信息。 可以添加在头部区域的元素标签为: title , styl
这个问题只是为了澄清一些事情。以前有人问过类似的问题,现在把它们归为一个问题——JavaScript 应该放在 HTML 文档中的什么位置,或者更重要的是,它重要吗?所以,我要问的一件事是,确实
HTML 中的 <head> 标签是所有头部标签的容器,这些头部标签用来定义有关 HTML 文档的元数据(描述数据的数据)以及所需资源的引用(例如 CSS 样式文件、JavaScript
我想通过 yui3 注入(inject) iframe head。示例代码在 FF 中有效,但 IE9 显示错误“YUI is not define”。我不知道在 IE9 中会发生什么。
我想复制 Kickstarter 应用程序中的效果,当用户向上滚动且表格 View 已位于开头时,标题 View 的大小会增加。 要查看效果,只需打开一个随机项目并向上滚动即可。 你知道如何实现这样的
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
在 iframe 加载时,我将 google 分析片段插入 iframe 文档 HEAD 中。 然后代码片段将插入此脚本 在父文档 HEAD 中,我希望将其插入到 iframe 文档 HEAD 中.
在此demo , 如果我使用 (no wrap) 或 (onLoad),我会得到不同的输出。 我的问题是,在 html 文件中,要获得正确的警报:1,2,3,4 需要对代码进行哪些更改?通过简单的 d
我想知道是否可以在 javascript 弹出窗口中向用户显示完整的 html 页面。完整的 html 是指具有自己的编码、头部和主体的 html 代码。它有自己的字体、样式、脚本等... 另外,假设
我的第一个网页作业遇到了麻烦,我才第一年,之前没有任何经验。我的问题是,当我尝试将背景 img 应用于 body 时,它会在头部应用一个简单的样式集,但是当我在我的 css 中应用相同的代码时它会失败
我正在使用express-handlebars在我的项目中存在以下问题: 问题我希望能够添加从 View 内部调用的部分将此类标签添加到我的整体 View 头部。 示例: 景色 {{#layout/m
我想将脚本添加到站点的头部,以便目标 html 的头部看起来像这样 *some code...* . 有了这个脚本就完美了: var head = document.getElementsByTagN
我想使用链接标签将一些 CSS 注入(inject)头部。我可以使用 很容易地让它工作 var linkNode = document.createElement('link'); linkNode.
你如何能够使用 javascript 将页面中间的 css 链接注入(inject)到头部 ... styles here code 我需要某种 javascript 来将 goog
我想创建一个 HTML 网络组件,我需要导入 CSS 文件,但我想将它注入(inject)到我的影子 dom 中。我有一些代码如下: import introHTML from './Intro.ht
我是一名优秀的程序员,十分优秀!