无论如何在clojure中构造一个lambda函数?

Posted

技术标签:

【中文标题】无论如何在clojure中构造一个lambda函数?【英文标题】:is there anyway to construct a lambda function in clojure? 【发布时间】:2016-07-23 00:57:46 【问题描述】:

我在这里问过:https://***.com/questions/36385548/how-to-programmatically-construct-a-lambda-in-java-8 但我想知道是否有替代方法可以在 clojure 中构造 lambda。

对于用例,我正在尝试包装 rethinkdb 库:http://www.rethinkdb.com/api/java/#map


我可能错了,但是在 rethinkdb 驱动程序中,不知何故 lambdas 被编译成 ast 语法,然后转换为 js 并发送到数据库。我相信我需要以某种方式明确地创建一个 lambda。 http://www.rethinkdb.com/blog/lambda-functions/ 所以这个问题How to implement lambda as a function called "lambda" in Clojure? 只展示了如何使用函数,而不是 lambda。

【问题讨论】:

您始终可以将reify 与适当的Java 功能接口一起使用。虽然我觉得你应该在这里添加更多细节,但不清楚你所说的“在 Clojure 中构造 lambda 函数”是什么意思。 查看更新...虽然很高兴对 rethinkdb lambda 的工作方式有误 【参考方案1】:

Lambda 只是一种语法糖,就像 clojure 宏一样。您不能在 java 中使用宏,也不能在 clojure 中使用 java 的“lambda 语法”。但是你可以在 clojure 中创建 java lambda 语法创建的对象。

也就是说,在java中,lambda语法根据方法中的类型创建了一个实现接口的对象。该接口有一个非默认和非静态方法。

如果你想在 clojure 中构造一个“java lambda”,你真正需要做的是创建一个实现该接口的对象。

功能界面: https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html 您如何将 lambdas 视为参数: How do I define a method which takes a lambda as a parameter in Java 8?

【讨论】:

以上是关于无论如何在clojure中构造一个lambda函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 Clojure 中类型提示一个 nil 文字

`let` 在 Clojure 中是如何实现的,它的开销是多少?

尽管在 Clojure 中对 Java 构造函数有类型提示,但仍会出现反射警告

了解 Lambda 闭包类型如何删除默认构造函数

函数式编程那些事儿

如何在另一个 defn 中调用一个 defn 函数以及如何在 Clojure 中调试