问题标签 [clojure]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
29023 浏览

clojure - 如何从 Clojure 中的序列中删除项目?

首先,我假设每个特定于结构的序列都有不同的删除项目的方法:向量可以按索引,List可以首先或最后删除,Set应该传递要删除的实际项目,等等。

其次,我假设有一些与结构无关的移除方法;他们在seq接口上工作。

由于序列在 Clojure 中是不可变的,我怀疑您实际上在做的是制作原始的廉价副本,只是没有原始项目。这意味着列表理解可以用于删除,但我怀疑它会不必要地冗长。

请给出一些从 Clojure 序列中删除项目的不同方法的惯用示例。

0 投票
4 回答
15179 浏览

clojure - 在 Clojure 循环中重新定义 let'd 变量

好的。我一直在修补 Clojure,并且不断遇到同样的问题。让我们看一下这段代码:

现在我希望这会打印出一个以 128 开头的序列,如下所示:

相反,它是一个无限循环,一遍又一遍地打印 128。显然我预期的副作用不起作用。

那么我应该如何在这样的循环中重新定义 x 的值呢?我意识到这可能不像 Lisp(我可以使用递归的匿名函数,也许),但如果我不知道如何设置这样的变量,我会发疯的。

我的另一个猜测是使用 set!,但这给出了“无效的分配目标”,因为我不是绑定形式。

请告诉我这应该如何工作。

0 投票
2 回答
2405 浏览

spring - Spring 管理的 Clojure bean

我只是想知道是否可以创建由 Clojure 代码支持的 Spring 托管 bean(我猜是 Clojure 命名空间,会实现常规 Java 接口)?如果是这样,这个例子将不胜感激。

谢谢,德米特里。

0 投票
16 回答
16665 浏览

clojure - Clojure 中的快速素数生成

我一直致力于解决Clojure 中的Project Euler问题以变得更好,并且我已经遇到过几次素数生成问题。我的问题是它需要的时间太长了。我希望有人可以帮助我找到一种有效的方法来以 Clojure-y 方式执行此操作。

当我用拳头做这件事时,我是蛮力的。这很容易做到。但是在 Xeon 2.33GHz 上以这种方式计算 10001 个素数需要 2 分钟,这对于规则来说太长了,而且总体上也太长了。这是算法:

通过将 next-prime-slow 替换为新的例程,该例程考虑了一些额外的规则(如 6n +/- 1 属性),我能够将速度提高到大约 70 秒。

接下来,我尝试在纯 Clojure 中制作一个 Eratosthenes 筛子。我不认为我把所有的错误都解决了,但我放弃了,因为它太慢了(我认为甚至比上面的还要糟糕)。

这是不好的。如果数字 150000 更小,它也会导致堆栈溢出。尽管我正在使用 recur。那可能是我的错。

接下来我尝试了一个筛子,在 Java ArrayList 上使用 Java 方法。这需要相当多的时间和记忆。

我最近的尝试是使用 Clojure 哈希映射的筛子,将所有数字插入筛子中,然后分解非素数的数字。最后,它获取密钥列表,这是它找到的素数。找到 10000 个素数大约需要 10-12 秒。我不确定它是否已完全调试。它也是递归的(使用递归和循环),因为我想成为 Lispy。

因此,对于这些问题,问题 10(总结 2000000 以下的所有素数)正在杀死我。我最快的代码给出了正确的答案,但它花了 105 秒,并且需要相当多的内存(我给它 512 MB 只是为了不用大惊小怪)。我的其他算法花了很长时间,我总是先停止它们。

我可以使用筛子快速计算 Java 或 C 中的许多素数,而无需使用太多内存。我知道我的 Clojure/Lisp 风格中一定遗漏了一些导致问题的东西。

我做错了什么吗?Clojure 在处理大序列时会有点慢吗?阅读一些 Euler 项目的讨论,人们在 100 毫秒内计算了其他 Lisps 中的前 10000 个素数。我意识到 JVM 可能会减慢速度,而且 Clojure 相对年轻,但我不希望有 100 倍的差异。

有人可以告诉我在 Clojure 中计算素数的快速方法吗?

0 投票
2 回答
1916 浏览

emacs - 在某些情况下,Emacs Clojure 模式制表符缩进很大

我将 Emacs 的 Clojure 模式与 SLIME 和 swank-clojure 一起使用。我对缩进有疑问。大多数时候缩进做我想要的:当我按 TAB 时,它会缩进 2 个空格。但是,例如,在代理的情况下,我使用 TAB 得到的缩进很大:10 个空格。例子:

...

代理方法也是如此,例如上面的 actionPerformed。

此设置在哪里,如何更改?据我了解,这一定是 Clojure 模式的问题。

0 投票
8 回答
3698 浏览

python - Python 习语“if __name__ == '__main__'”的 clojure 等价物是什么?

我正在涉足 clojure,并且在尝试确定与这个常见的 python 习语等效的 clojure(和/或 Lisp)时遇到了一些麻烦。

习惯用法是在python模块的底部通常有一些测试代码,然后是运行代码的语句,例如:

这对于简单的临时测试很有用。人们通常会通过编写来使用这个模块from mymodule import MyClass,在这种情况下_runTests()永远不会被调用,但是在最后的代码片段中,人们也可以通过python mymodule.py直接从命令行键入来运行它。

Clojure(和/或常见的 lisp)中是否有等效的成语?我不是在追求一个成熟的单元测试库(嗯,我是,但不是在这个问题中),我只想在一个模块中包含一些代码,这些代码只会在某些情况下运行,所以我可以一种运行我一直在研究的代码的快速方法,但仍然允许我的文件像普通模块/命名空间一样被导入。

0 投票
5 回答
6999 浏览

android - Android 对动态语言不利

我相信我在某个时候读到,由于 Android 在 Dalvik VM 上运行,JVM 的动态语言(Clojure、Jython、JRuby 等)很难在 Dalvik(以及因此在 Android)上获得良好的性能。如果我没记错的话,原因是在幕后,为了实现动态类型,对 java 字节码进行了相当多的摆弄,而 bytecode->dalvik 翻译不会轻易接受这一点。

那么,如果我想为 Android 开发,我应该避免使用动态 JVM 语言吗?


编辑:我想我应该提供更多的上下文。我正在考虑使用 Clojure 为 Android 开发应用程序。我考虑使用 Clojure 有几个原因:

  • 我想学FP

  • 我真的不在乎学习Java

  • Clojure 似乎有一些非常有趣的语言概念(例如 STM)。

然而,当我尝试在 Clojure 中为 Android 编写应用程序时,我发现存在一个无法接受的性能问题。但我发现一篇博客文章说动态类型语言(例如 Clojure)会因为获取动态类型所需的字节码操作而出现问题。所以我在寻找独立的确认,这是真的还是不是。我应该知道,在这个特定问题中,所有动态类型的 JVM 语言都可以被视为相同的假设。我想我确实问了一个相当广泛的问题,所以我想我不应该对人们不太明白我在问什么感到惊讶。

0 投票
1 回答
3530 浏览

lisp - 帮我写一个 Clojure 宏,它会自动将元数据添加到函数定义中

我意识到 Macro Club 的第一条规则是不要使用宏,所以下面的问题更多地是作为学习 Clojure 的练习而不是其他任何东西(我意识到这不一定是宏的最佳使用)。

我想编写一个简单的宏,它充当常规(defn)宏的包装器,并最终将一些元数据添加到定义的函数中。所以我想要这样的东西:

...扩展成这样的东西:

原则上这对我来说似乎并不难,但我无法[args]确定正确解析定义函数中的和其他形式的细节。

作为奖励,如果可能的话,我希望宏能够处理所有不同形式的 defn(即,有或没有文档字符串、多个 arity 定义等)。我在clojure-contrib/def包中看到了一些看起来可能有用的东西,但是很难找到使用它们的示例代码。

0 投票
6 回答
2575 浏览

clojure - 在 Clojure 中持久化映射/结构的最简单方法是什么?

显而易见的方法是从 Clojure Contrib 加载 JDBC 支持并编写一些函数来将映射/结构转换为表。这样做的一个缺点是它不是很灵活。对结构的更改将需要 DDL 更改。这意味着要么编写 DDL 生成(艰难),要么手动编码迁移(无聊)。

存在哪些替代方案?答案必须是 ACID,排除序列化到文件等。

0 投票
3 回答
369 浏览

python - 为了实现尾调用优化,jvm 必须牺牲什么?

人们说除了没有尾调用优化的限制之外,clojure 实现非常出色 - jvm 的限制而不是 clojure 实现。

http://lambda-the-ultimate.org/node/2547

据说在 Python 中实现 TCO 会牺牲

  • 堆栈跟踪转储,以及
  • 调试规律。

向我解释尾调用优化有什么大不了的,为什么 Python 需要它

是否必须为 TCO 的 jvm 实现做出同样的牺牲?还要牺牲什么吗?