defrecord 在clojure中允许使用自定义字段定义简单数据容器.
例如
user=> (defrecord Book [author title ISBN])
user.Book
Run Code Online (Sandbox Code Playgroud)
结果的最小构造函数只接受位置参数而没有其他功能,例如字段默认,字段验证等.
user=> (Book. "J.R.R Tolkien" "The Lord of the Rings" 9780618517657)
#:user.Book{:author "J.R.R Tolkien", :title "The Lord of the Rings", :ISBN 9780618517657}
Run Code Online (Sandbox Code Playgroud)
编写包含默认构造函数的函数总是可以获得更复杂的构造语义 - 使用关键字参数,提供默认值等等.
这似乎是宏提供扩展语义的理想方案.人们为了更丰富的defrecord建设而编写和/或推荐了哪些宏?
几乎有2个相同的程序可以生成无限懒惰的random序列.第一个不会崩溃.第二次崩溃与OutOfMemoryError异常.为什么?
;Return infinite lazy sequence of random numbers
(defn inf-rand[] (lazy-seq (cons (rand) (inf-rand))))
;Never returns. Burns the CPU but won't crash and lives forever.
(last (inf-rand))
Run Code Online (Sandbox Code Playgroud)
但是下面的崩溃很快:
;Return infinite lazy sequence of random numbers
(defn inf-rand[] (lazy-seq (cons (rand) (inf-rand))))
(def r1 (inf-rand))
;Crash with "OutOfMemoryError"
(last r1)
Run Code Online (Sandbox Code Playgroud) Clojure有大量的函数/宏来处理命名空间和java包导入.对于我的(有限的)理解,命名空间的设置可以在clojure过程中被视为状态(repl).
当在REPL会话中迭代地工作时,特别是当(重新)加载源文件时,我发现很容易混淆 - 通常当我在命名空间配置中出错或语法错误时.其他时候我想尝试重构命名空间/别名/引用过滤器,但不能在不重新启动REPL的情况下轻松退出现有的命名空间状态.
例如,我希望能够检查点命名空间配置 - 例如在repl上加载代码主体之后 - 然后在尝试在REPL导入的某些库之后返回到"clean-slate",这样我就可以立即测试一个源文件,该文件作为ns宏的一部分导入该库中已过滤的方法子集.
人们可以推荐保存和恢复命名空间配置的方法吗?
许多科学论文,特别是生命科学论文,都以pdf格式出版.
我想在emacs中尽可能多地工作(尤其是org-mode).我知道DocView模式,至少让我在emacs中查看pdf.我怀疑它可以为我做更多,但我还没有超越简单地查看基于图像的pdf文件的渲染.
任何人都可以推荐使用pdf的方法,最重要的是链接到文件,发布文本和向pdfs添加注释(电子相当于边缘写作)?
编辑:只是为了澄清我不打算实际编辑pdf图像.相反,我想在组织文件中添加超链接或书签注释.我之前没有看过DocView的文本模式,这可能会给我我想要的但我不知道我是否可以书签/超链接到它.
我有一个简单的groovy脚本,从它的主要执行线程需要向用户显示一些对话框.
我的挥杆知识是有限的和生锈的,但我记得读到需要小心保持事件派发线程(EDT)上的GUI东西.
如果我只是JOptionPane.showMessageDialog从我的主线程中调用静态方法我是否正确地假设这会违反在EDT上保留GUI内容的正确做法?
我应该实际使用swing.utils.invokeAndWait方法,例如在下面的示例代码中?
void showHelloThereDialog()
throws Exception {
Runnable showModalDialog = new
Runnable() {
public void run() {
JOptionPane.showMessageDialog(
myMainFrame, "Hello There");
}
};
SwingUtilities.invokeAndWait
(showModalDialog);
}
Run Code Online (Sandbox Code Playgroud)
现在,上面没有做任何事情来在invokeAndWait完成后从消息对话框以外的其他内容中创建值.
据推测,groovy'闭包'实现Runnable将使代码比上面更简单.
需要invokeAndWait吗?如果是这样,有人请举一个正确实现的例子,以获得像使用groovy的confirmDialog之类的结果?
我在clojure中使用java类,它为包含一系列记录的特定于域的二进制文件提供检索API.
java类用文件初始化,然后提供一个.query方法,该方法返回一个只有一个方法的内部类的实例.next,因此不能很好地使用通常的java集合API.外部类和内部类都不实现任何接口.
该.query方法可以返回null而不是内部类.该.next方法返回一个记录字符串,如果没有找到其他记录,则返回null,它可能在第一次调用时立即返回null.
如何在不编写更多java类的情况下使这个java API在clojure中运行良好?
我能想到的最好的是:
(defn get-records
[file query-params]
(let [tr (JavaCustomFileReader. file)]
(if-let [inner-iter (.query tr query-params)] ; .query may return null
(loop [it inner-iter
results []]
(if-let [record (.next it)]
(recur it (conj results record))
results))
[])))
Run Code Online (Sandbox Code Playgroud)
这给了我一个结果向量来处理clojure seq抽象.是否有其他方法可以使用lazy-seq或使用协议从Java API中公开seq?
我有一个可以在不同数量的进程上并行化的分析.预计事情将是IO和CPU密集型(如果有人好奇的话,非常高吞吐量的短读取DNA对齐.)
运行它的系统是48核linux服务器.
问题是如何确定最佳的过程数量,以便最大化总吞吐量.在某些时候,这些过程可能会成为IO限制,因此添加更多过程将没有任何好处,也可能是有害的.
当达到这一点时,我能从标准系统监控工具中判断出来吗?top(或者可能是不同的工具)的输出是否能够区分IO绑定和CPU绑定进程?我怀疑IO上阻止的进程可能仍然显示100%的CPU利用率.
目前我是使用SVN的一部分.我们正在考虑转向git.我亲自使用了git(实际上我正在使用git-svn桥接回主SVN存储库),所以我确信它的好处.
一个问题是git比SVN更复杂.我们有一些全新的人,他们需要从一开始就学习版本控制.有没有人有通过直接跳入git教授版本控制的经验?我想知道它是否会太多,或者是否更容易不必忘记基于SVN的期望.
有没有人有任何方法的经验 - 直接跳到git,或先熟悉svn?
过去,磁盘压缩是以牺牲效率为代价来增加存储空间的,但当时我们都在单处理器系统上.
目前,还有额外的核心可能与处理数据并行地进行解压缩工作.
对于I/O绑定应用程序(特别是读取大量顺序数据处理),可以通过仅将读取和写入压缩数据写入磁盘来提高吞吐量.
有没有人有任何支持或拒绝这个猜想的经验?
我们有一个遗留/生产数据库.它一直在不断发展和使用,支持一个已经发展了10多年的网站.数据库由多种技术访问 - perl cgi,php和java webapps.
积累了很多琐事.我希望进行一次重大的重构.我确信有些部分是完全遗留的(显而易见的是零行的表).要确定哪些部分使用最多,我的首选策略是检测数据库,而不是通过大量潜在的访问组件.
oracle(10g)是否能够在每个表上设置触发器来报告访问的时间和频率?有人能指出我如何做到这一点或其他一些机制来实现同样的目标?
(请评论其他策略的建议,以帮助在此senario中进行数据库重构).
继续在Clojure上爬行,现在使用Java GUI.如何获取GridBagConstrains的属性映射?该bean函数不会返回完整的地图:gridx, :gridy, :fill等等......
user=> (import '(java.awt GridBagConstraints))
java.awt.GridBagConstraints
user=> (def gbc (GridBagConstraints.))
#'user/gbc
user=> (bean gbc)
{:class java.awt.GridBagConstraints}
Run Code Online (Sandbox Code Playgroud)
一如既往地感谢您的帮助.
clojure ×5
performance ×2
annotations ×1
architecture ×1
awt ×1
compression ×1
constructor ×1
cpu ×1
disk ×1
docview ×1
emacs ×1
git ×1
groovy ×1
io ×1
iteration ×1
java ×1
javabeans ×1
legacy ×1
linux ×1
macros ×1
monitoring ×1
multicore ×1
namespaces ×1
oracle ×1
org-mode ×1
pdf ×1
record ×1
seq ×1
state ×1
svn ×1
swing ×1
testing ×1