使用短符号#(..)有一些我不了解匿名函数的东西
以下作品:
REPL> ((fn [s] s) "Eh")
"Eh"
Run Code Online (Sandbox Code Playgroud)
但这不是:
REPL> (#(%) "Eh")
Run Code Online (Sandbox Code Playgroud)
这有效:
REPL> (#(str %) "Eh")
"Eh"
Run Code Online (Sandbox Code Playgroud)
我不明白的是为什么(#(%)"Eh")不起作用,同时我不需要使用str in ((fn [s] s)"Eh")
它们都是匿名函数,它们都带有一个参数.为什么简写符号需要一个函数而另一个符号不需要?
为了更好地理解Java中的工作原理,我想知道我是否可以在运行时动态地将目录添加到类路径中.
例如,如果我使用"java -jar mycp.jar"启动.jar并输出java.class.path属性,我可能会得到:
java.class.path: '.:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java'
Run Code Online (Sandbox Code Playgroud)
现在可以在运行时修改此类路径以添加另一个目录吗?(例如在使用位于我想添加的目录中的.jar对类进行第一次调用之前).
我最近问过一个关于Neo4j的问题,我开始工作,看起来不错.它是可嵌入的,它是用Java编写的,并没有(太多)依赖.
然而,这是一个图形数据库,我不知道将它用作简单的键/值存储是否是一个好主意.
基本上我有一张大地图,在Java中看起来像这样:
Map<Integer,Map<String,String>>
Run Code Online (Sandbox Code Playgroud)
我在主地图中有几千万个条目,每个条目都包含一个属性/值的映射."内部"地图相对较小:约20个条目.
我需要一种方法来保持从运行webapp到另一个的映射.
使用Neo4j,我所做的是为每个ID(整数)创建一个节点,然后为内部映射中的每个条目放置一个属性.从我早期的测试看起来似乎有效,但我不确定这是一个很好的方法.
用Java编写的哪个可嵌入数据库会用到吗?
要求是:
用Java编写
可嵌入(所以没什么太大)
不是 SQL(*)
开源
易于备份(我需要能够在服务器运行时进行"实时"备份)
我的术语也可能有点不对,所以请随时帮助我/纠正我.对于我的"地图地图",最合适的是键/值对DB吗?
由于键/值对DB,文档DB,大表,图形DB等之间的差异,我有点迷失.
我也喜欢使用像Neo4J这样的图形数据库来满足我的需求(我认为性能确实不会是一个问题,因为我会看到相对少量的条目).
当然我可以自己坚持我的地图地图,但我真的不想在这里重新发明任何轮子.我想重用一个久经考验的DB ......
(*)我不想要SQL的原因是我总是会有这个"地图图",内部地图会不断发展,所以我不想要太结构化的东西.
我正在读这个被问到的问题:避免回调中的内存泄漏?
我很困惑,直到有人回答以下问题:
"这种方法的问题是你不能有一个只在集合中引用的监听器,因为它会随机消失(在下一个GC上)"
我是否理解使用弱引用(如存储在WeakHashMap中)与匿名侦听器不兼容?
我通常传递这样的听众:
public static void main(String[] args) {
final Observable obs = new SomeObservable();
obs.addObserver(new Observer() {
public void update(final Observable o, final Object arg) {
System.out.println("Notified");
}
});
obs.notifyObservers();
... // program continues its life here
}
private static final class SomeObservable extends Observable {
@Override
public void addObserver(final Observer o) {
super.addObserver(o);
setChanged(); // shouldn't be done from here (unrelated to the question)
}
}
Run Code Online (Sandbox Code Playgroud)
我使用CopyOnWriteArrayList跟踪侦听器(上面的默认Observable显然使用了一个旧的Vector,但它只是一个示例来说明我通常如何创建一个匿名类来用作侦听器). …
我已经从4clojure.com解决了45个问题,我注意到我尝试使用递归和累加器解决一些问题的方式中反复出现问题.
我会试着解释一下我能做的最好的事情,最终得到一些非常好的解决方案,希望有些Clojurers会"得到"我没有得到的东西.
例如,问题34要求编写一个函数(不使用范围),将两个整数作为参数并创建一个范围(不使用范围).简单地说你做(... 1 7)然后你得到(1 2 3 4 5 6).
现在这个问题不是解决这个特殊问题.
如果我想使用递归和累加器来解决这个问题怎么办?
我的思维过程是这样的:
我需要编写一个带两个参数的函数,我从(fn [xy])开始
我需要递归,我需要跟踪一个列表,我将使用累加器,所以我在第一个函数中写了第二个函数,需要另外一个参数:
(fn [xy]
((fn g [xy acc] ...)x y'())
(显然我无法在SO上正确格式化Clojure代码!?)
在这里,我已经不确定我是否正确地执行了它:第一个函数必须使用两个整数参数(而不是我的调用)并且我不确定:如果我想使用累加器,我可以使用累加器而不创建嵌套函数?
然后我想连词,但我不能这样做:
(conj 0 1)
Run Code Online (Sandbox Code Playgroud)
所以我做了奇怪的事情,以确保我先得到一个序列,我最终得到这个:
(fn
[x y]
((fn g [x y acc] (if (= x y) y (conj (conj acc (g (inc x) y acc)) x)))
x
y
'()))
Run Code Online (Sandbox Code Playgroud)
但是这产生了这个:
(1 (2 (3 4)))
Run Code Online (Sandbox Code Playgroud)
而不是这个:
(1 2 3 4)
Run Code Online (Sandbox Code Playgroud)
所以我最终做了一个额外的压扁,它的工作原理,但它是完全丑陋的.
我开始理解一些事情,我甚至开始,在某些情况下,以更多的方式"思考",但我在编写解决方案时遇到了问题.
比如我在这里决定: …
我已经阅读了一些关于CouchDB的内容,我真的很感兴趣它是"仅附加".我可能误解了这一点,但据我了解,它有点像这样:
数据在时间t0添加到DB,告知ID为1的用户是"Cedrik Martin"
询问"ID为1的用户的名称是什么?"的查询 返回"Cedrik Martin"
在时间t1,对DB进行更新,告知:"具有ID 1名称的用户是Cedric Martin"(将"k"改为"c").
再次询问"ID为1的用户名称"的查询现在返回"Cedric Martin"
这是一个愚蠢的例子,但这是因为我想了解一些关于CouchDB的基本知识.
看到更新是使用数据库末尾的附加进行的,是否可以查询数据库"就像它在时间t0",没有做任何特别的事情?
我可以问CouchDB "在时间t0,ID为1的用户的名字是什么?" ?
编辑第一个答案是非常有趣的,所以我有一个更精确的问题:只要我不"压缩"CouchDB,我就可以编写以某种方式"引用透明"的查询(即它们总是产生同样的结果)?例如,如果我查询"修订版r的文档d",只要我没有压缩数据库,我保证总能得到相同的答案吗?
一个典型的Lisp方言可以使用自下而上的"动态编程"方法解决问题吗?
(请注意:我不是在谈论"memoization",据我所知,使用任何Lisp方言都是微不足道的.我真的在谈论自下而上的动态编程,你可以在这里构建你的数组自下而上然后使用您刚刚介绍的元素来计算下一个元素.)
例如,使用动态编程,"0-1背包"问题可以在任何其他方法失败的输入的伪多项式时间内求解.
一个必要的(不完整的)解决方案是:
for (int k = 1; k <= a.length; k++) {
for (int y = 1; y <= b; y++) {
if (y < a[k-1]) {
knap[k][y-1] = knap[k-1][y-1];
} else {
if (y > a[k-1]) {
knap[k][y-1] = Math.max(knap[k-1][y-1], knap[k-1][y-1-a[k-1]] + c[k-1]);
} else {
knap[k][y-1] = Math.max(knap[k-1][y-1], c[k-1]);
}
}
Run Code Online (Sandbox Code Playgroud)
各种Lisp方言有可能做到这一点吗?如果不是,为什么不呢?
当你调用reduce并传递一个函数和两个参数时,第一个参数可以被认为是一个累加器吗?
它总是一个累加器吗?
它有时是累加器吗?
我正在阅读一篇关于使用Clojure来解析大文件的博客文章并找到了这一行:
(reduce line-func line-acc (line-seq rdr))
Run Code Online (Sandbox Code Playgroud)
链接到博客条目:
http://lethain.com/reading-file-in-clojure/
怎么样简单:( 减少+ [1 2 3])?是否涉及累加器?
我把它问题归结为:"什么是累加器?"
但我还是想了解累加器和reduce函数之间的关系.所以对这些特定(相关)问题的任何答案都是最受欢迎的!
关于Clojure提到Maven的文章/博客/问题/答案的数量,我感到有点惊讶.
在作为Java开发人员工作大约十年的时间里,从事桌面应用程序和webapps工作,我从未使用Maven一次(通常 - 这是个人意见,但我知道有些人的想法是相同的 - 我的项目'已经看到使用Maven包括"厨房水槽",而那些建造了更"控制"的构建过程,其中"更清洁",生产更小的罐子,更快的构建时间等).
当你想要构建一个Clojure应用程序时Maven是一个要求吗?
当您想使用Leiningen时,Maven是强制性的吗?例如,我可以"手动"将外部jar作为依赖项添加到leiningen项目中,而不需要Maven吗?
我认为我的问题归结为:你可以在Clojure/JVM世界中逃脱而不使用Maven,就像你可以构建,测试,打包和发送Java桌面,webapps和Android应用程序而不需要Maven一样吗?