2016-06-03 24 views
1

Ich habe Frege ausprobiert und eines der ersten Dinge, die ich tun möchte, ist eine Java-Schnittstelle zu implementieren.Wie implementiert man Java-Schnittstellen in Frege?

Wie wird das gemacht?

Hier ist mein Beispiel in Java:

package mypkg; 

import frege.repl.FregeRepl; 
import frege.runtime.Concurrent; 
import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 


public class FregeMain implements BundleActivator { 

    public FregeMain() { 

    } 

    @Override 
    public void start(BundleContext context) throws Exception { 
     System.out.println("Frege Bundle activated"); 
     new Thread(() -> FregeRepl.main(new String[ 0 ])).start(); 
    } 

    @Override 
    public void stop(BundleContext context) throws Exception { 
     System.out.println("Frege stopping. Goodbye!"); 
     Concurrent.shutDownIfExists(); 
    } 

} 

dies in Frege zu implementieren, würde ich wissen müssen:

  • , wie etwas zu erklären, das sichtbar ist, wird als eine Klasse mypkg.FregeMain genannt Umsetzung BundleActivator im JVM-Bytecode (beachten Sie, dass dies wichtig ist, da das OSGi-Framework das JAR nach Klassen durchsucht, die diese Schnittstelle implementieren, und sie automatisch aufruft).

  • Wie implementiert man eine Runnable (als Haskell Lambda, wahrscheinlich) und übergeben Sie es an die Thread Konstruktor. Auch dasselbe Problem: Implementieren Sie eine Java-Schnittstelle, aber diesmal mit einer anonymen Klasse oder Lambda.

Ich versuchte, die Calling Java from Frege Post zu verstehen, aber wahrscheinlich aufgrund meiner mangelnden Erfahrung in Frege/Haskell, ich verstehe einfach nicht, das meiste davon.

Danke für jede Eingabe.

+0

Warum würden Sie das tun? Ihr Java-Code ist kurz und wahrscheinlich richtig? – Ingo

+0

Ich würde das nicht tun. Ich möchte nur lernen. – Renato

+0

Ich verstehe. Es ist so, dass das Konzept der "Schnittstelle" nicht wirklich Teil von Frege ist. Daher sollte der obige Code in Ordnung sein. Da es etwas sehr Java-spezifisch ist, ist es in Ordnung, wenn es in Java ist. – Ingo

Antwort

1

Die einfachste Möglichkeit zur Implementierung der Java-Schnittstelle in Frege ist möglicherweise die Verwendung einer Inline-Moduldefinition. Einige gründliche Beispiele sind in https://github.com/Frege/FregeFX/blob/master/fregefx/src/main/frege/fregefx/JavaFxUtils.fr

+0

Das Beispiel sieht in der Frege-Datei nur wie Java-Code aus. Tust du das so? Können Sie den entsprechenden Code aus meinem Beispiel anzeigen? – Renato

+1

Sie benötigen eine native Deklaration von 'Daten BA = native org.osgi.framework.BundleActivator' und dann' native Modulschnittstelle BA wo {'Ihre Methoden hier'} ' – Ingo