2010-09-21 5 views
1

J'essaie d'utiliser des classes Java avec Clojure. Je l'ai essayé avec Scala avec succès, mais avec Clojure, j'obtiens une exception IllegalArgumentException.Clojure-problème en utilisant javax.sound.midi.Sequencer

est ici l'API: http://download.oracle.com/javase/1.4.2/docs/api/java/lang/reflect/Method.html

Le code ci-dessous:

(import '(javax.sound.midi MidiSystem Sequencer Sequence)) 
(def mySequencer (MidiSystem/getSequencer)) 
(def mySequence (Sequence. Sequence/PPQ 10)) 
((.setSequence mySequencer) mySequence) 

jette une exception:

Exception in thread "main" java.lang.IllegalArgumentException: No matching field found: setSequence for class com.sun.media.sound.RealTimeSequencer (recordmidi.clj:0) 
    at clojure.lang.Compiler.eval(Compiler.java:5341) 
    at clojure.lang.Compiler.load(Compiler.java:5736) 
    at clojure.lang.Compiler.loadFile(Compiler.java:5699) 
    at clojure.main$load_script__6268.invoke(main.clj:213) 
    at clojure.main$script_opt__6296.invoke(main.clj:265) 
    at clojure.main$main__6314.doInvoke(main.clj:346) 
    at clojure.lang.RestFn.invoke(RestFn.java:409) 
    at clojure.lang.Var.invoke(Var.java:365) 
    at clojure.lang.AFn.applyToHelper(AFn.java:165) 
    at clojure.lang.Var.applyTo(Var.java:482) 
    at clojure.main.main(main.java:37) 
Caused by: java.lang.IllegalArgumentException: No matching field found: setSequence for class com.sun.media.sound.RealTimeSequencer 
    at clojure.lang.Reflector.getInstanceField(Reflector.java:245) 
    at clojure.lang.Reflector.invokeNoArgInstanceMember(Reflector.java:267) 
    at user$eval__11.invoke(recordmidi.clj:4) 
    at clojure.lang.Compiler.eval(Compiler.java:5325) 
    ... 10 more 

goûtés Clojure 1.1.0 et 1.2.0. Fonctionne bien à Scala. J'ai également essayé d'examiner les méthodes de la classe Sequencer en utilisant Clojure, et oui, la méthode setSequence (Sequence) est là.

C'est le seul problème avec les appels Java que j'ai eu.

Répondre

2

Essayez

(.setSequence mySequencer mySequence) 

Ce retour nul dans le REPL, qui semble à peu près juste étant donné la valeur de retour vide de la méthode (et se traduit par mySequencer.setSequence (mySequence) qui ressemble à ce que vous voulez).

J'ai aussi une fois blogué sur l'utilisation libs Java MIDI de Clojure, peut-être il aide un peu:

http://citizen428.net/archives/396

+0

Merci, ce fut tout. J'ai simplement utilisé la manière de Clojure d'invoquer les méthodes Java dans le mauvais sens :-) Et merci pour le lien. – Grav