Java for Clojure users介绍Isaac's Clojurist's Guide to Java

2022-09-03 17:32:18

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

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

你能为我推荐一些很好的Java函数(库)信息资源,给那些不太熟悉Java的clojure用户吗?

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


答案 1

当我第一次开始使用Clojure时,我遇到了类似的问题。几年前,我做过一些Java开发,但仍然对那里的库非常陌生。

介绍

我发现使用Java的最简单方法是不要真正使用它。我认为一本书对于开始使用Clojure的Java来说会有点多。你真正需要知道的并不多,除非你真的开始进入JVM/Java库。让我解释一下。

花更多的时间学习如何从内到外使用Clojure,并熟悉Clojure-Contrib。例如,在 clojure.contrib 中的 generic.math-functions 中。sqrt

你需要的许多东西实际上已经在Clojure中 - 但仍然有很多不是。

熟悉在Clojure中使用Java的调用约定和语法糖。例如,根据您的示例,从类中调用静态方法(基本上只是一个函数)。Math/sqrtsqrtMath

无论如何,这里有一个指南,如果你发现自己真的需要使用Java,它应该可以帮助你入门。我假设你已经做了一些强制性的OO编程,但没有太多其他的。即使你没有,你也应该没事。


Isaac's Clojurist's Guide to Java

类是一堆方法(作用于类的函数),也可以是数据类型:例如,创建该类型的新类:它初始化类Double(句点是调用类构造函数方法的语法糖,它用您提供的值初始化类)与值。Double(Double. 1.2)1.2

现在,看看 Java 6 API 中的 Double

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是一个表示Double的类,可以做与Doubles有关的事情。Double1.2

静态方法

例如,要从字符串中解析出Double值,我们可以使用静态方法(这意味着我们不需要特定的实例,我们可以像调用的那样调用它):DoublesqrtparseDouble(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.

所以这里我们有一个返回字符串的方法(如定义中公众后面的“String”所示,并且不带任何参数。但是等等!它确实需要一个参数。在Python中,它将是隐式参数:这在Java中被称为。selfthis

我们也可以使用这样的方法:并得到相同的结果。(.toUpper (String. "Hey there"))

有关方法的更多信息

由于您在Java中处理可变数据和类,因此您需要能够将函数应用于类(实际上是类的实例),并且不需要返回值。

例如,假设我们正在处理来自图书馆的。我们可能需要对它做很多事情,而不是用它(你通常值来操作,而不是在函数式语言中对它们进行操作)。我们可以,像这样:JFramejavax.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只需将其第一个参数传递给您为其提供的所有其他函数,并将其作为第一个参数传递给它们。所以在这里,我们只是做了很多事情,这些事情并没有特别返回任何东西。所有这些方法都列为文档中的方法(或其超类...不要担心这些)。JFrameJFrame

结束语

这应该为您自己探索JavaDocs做好准备。在这里,您将找到标准 Java 1.6 安装中可用的所有内容。会有新概念,但快速的Google搜索应该可以回答您的大多数问题,并且您始终可以带着具体的问题回到这里。

一定要看看其他重要的Clojure功能,如和以及和它的朋友。我不经常使用它们,但是当我需要时,它们可能是无价的。事实上,我自己仍然在理解它们。proxyreifyextend-type

那里有很多东西,但这主要是数量问题,而不是复杂性问题。这不是一个坏问题。

补充阅读:


答案 2

真的,任何一本好的Java书都可以让你入门。例如,请参阅有关人们迄今为止阅读过的最好的Java书籍的问题的答案。那里有很多好的来源。

一旦你有了一点Java,使用它就只是一个简单的Clojure语法问题。

掌握大量Java库的内容比弄清楚如何在Clojure中使用它们要大得多。


推荐