gpt4 book ai didi

面向 Clojure 用户的 Java

转载 作者:太空狗 更新时间:2023-10-29 23:01:30 24 4
gpt4 key购买 nike

我一直在断断续续地使用 Lisp,我正在 catch clojure。
clojure的好处是我可以很自然地使用所有的java函数,clojure的坏处也是我必须自然地了解java函数。

例如,我不得不花一些时间(谷歌搜索)在 Java 中找到平方函数(Clojure 表示法中的 Math/sqrt)。

您能否为不太熟悉 Java 的 clojure 用户推荐一些关于 Java 函数(库)的好的信息资源?

它可以是任何东西——好书、网页、论坛或其他任何东西。

最佳答案

当我第一次开始使用 Clojure 时,我遇到了类似的问题。几年前我做过一些 Java 开发,但对那里的库仍然很不熟悉。
介绍
我发现使用 Java 的最简单方法是不真正使用它。我认为从 Clojure 开始使用 Java 的书会有点多。没有那么多你真正需要知道的,除非你真的开始深入研究 JVM/Java 库。让我解释。
花更多时间学习如何从内到外使用 Clojure,并熟悉 Clojure-Contrib。例如,clojure.contrib 中的 sqrt is in generic.math-functions
您需要的许多东西实际上已经在 Clojure 中——但仍有很多东西没有。
熟悉 Clojure 中使用 Java 的调用约定和语法糖。例如根据您的示例, Math/sqrt 正在调用类 sqrt 中的静态方法(基本上只是一个函数) Math
不管怎样,如果您发现自己真的需要使用 Java,这里有一份指南应该可以帮助您入门。我将假设您已经完成了一些命令式 OO 编程,但除此之外并没有太多其他内容。即使你没有,你也应该没事。

Isaac 的 Clojurist's Java 指南
类(class)
类是一组方法(作用于类的函数),它们
也可以是数据类型:例如创建一个类型为 Double 的新类: (Double. 1.2) ,它初始化 Double 类(句点是调用类构造函数方法的语法糖,它使用您提供的值初始化类),值为 1.2
现在,看看 Java 6 API 中的 Double class:

Double

public Double(double value)

Constructs a newly allocated Double object that represents the
primitive double argument.

Parameters:
value - the value to be represented by the Double.
所以你可以看到那里发生了什么。您“构建”了一个新的 Double ,其值为 1.2 ,这是一个 double 值。有点令人困惑,但真正的 Double 是一个代表 Double 的类,可以做与 double 相关的事情。
静态方法
例如,要从字符串中解析出 Double 值,我们可以使用静态方法(意味着我们不需要 Double 的特定实例,我们可以像调用 sqrt 那样调用它) parseDouble(String s) :
(Double/parseDouble "1.2") => 1.2
不要在那里棘手。
非静态方法
假设我们想要使用一个我们初始化为某个东西的 Java 类。不太难:
(-> (String. "Hey there") ;; make a new String object
(.toUpperCase)) ;; pass it to .toUpperCase (look up -> to see what it does)
;; toUpperCase is a non-static method

=> "HEY THERE"
所以现在我们使用了一个非静态的方法,它需要一个真实的、实时的 String 对象来处理。让我们看看文档是如何工作的:
toUpperCase

public String toUpperCase()

Converts all of the characters in this String to upper case using
the rules of the default locale. This method is equivalent to
toUpperCase(Locale.getDefault()).

Returns:
the String, converted to uppercase.
所以这里我们有一个返回字符串的方法(如定义中public后面的“String”所示,不带参数。但是等等!它确实带了一个参数。在Python中,它是隐式参数 self :这在 Java 中称为 this
我们也可以使用这样的方法: (.toUpper (String. "Hey there")) 并得到相同的结果。
更多方法
由于您在 Java 中处理可变数据和类,因此您需要能够将函数应用于类(实际上是类的实例)并且不期望返回值。
例如,假设我们正在处理来自 JFrame 库的 javax.swing。我们可能需要对它做很多事情,而不是用它(您通常使用值操作,而不是在函数式语言中操作它们)。我们可以像这样:
(doto (JFrame. "My Frame!");; clever name
(.setContentPane ... here we'd add a JPanel or something to the JFrame)
(.pack) ;; this simply arranges the stuff in the frame–don't worry about it
(.setVisibleTrue)) ;; this makes the Frame visible
doto 只是将其第一个参数传递给您提供的所有其他函数,并将其作为第一个参数传递给它们。所以在这里我们只是对 JFrame 做了很多没有特别返回任何东西的事情。所有这些方法都在文档中列为 JFrame 的方法(或其父类(super class)......暂时不要担心这些)。
包起来
这应该让您为现在自己探索 the JavaDocs 做好准备。在这里,您将找到标准 Java 1.6 安装中可用的所有内容。会有新的概念,但快速的谷歌搜索应该可以回答你的大部分问题,你总是可以带着特定的问题回到这里。
请务必查看其他重要的 Clojure 函数,如 proxyreify 以及 extend-type 及其 friend 。我不经常使用它们,但当我需要时,它们可能是无价的。事实上,我自己仍然在理解它们。
那里有很多,但这主要是数量而不是复杂性的问题。这不是一个坏问题。
补充阅读:
  • Static or Nonstatic?;;统计与非静态方法指南
  • The Java Class Library;;外面有什么的概述,有一张漂亮的图片
  • The JavaDocs;;链接在
  • 以上
  • Clojure Java Interop Docs;;来自 Clojure 网站
  • Best Java Books;;根据 clartaq 的回答
  • 关于面向 Clojure 用户的 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3525403/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com