`
songry
  • 浏览: 84600 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

clojure调用java方法时参数问题

 
阅读更多

    众所周知,clojure基于jvm,可以在不做引入的情况下调用java.lang下面的任意对象,但是,在调用交互中

需要注意clojure中的自定义类型,下面我们用代码来说明一下。

    下面的例子是采用牛顿法求平方根 的clojure实现:

user> (defn average [x y] (/ (+ x y) 2)) ;定义求平均值函数

user> (defn good-enough? [guess x]      ;定义平方根的精确度
	    (< (Math/abs (- (* guess guess) x)) 0.001))

user> (defn sqrt-iter [guess x] ;定义求平方根的函数
	    (loop [g guess]
	       (if (good-enough? g x) g
		   (recur (average g (/ x g)))))

    上面代码看着没有任何问题,但是运行时会抛出abs的参数异常,为什么呢?

    问题出在(/ x g)这儿,clojure中的除法机制是如果无法整除,返回值默认是分数(clojure.lang.Ratio),而

java.lang.Math中的abs方法接收的参数没有这个类型,所以会抛出abs的参数异常。

    我们把除法的返回值强制转换为小数后,程序就能够正常运行了:

user> (defn sqrt-iter [guess x]
	    (loop [g guess]
	       (if (good-enough? g x) g
		   (recur (average g (double (/ x g)))))))
user> (sqrt-iter 1 9)
3.00009155413138
 
分享到:
评论

相关推荐

    Clojure调用Java类的一个实例

    在编程世界中,Clojure和Java是两种不同的编程语言,它们各具特色,但也有着紧密的联系。...了解并熟练掌握Clojure调用Java类的方法,能够极大地扩展你的编程能力,使你在混合开发环境中游刃有余。

    Scala与Clojure函数式编程模式:Java虚拟机高效编程1

    6. **递归**:函数调用自身解决问题,常见于数据结构遍历和树形结构处理。 【面向对象到函数式编程的转换】 书中可能会讨论如何用函数式编程模式替换面向对象编程中的常见模式,如工厂方法、单例、观察者模式等。...

    clojure1.6

    开发者可以轻松地调用Java库,甚至编写Java代码并直接在Clojure中使用。这使得Clojure成为Java生态系统中的强大补充,特别是在需要高度并发和复杂数据处理的场景下。 总的来说,Clojure 1.6 提供了一个高效、灵活的...

    clojure eclipse

    由于运行在JVM上,Clojure可以直接调用Java库,甚至可以编写Java互操作代码,使得开发者能利用已有的Java资源。此外,Clojure也提供了一些强大的数据结构,如持久化数据结构(Persistent Data Structures),它们在...

    Clojure入门教程.pdf

    - **互操作机制**:Clojure可以无缝地调用Java类库,反之亦然。 - **Java API**:开发者可以直接使用Java的强大API和丰富的类库资源。 #### 六、并发与并行编程 - **并发模型**:Clojure提供了原子、代理(agent)、...

    Clojure编程中文版,动物系列,徐明明译

    6. **与Java的互操作性**:由于运行在JVM上,Clojure可以直接调用Java库,反之亦然,这大大扩展了Clojure的功能。 7. **REPL驱动的开发**:Clojure的交互式REPL(Read-Eval-Print Loop)环境是其开发流程的重要组成...

    Python-closh基于Clojure的类似于Bash的shell

    5. **可扩展性**:由于Clojure是基于JVM的语言,Python-closh可以轻松调用Java库,这意味着它可以访问大量现有的Java工具和框架。此外,Clojure的模块化设计使得开发新的shell功能变得简单。 6. **Python开发**:...

    ike.cljj:Java Interop API的Clojure

    在Clojure中,`.`运算符用于调用Java对象的方法,而`[]`用于传递构造函数参数。这种语法简洁且直观,使得Clojure程序员可以轻松地与Java代码进行交互。 `ike.cljj-main`可能是这个库的主要入口点或示例代码。通常,...

    Clojure学习教程.pdf

    Clojure是一种现代的、通用的、高性能的Lisp语言方言,运行在Java虚拟机(JVM)上。它被设计成一种函数式编程语言,强调不可变数据和持久数据结构。Clojure适用于多范式编程,包括面向对象、命令式、函数式和逻辑...

    蚂蚁群优化算法演示:使用 Clojure 创建_Clojure _代码_下载

    此外,由于Clojure与Java的紧密关系,我们可以方便地调用Java的优化库或数据结构,进一步提升算法的性能。 总之,这个项目展示了如何运用Clojure的并发特性来实现蚂蚁群优化算法,提供了一个将生物启发式算法与现代...

    clojure programming

    它可以直接调用Java类库中的方法和类,这使得Clojure开发者可以充分利用现有的Java生态系统。 关于语法,Clojure的语法非常简洁,它使用了多种括号来表示代码结构。虽然初看起来可能有些不习惯,但本书作者强调,...

    为刚接触Clojure的程序员举办的研讨会 仅供学习参考用代码1.zip

    使用`import`可以导入Java类,`(.method object arg)`是调用Java方法的语法。 在研讨会中,可能会探讨Clojure的REPL(Read-Eval-Print Loop),这是一个交互式的开发工具,允许开发者即时测试代码并观察结果。此外...

    Python-cljcbloom一个用Clojure脚本实现的跨平台布隆过滤器

    Python-cljcbloom使用Clojure的Java绑定特性,使得这个库能够在任何支持JVM的平台上运行,包括Windows、Linux、macOS等,这样Python开发者无需关心底层实现的平台依赖,可以方便地在不同操作系统上使用。...

    clojure-basics-源码.rar

    7. **Java互操作性**:由于Clojure运行在JVM上,它可以无缝地调用Java库,极大地扩展了其功能。 8. **惰性序列**:Clojure的序列是惰性的,这意味着它们只在需要时计算元素,这在处理大量数据时非常高效。 9. **...

    有条不紊:Clojure多方法功能强大得多

    在Clojure编程语言中,多方法(Multimethods)是一种强大的动态分派机制,它允许程序员根据对象的类型或值来决定调用哪个方法。本文将深入探讨Clojure的多方法及其与其他语言中类似概念的比较,以及如何在实践中有效...

    micro-tools:Clojure中用于Java应用程序开发的专用微型工具

    由于Clojure是运行在JVM上的,它可以无缝调用Java库,这使得“micro-tools”可以方便地集成到任何Java项目中。通过Clojure的Java interop特性,开发者可以直接使用Java类和方法,而无需编写额外的绑定代码。 在...

    clojurebits:涉足Clojure

    method (Class/object) args)`的语法来调用Java对象的方法。 Clojurebits主文件`clojurebits-main`可能包含了Clojure的示例代码、教程或者项目,帮助初学者理解Clojure的实际应用。通过实践这些例子,学习者可以...

    hikari-cp:HikariCP JDBC连接池的Clojure包装器

    Clojure是一种基于Lisp的函数式编程语言,运行在Java虚拟机(JVM)上,可以直接调用Java库。通过“hikari-cp”这个Clojure库,开发者可以利用Clojure的语法和特性来配置和管理HikariCP连接池,使得代码更简洁、易读...

Global site tag (gtag.js) - Google Analytics