Schrift
[thread]11322[/thread]

Gültigkeit von Variablen... oder so etwas. (Seite 3)

Leser: 13


<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten
KurtZ
 2008-02-22 13:13
#106237 #106237
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
murphy+2008-02-21 23:07:05--
Wenn ich mal zu viel Zeit habe, könnte ich das vielleicht in Perl in CPS umschreiben und ins Wiki stellen...


ups mach dir da bitte keine Mühe :-) Ich dachte wenn es schon in Perl6 abgebildet werden soll, dann gibts auch irgendwo Anwendungsbeispiel zum Verlinken.

Wie soll der Syntax in Perl6 dazu aussehen? Konnte im Twiki keinen Hinweis auf CPS finden.
TMTOWTDYOG (there's more than one way to dig your own grave)
murphy
 2008-02-22 18:57
#106268 #106268
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@KurtZ: Ich habe gerade mal im Netz herumgesucht und auch nichts zum Thema Continuations in Perl6 gefunden. Ich bin mir zwar recht sicher, dass Parrot Continuations unterstützen soll, aber vielleicht doch nicht Perl6 – Parrot ist schließlich eine generelle VM, die nicht nur zur Ausführung von Perl gedacht ist…
When C++ is your hammer, every problem looks like your thumb.
KurtZ
 2008-02-23 00:00
#106273 #106273
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
@murphy: im Zusammenhang zu parrot habe ich auch bisher nur von Compilerstrategien gehört, die Parameterübergabe Stackless und effizienter zu machen.

Noch ne Frage, ich bin auf ne Seite gestoßen wo CPS so verstanden wurde, dass der Rücksprungpointer genau hinter dem Aufruf war, das hieße das Verhalten von gewohnten Subroutinen würde so transparent abgebildet, ohne den Stack zu nutzen.

Meine Verständnisprobleme rührten bisher auch daher dass ich diese natürliche Anwendung ausgeschlossen habe, ist IMHO in Perl5 auch nicht ohne weiteres zu realisieren:

Folgendes scheitert nämlich leider
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
our $\="\n";

sub test {
        print "Entering test";
        @_=("Back");
        goto &tsub;
  Back:
        print "Back to test";
}

sub tsub  {
        my $label=shift;
        print "Entering tsub";
        goto $label
}

test();

(Problem: Goto-Label müssen im gleichen Scope sein)

Meine Frage, unterstützen Scheme-Syntax (oder andere Sprachen) das optional (oder sogar per Default) ohne explizites Labeling? Dann ließe sich CPS ja auch von Anfängern mit dem gewohnten Jump-Subroutine Muster verwenden.

EDIT: In einem Perl6 Artikel erwähnt Chromatic Continuation als Feature, verlinkt aber dabei nur die en.wikipedia -Seite! http://www.perl.com/pub/a/2006/01/12/what_is_perl_6.html?page=2
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-02-23 01:34
#106278 #106278
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
murphy+2008-02-21 16:06:57--
Es gibt ein paar Webframeworks, die Continuations oder Techniken mit vergleichbarem Effekt einsetzen, um die asynchrone, anfragegesteuerte Natur einer Webanwendung zu verschleiern und dem Programmierer mehr das Gefühl eines linearen, interaktiven Programmablaufes zu geben. Für Perl existiert beispielsweise CPAN:Continuity,


Hier ein schönes Beispiel um das zu verdeutlichen
http://continuity.tlt42.org/AddTwo_Example

Allerdings braucht sich der Anwender nicht wirklich mit CPS auseinandersetzen, die wirkt usnichtbar im Hintergrund.

OK ich verstehs immer besser, in ner Statemachine müsste ich die Statiwechsel auf dem Papier planen und dann in ner Tabelle coden (hier für mein Wikibeispiel)

Code (perl): (dl )
1
2
3
4
5
6
7
#  Current        Inputs          Next       Action
$next{'INIT'}   {'create'}    = ['EDIT',    sub { } ];
$next{'SAVE'}   {'edit'}      = ['EDIT',    sub { } ];
$next{'PREVIEW'}{'edit'}      = ['EDIT',    sub { } ];
$next{'PREVIEW'}{'save'}      = ['SAVE',    sub { } ];
$next{'EDIT'}   {'preview'}   = ['PREVIEW', sub { } ];
$next{'EDIT'}   {'save'}      = ['SAVE',    sub { } ];


Ein Vorteil von CPS ist, ich schreibe ein Programm voller Subroutinen, deren Sprungbefehle die Statiwechsel repräsentieren. Die Statemachine wird so implizit realisiert und lässt sich noch intuitiv erweitern und testen, während die Tabellendarstellung schon unübersichtlich wird. Nette Idee! :)
TMTOWTDYOG (there's more than one way to dig your own grave)
lichtkind
 2008-02-23 02:02
#106279 #106279
User since
2004-03-22
5708 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
Kurtz: was genau willst du in perl 6 übersetzt sehen?
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
KurtZ
 2008-02-23 02:58
#106280 #106280
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
@Lichtkind: Naja, wie weiter oben gesagt "Mir fehlt aber noch ein kleines konkretes Beispiel, wie ich ein Konzept intuitiver in CPS umsetze. Gerne auch in Perl6 oder Javascript (scheme, lisp udn haskell kann ich leider nicht)".

Wenn dieses Konzept in Perl6 unterstützt wird, dann sollte es auch entsprechenden Syntax und Beispielanwendungen geben.

Eine konkrete Aufgabenstellung kann ich dir nicht geben.
TMTOWTDYOG (there's more than one way to dig your own grave)
murphy
 2008-02-23 03:53
#106281 #106281
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
KurtZ+2008-02-22 23:00:56--
[...]
Meine Frage, unterstützen Scheme-Syntax (oder andere Sprachen) das optional (oder sogar per Default) ohne explizites Labeling? Dann ließe sich CPS ja auch von Anfängern mit dem gewohnten Jump-Subroutine Muster verwenden.
[...]


Naja, in Scheme muss man wie in Rhino nicht selber CPS schreiben, weil die Sprache nativ Continuations unterstützt. Einen goto Befehl kennt das Scheme allerdings gar nicht. Man würde ganz normale Subroutinendefinitionen und -aufrufe hinschreiben und an den Stellen, wo man auf die aktuelle Continuation zugreifen will, die Funktion call-with-current-continuation benutzen, welche in CPS so definiert werden könnte:
Code (perl): (dl )
1
2
3
4
sub call_with_current_continuation(&&) {
  my ($rc, $proc) = @_;
  @_ = ($rc, $rc); goto &$proc;
}


Der Compiler kümmert sich dann darum, dass das ganze Programm in der Lage ist, an jeder Stelle jede beliebige Continuation aufzurufen. Oft geschieht das dadurch, dass einfach alles in CPS transformiert wird.
When C++ is your hammer, every problem looks like your thumb.
KurtZ
 2008-02-23 04:56
#106282 #106282
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
@Murphy: Ok verstehe ich dich richtig, in Scheme gibts bei der Definition keinen syntaktischen Unterschied zwischen einer "normalen" Routine und einer Continuation, alleine die Form des Aufrufs entscheidet wie sich die Routine verhält?

Bei einem "normalen" Aufruf kehrt sie automatisch an die Stelle des Aufrufs zurück ?

(Ich vermute mal Scheme hat keinen Aufrufstack, weswegen die Frage eher naiv erscheint)

Das Thema ist spannend, es erinnert mich an Algorithmen die ich seit meinen Assemblerzeiten nicht mehr realisiert habe :)
TMTOWTDYOG (there's more than one way to dig your own grave)
murphy
 2008-02-23 13:41
#106293 #106293
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@KurtZ: In Scheme gibt's bei der Aufrufsyntax keinen Unterschied zwischen Continuations und normalen Subroutinen. Beim Aufruf einer Continuation werden die übergebenen Parameter zu den Rückgabewerten des Funktionsaufrufes zu dem die Continuation gehört und das Programm fährt auch an dieser Stelle fort. Definieren muss man Continuations überhaupt nicht, weil sie automatisch intern für jeden Funktionsaufruf erzeugt werden und über call-with-current-continuation abgefragt werden können.

Ob Scheme einen Stack hat, oder nicht, ist implementationsspezifisch. Konzeptuell hat die Sprache natürlich schon einen Stack, denn man kann ganz normal Funktionsaufrufe ineinander schachteln. Implementiert wird das ganze aber unter Umständen anders.

Beispiel: Meine Lieblingsimplementation von Scheme ist CHICKEN. Der Compiler übersetzt hier zunächst das ganze Programm in CPS und erzeugt dann für jede Subroutine, die nach der CPS-Transformation entstanden ist, eine C-Funktion. Das resultierende C-Programm ruft nun immer wenn ein Wert aus irgendeiner Funktion zurückgegeben wird oder eine Continuation explizit aufgerufen wird, eine neue C-Funktion auf. Dabei wird natürlich der Stack zugemüllt. Um dem etwas nützliches abzugewinnen, benutzt CHICKEN den Stack jetzt einfach zur Allokation sämtlicher kleinen Objekte und schmeißt dann, wenn er voll wird, den gesamten Stack weg, nachdem alle noch referenzierten Objekte vom Garbagecollector in den Heap transferiert wurden. Damit wird der Stack also lediglich als erste Generation eines generationellen Garbagecollectors benutzt, was in der Regel eine sehr schnelle und effiziente Allokationsstrategie ist.
When C++ is your hammer, every problem looks like your thumb.
KurtZ
 2008-02-23 17:13
#106296 #106296
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Hi Murphy,

habe bis tief in den morgen hinein alles mögliche über Continuations und Coroutines bei -> Squawks of the Parrot nachgeschlagen, und jetzt qualmt mir der Schädel ... :) [1]

Ich denke ich muss mir mal in aller Ruhe das Rhino-Beispiel reinziehen, Scheme ist für mich noch einfach zu transzendental ...

Dank dir
Kurt

[1] Zugegeben ich bin letztendlich in der Soap der "Parrot Post Mortem" Diskussion versumpft.
TMTOWTDYOG (there's more than one way to dig your own grave)
<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten



View all threads created 2008-02-18 13:44.