[linux-l] Ocml vs. Java

Ivan Villanueva iv at artificialidea.com
Mi Sep 21 16:51:57 CEST 2005


Hi Oliver,

On Tue, Sep 20, 2005 at 06:23:57PM +0200, Oliver Bandel wrote:
> > >  - funktional
> > Java auch mit Interfaces (ohne pointers) aber sehr "verbose"
> 
> Na, das wage ich doch sehr zu bezweifeln, daß Java funktionale Programmierung ermöglicht.
> [Beispiel in Ocaml]
Danke für das Beispiel. Sehr schön, wenn man ein 200 Zeile Programm schnell
hacken will.
Java finde ich gut für große Projekte. Funktionale Programmierung gehts auch
wenn man mehr schreibt: Beispiel:

interface Func { int operation(int i1, int i2) ; }
class Sum implements Func { int operation(int i1, int i2) { return i1 + i2 ; }
class Pro implements Func { int operation(int i1, int i2) { return i1 * i2 ; }

Jetzt kannst Du mit Sums und Pros machen was Du willst.

> Kannst Du in Java Funktionen als Argumente und als Rückgabewerte haben?

Object example(Func f, int a, int b) {
    if ((f instanceof Sum) && (a ==b)) return new Pro() ;
    return f.operation(a,b) ;
}

> Also Funktionen eine Funktion als Übergabeparameter geben?
Auch. Z.B. eine Collection<Func>
 
 
> klar.
> OO ist ja sicherlich Java's Schwerpunkt.

Genau. Es gibt Einschränkungen die C++ nicht hat, aber dafür ist einfacher und,
was mir sehr wichtig ist, es ist schnell, Programme von anderen zu verstehen.
 
 
> > >  - mächtiges Modulsystem (mit Funktoren (Funktionen über Module :)) !)
> > Was ist das ? Wofür ist es gut ?
> 
> Sauberes Aufteilen des Codes, Code-Reuse, ...
> 
> Es gibt nicht nur die einzelnen Compilation-Units, also getrennte
> Files, sondern eine eigene OCaml-interne Modul-Sprache.
> 
> Module bestehen aus Structures (die Implementierung) und Signatures
> (das Interface).
> 
> Jede Structure hat eine Default-Signature, die alle definierten
> Values frei zugänglich macht. Mit einer gesonderten Signature kann
> mann dann alles verbergen, was man nicht haben will.
> Dabei kann man die Typen der einzelnen Values sichtbar lassen,
> oder (abstract data type) auch den Typ nur abstrakt zugänglich
> halten.

Code-reuse ist auch eine Stärke von Java. Es gibt domains; packages; classes;
und public, friendly und private methods and fields.
(Entschuldigung, ich kenne die Wörter auf Deutsch nicht.)
 
> Funktoren:
> Man hat ein Modul mit allgemeiner Implementierung (z.B.
> Balanced Tree). Man will dies auf einen speziellen Datentyp
> hin spezialisieren.
> Dann definiert man die speziellen Funktionen in einem eigenen
> Modul, setzt den Funktor auf die beiden Module an und hat als
> Ergebnis ein neues Modul!
> 
> Sozusagen ein Modul als Parameter eines anderen zur Erstellung eines
> weiteren.
> 
> Extrem geniales Feature! :)

Weiß nicht genau was gemeint ist. :-(

> > >  - pattern matching (im Sinne von Haskell, nicht im Sinne von Perl)
> Beipiel:
> 
> (* ----------------------------------------------------------------- *)
> (* is_dir dir  liefert als Ergebnis:                                 *)
> (*       wenn dir ein Verzeichnis ist  -> true                       *)
> (*       wenn dir kein Verzeichnis ist -> false                      *)
> (*       wenn Fehler auftritt          -> false (und Fehlermeldung)  *)
> (* ----------------------------------------------------------------- *)
> let is_dir name =
>     try
>       match (Unix.stat name).Unix.st_kind with
>        | Unix.S_DIR -> true
>        | _          -> false
>     with
>       _ -> ignore ( output_string stderr ( "ignoring:" ^ name ^ "\n" ) ); false

Cool. In Java:
    if (file.isDirectory()) ...
Das funktioniert in Linux, Windows, Unix, in meinem Handy, etc.

> > >  - Bytecode-Compiler
> > Java auch
> 
> ja, klar.
;-)
 
> > >  - keine Pointer, keine Casts
> > Java hat auch keine Pointer, Casts sehr wenig seid Java 5
> 
> Jeder Cast ist einer zu viel.
> Wenn es die Sprache erlaubt, ist es Mist.

Einverstanden. Aber wie kannst Du sonst Objeckte einfach so auf einen Datei
speichern und wieder lesen? z.B.:
file.writeObject("Beispiel") ;
String s = (String)file.readObject() ;
           ^^^^^^^^
           cast Notwendig
 
> lex/yacc? javacc?
> 
> Wo ist da der Zusammenhang?
Ich dachte lex/yacc ist so eine Art parser generator. Sorry.
 
 
> Funktionale Programmierung macht die meisten OO-Design-Patterns platt.
> Man muß zwar umdenken, aber hat dann das meiste im Nu schon in der Kiste
> und kann die Design-Patterns Literatur ins Museum bringen. ;-)

Das ist gut.
 

> Komisch, daß unter den OCaml-Leuten auch viele Ex-Java-Leute sind und
> Ocaml nicht mehr missen wollen. :-)

Ich frage mich ob Sie Lisp kennen. Sie scheinen mir sehr ähnlich zu sein.


Gruß,
Iván



Mehr Informationen über die Mailingliste linux-l