auf einer Variable mehrer Operationen ausführen

25/12/2007 - 01:36 von Ludwig Maetzke | Report spam
Hallo,

in der von mir angedachten (statisch getypten) Programmiersprache
gedenke ich zwei Pascal-Konstrukte grundlegend zu überarbeiten:
1)
case myvar
of v1: do block 1;
..
of vn: do block n;
elsecase do block n+1 (* oder otherwise, weiß nicht mehr genau *)
Ich finde es problematisch, daß das Schlüsselwort otherwise zu nicht
mehr nützt als diesem Konstrukt, der Compiler-Bauer case für jeden Typ
von myvar (byte, longint, real, string) implementieren muß und allgemein
keine Pascal-Sprachmittel da sind, mit denen man case selbst basteln kann.
2) with my_rec do
begin
field1:= val1;
field2:=val2;
end
Das Schlüsselwort with ist einfach nicht màchtig genug.
Mein Lösungsansatz für 1) und 2) ist with zu erweitern, daß auf my_rec
mehrere und teilweise beliebige Operationen ausgeführt werden können.
Damit wàre ein Bespiel àhnlich 2) etwa so:
with my_obj do
(# ^.name <- 'leo'; //Wertzweisung an Feld von my_obj
^.age <- 44
^ -> your_obj #) /* my_obj auf your_obj kopieren
(Wertzuweisung anders herum) */
So weit, so gut. Kan hier so compiliert werden, daß my_obj für den
ganzen Block (# ... #) im gleichen Register bleibt?
Heikel würde es bei der Substitution von case (1):
with my_num do
(#
= 1 then (# your_num <- 2; exit #);
= 2 then (# your_num <- 1; exit #);
true_func then your_num <- 0 #) /* otherwise -Zweig mit
trivialer Funktion auf
my_num */
Hier würde if Bedingung ersetzt durch Bedingung, also if fliegt ganz
raus und auf eine 1 (true) oder 0 (false) am Zeilenanfang müßte ein then
oder then .. else folgen - was ist dann bei Wertuweisungen an boolesche
Variable? Weiterhin bedeute ein exit am Ende eines Blocks, daß der
nàchsthöhere Block (hier der with-Block) beendet würde, also hier der
otherwise-Block übersprungen.
Noch nicht ganz zu Ende gedacht das. Ein Smalltalker hier hat sich case
selbst gebastelt - wie? Was sind Eure Ideen für einen
leistungsfàhigeren Ersatz des case-Konstrukts?

Viele Grüße und Frohe Weihnachten,
Ludwig
 

Lesen sie die antworten

#1 ram
25/12/2007 - 02:25 | Warnen spam
Ludwig Maetzke writes:
case myvar
of v1: do block 1;
..
of vn: do block n;
elsecase do block n+1 (* oder otherwise, weiß nicht mehr genau *)
Ich finde es problematisch, daß das Schlüsselwort otherwise zu
nicht mehr nützt als diesem Konstrukt, der Compiler-Bauer case
für jeden Typ von myvar (byte, longint, real, string)



Das sind noch nicht alle. Ein Pascal-Programm kann ja beliebig
viele neue Aufzàhlungstypen definieren und in einer
case-Anweisung verwenden.

implementieren muß und allgemein keine Pascal-Sprachmittel da
sind, mit denen man case selbst basteln kann.



Man kann die case-Anweisung mit »case« »selber basteln«.

2) with my_rec do
begin
field1:= val1;
field2:=val2;
end
Das Schlüsselwort with ist einfach nicht màchtig genug.
Mein Lösungsansatz für 1) und 2) ist with zu erweitern, daß auf my_rec
mehrere und teilweise beliebige Operationen ausgeführt werden können.
Damit wàre ein Bespiel àhnlich 2) etwa so:
with my_obj do
(# ^.name <- 'leo'; //Wertzweisung an Feld von my_obj
^.age <- 44
^ -> your_obj #) /* my_obj auf your_obj kopieren
(Wertzuweisung anders herum) */
So weit, so gut. Kan hier so compiliert werden, daß my_obj für den
ganzen Block (# ... #) im gleichen Register bleibt?



Der Zielprozessor könnte auch eine reine Stapelmaschine ohne
Register sein, so daß die Voraussetzungen dieser Frage im
allgemeinen nicht immer erfüllt sind. Wenn man auf einer
Registermaschine mit n Registern n+1 solcher Blöcke ineinander
verschachtelt, dann wird dies nicht für jeden Block möglich
sein.

Noch nicht ganz zu Ende gedacht das. Ein Smalltalker hier hat
sich case selbst gebastelt - wie? Was sind Eure Ideen für
einen leistungsfàhigeren Ersatz des case-Konstrukts?



Diese Fragen der Programmierung »im Kleinen« sind vielleicht
gar nicht so wichtig, da die hàufigere Herausforderung die
Handhabung großer Projekte ist (Wartung, Skalierung,
Kommunikation mit anderen Beteiligten u.s.w.). Dafür ist
Lesbarkeit wichtiger als Kürze.

Aber für Dich ist es vielleicht interessant, wenn Du dir
einmal die Möglichkeit ansiehst, wann man »$_« in Perl
weglassen kann. Oder die case-Anweisung von Perl 6 (oder Perl
5.10). Überhaupt Perl 5 und Perl 6.

Ähnliche fragen