Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#130

AW: Ist Delphi so Bedeutungslos ?

  Alt 15. Feb 2013, 13:29
Vorweg: Ich halte meinen Beitrag für konstruktiv und zum Thema passend, aber falls ein Mod der Meinung ist, dass er das Thema sprengt, dann darf er ihn gerne in einen separaten Thread auslagern.
Eben genau solche Beispiele. Zum Beispiel was du in Delphi hättest machen müssen, aber durch entsprechende Features (also Traits, Duck Typing, Type Inference, etc.) in einer anderen Sprache übersichtlicher oder einfacher hinbekommen hast.
OK. Fangen wir mal mit Type Inference an. Wie sehen anonyme Funktionen in Delphi aus (Beispiel aus der Doku)?
Delphi-Quellcode:
type
  TFuncOfInt = reference to function(x: Integer): Integer;

function MakeAdder(y: Integer): TFuncOfInt;
begin
  Result := function(x: Integer)
    begin
      Result := x + y;
    end;
end;
Bitte was? Eigentlich ist das Konzept auch dazu gedacht, Code kürzer und pregnanter schreiben zu können. Aber das ist ja mal gelinde gesagt größtenteils Code Noise. Mit Inferer könnte das ganze logisch völlig äquivalent (und nach wie vor typsicher) z.B. so aussehen:
Delphi-Quellcode:
function MakeAdder(y: Integer): Integer => Integer;
begin
  Result := x => x + y;
end;
Anonyme Funktionen sind ein gutes Beispiel für das, was ich mit „nicht Pascal-like“ meinte. Ich finde dieses Konstrukt zwar sehr praktisch, wenn ich mit c-artigen Sprachen arbeite, aber IMO lässt sich das mit einer Pascal-Syntax einfach nicht gescheit umsetzen, ohne dass es wie ein Fremdkörper wirkt (das schließt beide obigen Varianten mit ein).

Pascal ist eine sehr explizite Sprache, was sicher daran liegt, dass sie ursprünglich für die Lehre konzipiert wurde. Deshalb schreiben wir in Pascal ja auch „begin“ und „end“ statt „{“ und „}“, Funktionsdeklarationen enthalten (anders als etwa in C) explizit das Wort „function“, Variablendeklarationen sind nur im „var“-Block möglich usw...
Dazu passt so ein Konzept wie lambda-Funktionen einfach nicht, weil der Witz ja gerade darin besteht, Informationen wegzulassen, um den Code zu verschlanken. Das beißt sich mit dem Pascal-Konzept, alles explizit hinzuschreiben.

Ich halte es nicht für sinnvoll, wild Konzepte aus anderen Sprachen in Pascal einzupflanzen. Sprachdesign heißt halt auch, manche Dinge wegzulassen. Bei anderen Sprachen sind wir es doch auch gewohnt, dass sie bestimmte Konzepte zugunsten anderer Konzepte weglassen...

Auch Pascal hatte seinerzeit innovative Konzepte – z.B. gibt es nested functions, weshalb z.B. der Bedarf für anonyme Funktionen gar nicht so groß ist. Man sollte lieber dieses Konzept ausbauen... nested functions sind z.B. wie gemacht für Closures (und die wiederum passen super zum Sichtbarkeitsprinzip von Pascal):

Delphi-Quellcode:
type
  TFuncOfInt = function(x: Integer): Integer;

function MakeAdder(y: Integer): TFuncOfInt;
  function Add(x: integer): Integer;
  begin
    Result := x + y;
  end;
begin
  Result := Add;
end;
Es ist eigentlich naheliegend, aber soweit ich weiß geht es immer noch nicht.

Geändert von Namenloser (15. Feb 2013 um 13:31 Uhr)
  Mit Zitat antworten Zitat