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  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: proc in C
BeitragVerfasst: 30 Nov 2006, 11:35 
Offline
Geselle

Registriert: 02 Nov 2006, 17:55
Beiträge: 103
Wohnort: Erfurt
Hi,

Mal wieder eine Frage zu Ruby und C.
Kann mir jemand einen Tipp geben wie man in C aus Ruby-Blöcken proc-Objekte erzeugt?
In Ruby braucht man ja nur bei seiner Methodendeklaration den letzten Parameter mit einem "&"
am Anfang zu kennzeichnen und schon wird ein übergebener Codeblock
in ein proc-Objekt umgesetzt, aber wie kann ich diese Funktionalität aus C heraus nutzen ?

Danke im Voraus.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 30 Nov 2006, 12:54 
Offline
Rubyist

Registriert: 26 Apr 2006, 21:35
Beiträge: 366
Hi,

das geht wohl ab ruby 1.7 mit rb_proc_new.
Wobei die signatur laut c.l.ruby.general so aussieht


1
2

VALUE rb_proc_new (VALUE (*)(ANYARGS) func,VALUE val)


Ich habs selbst noch nicht benutzt kann dir also keine weiteren tipps geben.
Sieht aber recht intuitiv aus, du übergibst eben nen functionpointer.

Siehe auch rb_proc_new

greets

_________________



 callcc{|xx| callcc{|yy| lambda{|zz| zz}[yy]}[xx]}["Love Ruby but adore Scheme"]

Solve it once, adapt it to your needs => Schnipsel


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 30 Nov 2006, 14:36 
Offline
Geselle

Registriert: 02 Nov 2006, 17:55
Beiträge: 103
Wohnort: Erfurt
Nein, andersherum ich möchte einen Ruby-Block an meine C-Funktion übergeben bekommen und daraus dann ein proc-Objekt machen. Ich habe jetzt versucht das im Code von Ruby-Gnome zu finden, da das dort scheinbar so gemacht wird, ist mir aber nicht gelungen.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 30 Nov 2006, 15:21 
Offline
Geselle

Registriert: 02 Nov 2006, 17:55
Beiträge: 103
Wohnort: Erfurt
Okay,

habs scheinbar raus gefunden, die Funktion heißt einfach rb_block_proc()
erwartet keine Parameter und gibt ein proc (VALUE) zurück.
Es macht aber wirklich keine Spaß in den Ruby Quellen rum zu stochern,
ein paar Kommentare mehr in der api-Dokumentation würden glaube ich
wirklich helfen.

Gruß beyama


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 30 Nov 2006, 18:56 
Offline
Interpreter
Benutzeravatar

Registriert: 02 Jan 2005, 20:15
Beiträge: 1360
Zitat:
ein paar Kommentare mehr in der api-Dokumentation würden glaube ich
wirklich helfen.


Wie wäre es mit Wikis dazu :)

_________________
Retired. Macht es gut!


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 30 Nov 2006, 20:16 
Offline
Geselle

Registriert: 02 Nov 2006, 17:55
Beiträge: 103
Wohnort: Erfurt
Gibt es ein deutschsprachiges Ruby-Wiki wo man so etwas rein packen könnte?
Ich war schon am überlegen eine kleine Doku zu schreiben wenn es bei mir mit Ruby und C etwas flüssiger läuft.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 30 Nov 2006, 20:40 
Offline
Böser Admin
Benutzeravatar

Registriert: 29 Jul 2005, 22:41
Beiträge: 2065
Wohnort: Beijing
beyama hat geschrieben:
Gibt es ein deutschsprachiges Ruby-Wiki wo man so etwas rein packen könnte?
Ich war schon am überlegen eine kleine Doku zu schreiben wenn es bei mir mit Ruby und C etwas flüssiger läuft.

http://www.rubywiki.de

_________________
mruby.sh | Ruby-Mine | Homepage


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 30 Nov 2006, 21:43 
Offline
Interpreter

Registriert: 15 Mär 2005, 19:26
Beiträge: 6142
Wohnort: Karlsruhe
beyama hat geschrieben:
... möchte einen Ruby-Block an meine C-Funktion übergeben bekommen und daraus dann ein proc-Objekt machen.

Irgendwas ist mir dabei noch unklar. Wenn ich, einfach in Ruby geschrieben,

1
2
3
4
5
6
7
8
def myone(&blk)
if block_given?
yield
puts blk.class
blk.call
end
end
myone {puts 'hier ist der Block'}
dieses Progrämmchen schreibe, habe ich in der Methode doch zweierlei Ding.

Zum einen ist das der Block als solcher, den ich mit yield aufrufe. Zum anderen ist es aber das Objekt der Klasse Proc, welches ich mit call aufrufe. Die Ausgabe des Programms zeigt das

1
2
3
hier ist der Block
Proc
hier ist der Block

Ich verstehe das ganze so, dass die Angabe von &blk den Interpreter anweist, dass er die Erzeugung des Proc-Objekts vor dem Aufruf der Methode durchführt.

Wenn die Methode also Ruby-seitig mit einem Parameter der Form &xxx bekannt gemacht wird, müsste doch in der Methode, also auch im C-Programm, ein reines Proc-Objekt auftauchen.

Ist das nicht so?

_________________
WoNáDo.set_state!(:retired)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 30 Nov 2006, 22:55 
Offline
Geselle

Registriert: 02 Nov 2006, 17:55
Beiträge: 103
Wohnort: Erfurt
Also die Frage von WoNáDo verstehe ich nicht ganz.
Ich habe doch gar keine Deklaration in Ruby sondern in C und so wie ich das verstehe weiß der Interpreter das da ein Code-Block übergeben wurde und durch "&xxx" in der Ruby Funktionsdeklaration binde ich den Block als proc-Objekt lediglich an die Variable namens "xxx" ansonsten brauche ich ja "&xxx" gar nicht in die Parameterliste auf zu nehmen und kann einfach nur "yield" aufrufen.
In C mache ich das ganze manuell, z.B in der Form:



1
2
3
4
static VALUE ruby_proc_test(VALUE klass) {
VALUE myproc = rb_block_proc();
return rb_funcall(myproc, rb_intern("call"), 0);
}


Das mit dem Wiki ist ulkig ich habe wegen Ruby und C fast mehr Zeit mit Google als mit programmieren verbracht, aber auf www.rubywiki.de bin ich noch nicht gestoßen. Werde mich mal nächste Woche ein bisschen daran auslassen. Scheint ja leider nicht so aktiv genutzt zu werden(?).


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 01 Dez 2006, 00:27 
Offline
Interpreter

Registriert: 15 Mär 2005, 19:26
Beiträge: 6142
Wohnort: Karlsruhe
beyama hat geschrieben:
"&xxx" in der Ruby Funktionsdeklaration binde ich den Block als proc-Objekt lediglich an die Variable namens "xxx"

Das meinte ich ja.

1
2
3
4
5
6
7
8
9
def myone(prc, &blk)
if block_given?
yield
puts blk.class
blk.call
end
prc.call
end
myone(proc{puts 'hier ist die proc'}) {puts 'hier ist der Block'}
gibt

1
2
3
4
hier ist der Block
Proc
hier ist der Block
hier ist die proc

In der Methode ist es doch egal, ob das mal ein Block oder ein explizites Proc-Objekt ist.

Ich glaube, ich habe da irgendwas am Ziel nicht verstanden. Eine Umwandlung des Blockes in ein Proc-Objekt muss doch nicht im Rahmen des C-Codes gemacht werden, wenn der Parameter in der Form "&xxx" vorliegt?

Das ist übrigens eine Frage, weil ich bisher noch nicht C-Erweiterungen zum laufen gebracht habe (Windows und immer irgendwelches Theater mit nicht zusammenpassenden Versionen von OneClickInstaller und C-Compiler). Mich interessiert das, weil meine Probleme jetzt mal angegangen werden.

>>>>> EDIT >>>>>

Hat sich wohl erledigt. Ich hatte im Hinterkopf, dass ich bei einer C-Implementierung einer Ruby-Methode eine Art Ruby-Prototype deklarieren muss. Das scheint ja so nicht zu sein.

_________________
WoNáDo.set_state!(:retired)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 01 Dez 2006, 12:06 
Offline
Geselle

Registriert: 02 Nov 2006, 17:55
Beiträge: 103
Wohnort: Erfurt
WoNáDo hat geschrieben:
Ich hatte im Hinterkopf, dass ich bei einer C-Implementierung einer Ruby-Methode eine Art Ruby-Prototype deklarieren muss. Das scheint ja so nicht zu sein.


Naja, schon aber halt in C in der Form:




rb_define_method(rb_cMeine_klasse, "methoden_name_in_ruby", name_der_c_funktion, anzahl_der_argumente_als_int);


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 03 Dez 2006, 14:59 
Offline
Interpreter

Registriert: 15 Mär 2005, 19:26
Beiträge: 6142
Wohnort: Karlsruhe
Hatte jetzt endlich mal Zeit das ein bisschen intensiver anzuschauen.

Das hat jetzt zwar nicht aktuell mit der Lösung des Problems zu tun (das ist ja gelöst), könnte aber in einen Änderungswunsch für das API münden.

Ich habe den Eindruck gewonnen, dass hier ein kleines Design-Problem in Ruby vorliegt. Ich finde, dass für rb_define_method eigentlich eine Möglichkeit angebbar sein müsste, die dem &xyz in Ruby entspricht.

Der Interpreter versorgt doch beim Aufruf einer Methode die in der Definition vorgegebenen Parameter mit entsprechenden Werten. Das funktioniert ja auf diese Art und Weise auch für alle normalen Parameter, wenn die Methode (beispielsweise) in C geschrieben ist.

Ich bin der Meinung, dass eine Erweiterung von rb_define_method um eine entsprechende Möglichkeit angemessen ist.

Wie seht Ihr das?

_________________
WoNáDo.set_state!(:retired)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 04 Dez 2006, 05:07 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
[verschoben]

bitte solche dinge demnächst gleich ins Core-Forum!

_________________
Ruby-Mine | (almost) murphy.de | rubychan.de


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 04 Dez 2006, 10:01 
Offline
Geselle

Registriert: 02 Nov 2006, 17:55
Beiträge: 103
Wohnort: Erfurt
WoNáDo hat geschrieben:
Ich habe den Eindruck gewonnen, dass hier ein kleines Design-Problem in Ruby vorliegt. Ich finde, dass für rb_define_method eigentlich eine Möglichkeit angebbar sein müsste, die dem &xyz in Ruby entspricht.


Ich bin mir nicht sicher ob das nicht die Handhabbarkeit der Funktion rb_define_method verschlechtern würde, immerhin muss ich ja nur einen Aufruf machen um das proc-Objekt zu bekommen. Mir viele da nichts ein außer man erweitert die Methode um noch einen Parameter.

Aber mal eine andere Frage die hier auch nicht mehr so ganz hingehört.
Ich habe jetzt einige Zeit gebraucht um das mit dem proc in C heraus zu finden und habe dann den eventhändler meiner Klasse um geschrieben, um dann fest zu stellen das sich procObject.arity() nicht so verhält wie es in der Doku steht, es gibt -1 zurück wenn die proc-Methode keine Parameter
erwartet, so kann ich also nicht sinnvoll überprüfen ob die Methode die bei einem Event aufgerufen
werden soll überhaupt genug Parameter entgegen nimmt. Die Frage: Passiert es bei Ruby (1.8.5) öfter das Doku und Realität so weit auseinander liegen?
Ich frage weil meine Erfahrung mit Ruby nicht über mein aktuelles Projekt hinaus reicht.


Zuletzt geändert von beyama am 04 Dez 2006, 10:38, insgesamt 1-mal geändert.

Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 04 Dez 2006, 10:28 
Offline
Interpreter

Registriert: 15 Mär 2005, 19:26
Beiträge: 6142
Wohnort: Karlsruhe
Hast Du eventuell die Methode so deklariert, dass sie eine flexible Anzahl Parameter entgegen nehmen kann (auch Null)?

_________________
WoNáDo.set_state!(:retired)


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

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:
cron