Kalaha: Scala + Java = ?

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Diese Umfrage wurde während der Migration geschlossen.

  • Code? Neee, RandomPlayer wirds richten!
  • Wir haben bisher nur ein Konzept im Kopf…
  • Wir verzweifeln an Java + Scala
  • Erste Code-Schnipsel in Java sind bereit und getestet
  • Wir haben/erwarten keine Probleme, weil wir sowieso Scala benutzen werden

0 voters

Kalaha: Scala + Java = ?
Heyho zusammen,

nach ersten Tests von meiner Seite aus, möchte ich mal wissen wie so die Resonanz ist und vor allem, was eure Lösung ist (damit wir Alternativen o.ä. früh genug erkennen).

Hat schon jemand von euch versucht Java und Scala zu verheiraten? Wenn ja, welchen Weg seid ihr dabei gegangen? Allgemein wie sieht die Lage bei euch aus?
Stimmt einfach ab. :smiley:


Seriously? Also einfach die class files in java einbinden macht probleme oder was funktioniert nicht? Feedback, leute, feedback :smiley:


Also wir haben gestern ungefähr ne halbe Stunde gebraucht um überhaupt den Konstruktor des Agents aufrufen zu können. Sind dann zu dem Ergebnis gekommen:

		ArrayList<java.lang.String> students = new ArrayList<String>();
		SuperAgent a = new SuperAgent("SuperAgent", JavaConversions.asScalaBuffer(students).toList());

Irgendwie super umständlich, geht das nicht anders?
Haben auch nicht rausgefunden wie wir unser Zeug testen sollen, da Board ja eine abstrakte Klasse ist.


Also Ich bin soweit, dass ich aus Board() eine Liste so in umwandeln kann, dass IDE keine Fehlermeldung anzeigt.
List a = scala.collection.JavaConversions.asJavaList(b.getHouses(agent));
IDE sagt das ist okay, aber wirft dann einen Fehler, dass meine Init Methode nicht gefunden wird.
Also testen konnte ich es nicht. Und was man eigentlich braucht ist ja board.getState(). Und das ist ein ja Quadrupel, also keinen wirklichen Plan, wie man das dann wieder umgewandelt bekommt.
In Scala funktioniert alles problemlos. Man muss dann so wie ich das sehe eine eigene, den Spielregeln folgende, move() Funktion schreiben, die die Zuege fuer meinen Minimax macht oder?


Das größte Problem war meiner Meinung nach sbt und java 8 zum Laufen zu bringen =)

Du kannst ein Tournament mit beliebigen Agents anlegen (u.a. auch euer eigener), und das ganze mitsbt runausführen


Also ich war mir fast sicher, dass nach type erasure scala listen in java listen umgewandelt werden, i.e. identisch seien.
An für sich würde ich jetzt einfach alle parameter, tupel etc. so umschreiben, dass sie java-listen sind, oder funk ich euch damit jetzt in eure laufenden Projekte?

Dafür gibt es die game-klasse… sbt run kannte ich gar nicht, aber das wird wohl meine mein funktion starten; wenn ihr java benutzt wollt ihr da wohl nicht mit dem scala code rumspielen müssen…


move und init, ja. Siehe README.md oder die documentation; da sind die einzelnen klassen und ihre accessors auch nochmal sort-of dokumentiert


Und ich dachte schon ich hab mich besonders dämlich angestellt. :smiley:
Eine List in Scala und eine List in Java sind konzeptionell zwei komplett andere Dinge (laut Doku). Die Java List ist ein interface (und damit nicht direkt benutzbar als objekt) und die Scala list wandelt sich je nach Gebrauch in entweder scala.collection.immutable.Seq oder irgendwas anderes zeugs um (grad zu faul das genau nach zu schauen).

Den Konsteuktor aufzurufen ist so wie Scala „Konstruktoren erlaubt“ auch nicht ganz möglich, da muss man erst etwas tricksen, sonst fliegt einem eine Exception nach der anderen um die Ohren.

Das Tupel4 lässt sich scheinbar einfach in eine entsprechende Java-Klasse umwandeln, das brauchst du also (wenn mein Java nicht intern was verkackt o.ä.) eigentlich nicht umwandeln. Aber vor allem die Listen und der Konstruktor machen riesen Probleme. Der Konstruktor ist aber „noch bezwingbar“ aber die Scala spezifischen Klassen ala List sind alles andere als lustig. :smiley:

Soweit mein aktueller Stand und meine Erklärungen basierend auf AUD-Java-Kentnissen und Googlen. :smiley: Wobei um ehrlich zu sein is selbst das „benutzen“ von „Membervariablen“ (heißt das so in Scala? Z.b. name, students, me) nicht direkt möglich (angeblich solls über „me()“ bzw. „name()“ gehen aber blieb ungetestet und ich bin skeptiscb).


Okay, ich hab gerade eine neue Version gepusht, bei der alle scala.List und tupel ersetzt wurden durch java.lang.Iterable - DAS müsste jawohl funktionieren. Kann das jemand verifizieren/falsifizieren?

Ach ja, und der Konstruktor der Agent class nimmt jetzt keine Parameter mehr, i.e. name und students sind jetzt normale Felder


Ich meinte das so: Man sollte ja intern sich einen Minimax Baum aufbauen. Allerdings muss man dann die „Spiellogik“ selbst nochmal implementieren oder? Also praktisch den State des Spiels entsprechend eines moves im Minimax veraendern. Ein neues „internes“ Game zu erstellen klappt ja nicht, weil Board private und so.


Das ist eine Möglichkeit. Wir zwingen euch keine Strategie auf; minimax ist aber vermutlich am sinnigsten, ja.

Ah, das meinst du. Naja, irgendwie halt schon, ja; ich glaub die klassen die ich für Game z.B. gebaut habe willst du auch nicht für minimax benutzen… das Board ist natürlich bewusst private, aber dein minimax sollte am board ja auch nichts ändern. Was du natürlich machen kannst ist, innerhalb deiner move funktion (oder bei init schon) eigene private instanzen von Game erzeugen mit zwei privaten dummy-agenten, die dir den minimax-baum aufbauen… bin mir aber nicht sicher ob das effizient ist.


Ja das war auch meine Idee :smiley: Aber lass ich wohl lieber sein! Danke fuer die schnelle Antwort!


Gerade mal gepullt und ausprobiert.
Bei mir hat Agent immer noch den Konstruktor mit (String, scala.collection.immutalbe.List) als Parameter.
In der init bekomm ich von board.getState() immer noch ein scala.Tuple4 zurück.
Kann es sein, dass vielleicht nur die sources geändert wurden und ich das noch neubauen muss?

Edit: Ah ja, die kalah_2.12-1.0.jar ist noch von vor 2 Tagen.
Edit 2: Für jeden der nicht weiss, wie er aus dem class folder ne .jar macht: Einfach in ‚target/scala-2.12/classes/‘ gehen und ‚jar cf kalah.jar info/‘ eintippen.

2 „Gefällt mir“

Also ich bin jetzt kein Scala-Experte, aber wird da nicht ne Map mit keys 1 bis houses angelegt, und in getSeed dann mit keys 0 bis houses-1 drauf zugegriffen?


facepalm jupp, ich bin dämlich.
Hab grad die .class/.jar files auch gepusht :wink:

facepalm again jupp… das war mal ne List statt ner Map und als ich dann ne Map draus gemacht hab hab ich vergessen das -1 rauszunehmen. Sollte jetzt stimmen ^^

1 „Gefällt mir“

Ich bin jetzt schon ziemlich frustriert, da ich weder ein Javafrickler und noch weniger ein Scalaversteher bin. :-/

Gibt es Leute die das im CIP zum laufen gebracht haben ([m]addpackage[/m] …)?
Scala 2.12 scheint dort nicht installiert zu sein; kann ich dien [m].jar[/m] Files selber mit scala 2.11 bauen?
Muss meine Klasse in dem selben [m]src[/m]-Verzeichnis und [m]package[/m] sein?
Gibt es ein Makefile o.ä. was ich übersehe?

Für das nächste Mal ist es evtl. vorteilhaft eine gemeinsame Schnittstelle (z.B. ähnlich wie beim FAU ICPC https://icpc.cs.fau.de/problemset_winter_2015.pdf einfach [m]stdin[/m]/[m]stdout[/m]?) zu definieren.
So muss niemand mehr in Fremdsprachen programmieren :slight_smile:


An dem Typ-Problem hat sich übringens nicht viel geändert. board.getState() gibt zwar ein Iterable zurück, in dem Iterable stecken aber zwei scala.collection.JavaConversions.SeqWrapper.


Tatsächlich habe ich das auch angedacht gehabt, aber dabei gab es besonders den Einwand:
"Python vs. C-Code ist nicht mehr wirklich ein Duell um ‚Wer hat den besten Algorithmus‘, sondern um ‚Wer hat die schnellste Sprache‘ "
Dem kann ich soweit zustimmen, wobei natürlich gute Algorithmen viel Zeit „sparen können“, genau so geht es aber auch andersrum, dass manche Sprachen, schlechte Algorithmen gut machen (einfach weil sie mehr Simulationen pro Sekunde schaffen). Jetzt nachdem sowieso schon einige mit Codes in Java angefangen haben, denke ich, lohnt es sich auch nicht mehr ernsthaft über eine gemeinsame Schnittstelle ala Client/Server, STDIN/STDOUT, usw. nachzudenken.

Ich denke Java ist da schon mit der beste gemeinsame Nenner für sowas, weil jeder mindetsens AUD/PFP-Niveau Java kann (oder können sollte).
Die Konvertierung von Scala ↔ Java hingegen scheint weiterhin äußerst hart zu sein. :confused:
Ich weiß aber nicht wie wir das sinnvoll lösen wollen, eine komplette Portierung von Scala nach Java wäre zwar möglich, aber die Scala Leute hätten dann halt genau das Problem, was die Java Leute jetzt haben. :confused:


sollte; solltest du aber gar nciht müssen… .jar und .class files sind ja mitgeliefert…

Kommt wohl auf deine IDE an und wie sie projekte handlet

Es gibt ne .sbt datei (scala build tool); die ist sowas wie ein makefile…

aber again: .class und .jar files sind teil des repositories…

what the hell??? Was ist der sinn von JavaConversions wenn sie dann nicht java-converten? >.<

Ich guck mir das nochmal an, aber es ist halt auch nur ne list.asJava, genau wie die äußere liste; also sehr verwirrend, warum es bei den inneren listen nicht funktioniert, aber bei der äußeren schon… 0o