ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: Ruby 2.0
BeitragVerfasst: 02 Mär 2010, 16:05 
Offline
Metaprogrammierer

Registriert: 03 Feb 2008, 15:36
Beiträge: 682
Wohnort: Aachen, NRW
toxicburst hat geschrieben:
...
eine Space Invaders-Implementierung in der Standardlib (mit Kamelen und Schlangen statt Außerirdischen)

JA! definitiv! Das MUSS rein!

_________________
-


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Ruby 2.0
BeitragVerfasst: 02 Mär 2010, 17:03 
Offline
Interpreter
Benutzeravatar

Registriert: 03 Jul 2006, 14:53
Beiträge: 4872
Wohnort: RLP
Kai hat geschrieben:
toxicburst hat geschrieben:
Wenn hier schon Wünsche geäußert werden, füge ich meine noch schnell hinzu:

  • Polymorphe Methoden

Was meinst du damit? Methodenüberladung? Ich denke die klassische Methodenüberladung dürfte in Ruby schwierig werden, da Variablen keine Typen haben. Es wäre aber cool wenn man das case-Statement etwas tunen könnte, so dass es wie ein Pattern-Matching in funktionalen Sprachen arbeitet.



Vielleicht sowas wie multi_def? Herrlich langsam, aber wenn mans vorsichtig einsetzt sehr praktisch.

http://github.com/skade/multi_def


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Ruby 2.0
BeitragVerfasst: 02 Mär 2010, 17:50 
Offline
Hacker
Benutzeravatar

Registriert: 03 Nov 2006, 22:48
Beiträge: 440
Wohnort: [:rhein, :mosel].join
Kai hat geschrieben:
Was meinst du damit? Methodenüberladung? Ich denke die klassische Methodenüberladung dürfte in Ruby schwierig werden, da Variablen keine Typen haben. Es wäre aber cool wenn man das case-Statement etwas tunen könnte, so dass es wie ein Pattern-Matching in funktionalen Sprachen arbeitet.

Nehmen wir als Beispiel eine Methode zur Berechnung der Fakultät einer Zahl. Mit Ruby kann man diese folgendermaßen implementieren:

1
2
3
4
5
6
7
def fak(n)
if [0,1].include?(n) then 1
elsif n<0 then raise "n must be >= 0"
else
n*fak(n-1)
end
end

Es ist eine einfache Berechnung, doch der größte Teil der Methode besteht aus Konditionen und Verzweigungen. Das schränkt die Lesbarkeit ein. Würde Ruby polymorphe Methoden anbieten, könnte ich folgendes machen:

1
2
3
4
5
6
def fak(n)
n*fak(n-1)
end
def fak(1); 1; end
def fak(0); 1; end
def fak(*); raise "n must be >= 0"

Man sieht sofort, dass es sich bei der Methode im Kern um die Berechnung n*fak(n-1) handelt. Die Verzweigungen, die den Blick auf das Wesentliche trüben, brauche ich nicht mehr, da die Bedingungen allein von den Methodensignaturen abgehandelt werden. Nur gibt es ein Problem: Ruby erlaubt das überschreiben einer Methode. Wie kann also Ruby unterscheiden, ob ich eine zweite Methodensignatur anlegen möchte oder die Bestehende überschreiben will?

Ich habe bisher auch ohne polymorphe Methoden in Ruby überlebt. Aber manchmal denke ich: Hier könnte ich sowas jetzt gebrauchen.

_________________
stefankloeckner.blog.de

"Deine Mauerzinnen mache ich aus Rubin und all deine Grenzen von erlesenen Steinen." - Die Bibel, Jesaja 52.54


Zuletzt geändert von toxicburst am 02 Mär 2010, 17:57, insgesamt 2-mal geändert.

Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Ruby 2.0
BeitragVerfasst: 02 Mär 2010, 17:54 
Offline
Hacker
Benutzeravatar

Registriert: 03 Nov 2006, 22:48
Beiträge: 440
Wohnort: [:rhein, :mosel].join
Skade hat geschrieben:
Vielleicht sowas wie multi_def? Herrlich langsam, aber wenn mans vorsichtig einsetzt sehr praktisch.

http://github.com/skade/multi_def

Interessant. Gibt es dazu ein kurzes Beispiel?

_________________
stefankloeckner.blog.de

"Deine Mauerzinnen mache ich aus Rubin und all deine Grenzen von erlesenen Steinen." - Die Bibel, Jesaja 52.54


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Ruby 2.0
BeitragVerfasst: 02 Mär 2010, 17:58 
Offline
Interpreter
Benutzeravatar

Registriert: 21 Mai 2007, 11:30
Beiträge: 1283
Wohnort: Thüringen
Siehe test-Ordner ^^

Ich überlege nur gerade... Ist das case-Statement nicht schon defacto dazu in der Lage, wenn man entsprechend an den ===-Methoden dreht?


1
2
3
4
5
6
7
8
case [x, y, label, other, hash]
when [Integer, Integer, __, Hash] and ->(_, _, l, _, _) {not l.empty?}
puts "Foo!"
when [__, __, __, IrgendeinStruct.new(__,20, __, "x"), __]
puts "bla!"
when [__, __, __, __, {__ => 1, __ => 5, __ => "y"}]
puts "dingens!"
end


Was an der Stelle natürlich zum echten Pattern-Matching fehlt, ist das ich die irgendwelche Variablen in meine Patterns einwerfe die später ausgefüllt werden...


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Ruby 2.0
BeitragVerfasst: 02 Mär 2010, 19:14 
Offline
Interpreter
Benutzeravatar

Registriert: 03 Jul 2006, 14:53
Beiträge: 4872
Wohnort: RLP
toxicburst hat geschrieben:
Skade hat geschrieben:
Vielleicht sowas wie multi_def? Herrlich langsam, aber wenn mans vorsichtig einsetzt sehr praktisch.

http://github.com/skade/multi_def

Interessant. Gibt es dazu ein kurzes Beispiel?


Wird nachgeliefert. Grundsätzlich ist es nur ein bisschen Zucker um die Beta-Version der Bibliothek "reg". Unter der Haube entspricht es "Patterns", das ich hier mal vorgestellt habe, nur mit etwas anderer Match-Syntax.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Ruby 2.0
BeitragVerfasst: 03 Mär 2010, 08:49 
Offline
Hacker
Benutzeravatar

Registriert: 03 Nov 2006, 22:48
Beiträge: 440
Wohnort: [:rhein, :mosel].join
Kai hat geschrieben:
Ich überlege nur gerade... Ist das case-Statement nicht schon defacto dazu in der Lage, wenn man entsprechend an den ===-Methoden dreht?

case für das Pattern matching zu verwenden ist wirklich eine spannende Idee. Aber besonders hübsch ist das nicht, oder? :wink:

_________________
stefankloeckner.blog.de

"Deine Mauerzinnen mache ich aus Rubin und all deine Grenzen von erlesenen Steinen." - Die Bibel, Jesaja 52.54


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Ruby 2.0
BeitragVerfasst: 03 Mär 2010, 16:48 
Offline
Interpreter
Benutzeravatar

Registriert: 21 Mai 2007, 11:30
Beiträge: 1283
Wohnort: Thüringen
Das Problem bei Methoden ist nur, dass es imo zu uneindeutig ist. Wenn ich eine Methode überschreiben will, muss ich dann auch darauf achten alle Ausprägungen der Methode zu überschreiben? Und wie ist das mit Vererbung? Wenn ich ein Modul einbinde mit einer Methodendefinition, die spezifischer ist als die in meiner Klasse, überlädt dann die Moduldefinition die Klassendefinition?

Ich vermute das führt eher zu Problemen =/ Case hat außerdem den Vorteil, dass man es überall verwenden kann (und in Haskell ist das Pattern-Matching afair auch nur Syntaxzucker für ein Case-Statement).

Aber du hast recht: Hübsch sieht es nicht aus. Da müsste man noch etwas Syntaxzucker einführen =P


1
2
3
4
5
6
case x, y, z
when String, Integer, Integer for which y + z < x.to_i then
puts "Tuned Patternmatching!"
when x: EinStruct.new(a=?, b=?, c=?)
puts a + b + c
end


Oder gar ein implizites Case-Konstrukt in jeder Methode (wie es jetzt schon bei begin-rescue-ensure-end der Fall ist).


1
2
3
4
5
6
7
8
def fak (n)
when 0
1
when Integer
n * fak(n-1)
else
raise ArgumentError.new
end


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite Vorherige  1, 2

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: