in JavaScript:
function getTopCustomersOfTheYear(howManyCustomers, whichYear) {
// Some code here.
}
getTopCustomersOfTheYear(50, 2010);
in C #:
public List<Customer> GetTopCustomersOfTheYear(int howManyCustomers,
int whichYear)
{
// Some code here
}
List<Customer> customers = GetTopCustomersOfTheYear(50, 2010);
in PHP:
public function getTopCustomersOfTheYear($howManyCustomers, $whichYear)
{
// Some code here
}
$customers = getTopCustomersOfTheYear(50, 2010);
Gibt es eine Sprache, die diese Syntax unterstützt:
function GetTop(x)CustomersOfTheYear(y)
{
// Some code here
}
returnValue = GetTop(50)CustomersOfTheYear(2010);
Ist es nicht eine semantischere, lesbarere Form, eine Funktion zu schreiben?
Update: Der Grund für diese Frage ist, dass ich einen Artikel über eine neue Syntax für eine neue Sprache schreibe. Ich dachte jedoch, dass eine solche Syntax zum Deklarieren von Methoden für Entwickler angenehmer und benutzerfreundlicher sein könnte und die Lernkurve der Sprache verringern würde, da sie der natürlichen Sprache näher kommt. Ich wollte nur wissen, ob diese Funktion bereits in Betracht gezogen wurde oder nicht.
programming-languages
language-design
syntax
Saeed Neamati
quelle
quelle
'hello world' indexOf: $o startingAt: 6
oder verwendeteRectangle width: 100 height: 200
. Übrigens, was ist mit dieser Frage los?returnValue = GetTop(50, CustomersOfTheYear(2010))
die sieht für mich gleich gut lesbar und eigentlich flexibler / orthogonaler aus. ... und ja, es ist ganz normale Syntax.Antworten:
Ja und ja. Ja, es gibt eine solche Sprache, und viele Leute finden sie besser lesbar, wenn sie sich daran gewöhnt haben.
In Objective-C wäre die Methode:
Das ist eigentlich ein ziemlich ausgeklügeltes Beispiel, das nicht sehr gut liest. Deshalb hier ein besseres Beispiel aus aktuellem Code:
Dies ist der Prototyp einer Methode, die eine neue UIColor-Instanz mit den Werten Rot, Grün, Blau und Alpha zurückgibt. Sie würden es so nennen:
Weitere Informationen zu Nachrichtennamen mit eingestreuten Parametern finden Sie in der Objective-C-Programmiersprache .
quelle
+colorWithRed:blue:green:alpha:
. Ich war zufällig Namen für die Parameter zu verwenden, die die Methode übereinstimmen, aber ich konnte so leicht verwendet haber
,b
,g
, unda
. Bei benannten Parametern wie JavaScript-Angeboten würden Sie die tatsächlichen Namen verwenden, um auf die Werte zuzugreifen. True Names-Parameter können normalerweise auch in beliebiger Reihenfolge angegeben werden, und Parameter können optional sein. So ähnlich, ja, aber grundlegend anders.color(r=0xFF,g=0xFF,b=0x55)
odercolor(b=0x32,r=0x7F,a=.5,g=0xFF)
so. Nennen wir diese sehr benannten Parameter . :)Antwort: Smalltalk
http://en.wikipedia.org/wiki/Smalltalk
'hello world' indexOf: $o startingAt: 6
ist wie bei Java"hello world".indexOfStartingAt(o, 6)
Rectangle width: 100 height: 200
ist wie bei Javanew Rectangle(100, 200)
Die Syntax lautet ...
expression word1: parm1 word2: parm2 word3: parm3 ...
Der Name der aufgerufenen Methode ist die Verkettung aller Wörter.quelle
Ich glaube, Sie suchen nach der Abstraktion " Fluent Interface" (ich möchte hiermit einen Kommentar, der ursprünglich von @Jesper verfasst wurde, zu einer "Antwort" machen). Dieses jetzt übliche Muster wurde erfolgreich in vielen Sprachen implementiert, von denen Objective-C nur eine ist.
Hier ist ein ziemlich sauberes Beispiel:
Sie können sehen , wie so etwas kann in realisiert werden Randy Patterson ‚s Wie eine fließend Schnittstelle zu entwerfen .
Andre Vianna gibt einen kurzen Überblick und erläutert mögliche Implementierungen in zwei weiteren Teilen des Artikels, einschließlich zahlreicher nützlicher Informationen. Vianna verweist auf die alte Idee, die ich zum ersten Mal in Smalltalk 80 mit der Bezeichnung " Cascading " ( Kaskadierung ) kennengelernt habe und die das Senden mehrerer Nachrichten an dasselbe Objekt ermöglichte. Es sah so aus:
Die Kaskadierung entwickelte sich in der Folge zu einer „ Methodenverkettung “, bei der „ Modifikatormethoden das Hostobjekt zurückgeben, so dass mehrere Modifikatoren in einem einzigen Ausdruck aufgerufen werden können. “ Die Methodenverkettung wurde später zu dem fließenden Schnittstellenkonzept , das wir heute häufig kennen und verwenden . Was Sie vorhaben, sieht sehr ähnlich aus.
Ayende Rahien erörtert, wie sich "fließende Benutzeroberfläche" deutlich genug von "Methodenverkettung" unterscheiden kann, um seinen eigenen Namen zu verdienen .
Fließende Schnittstellen sind häufig in einigen der neuen Tools zu finden, die in der verhaltensgesteuerten Entwicklung (BDD) verwendet werden, und haben sogar in NUnit , einem wichtigen .NET-Unit-Testing-Tool, in seinem neuen Constraint-Based-Assert-Modell Einzug gehalten .
Diese grundlegenden Ansätze wurden anschließend in anderen Sprachen implementiert, einschließlich Ruby, Python, C #, Objective-C und Java . Um etwas Ähnliches zu implementieren, sollten Sie sich mit der Idee des " Abschlusses " befassen , die für Verkettung und Sprachgewandtheit von grundlegender Bedeutung ist.
Vielleicht können Sie diese Modelle verbessern; So bekommen wir großartige neue Sprachen. Dennoch glaube ich, dass ein umfassendes Verständnis der Methodenverkettung und der fließenden Schnittstellen Ihnen einen guten Ausgangspunkt für die Weiterentwicklung Ihrer Ideen bietet!
quelle
function GetTop(x)CustomersOfTheYear(y)
. Dies ist eine einzelne Funktion, nicht verkettete Aufrufe an zwei verschiedene Funktionen.Objective-C macht das. Hier ist ein typischer Prototyp:
So rufen Sie eine solche Methode auf:
Objective-C wird hauptsächlich mit Cocoa für Mac OS X und Cocoa Touch für iOS verwendet, aber gcc erstellt Objective-C-Code auf nahezu jeder Plattform, auf der gcc funktioniert.
quelle
In Common lisp können Sie Schlüsselwortargumente für eine Funktion wie die folgende definieren:
Die Funktion heißt so:
In Ada brauchen Sie keine spezielle Deklaration - Sie können jede Prozedur oder Funktion alternativ aufrufen, indem Sie die Argumente der Reihe nach auflisten oder die Argumente wie folgt benennen:
Schließlich enthält die Boost-Bibliothek eine Reihe von Hacks, um die Funktion zu C ++ hinzuzufügen: http://www.boost.org/doc/libs/release/libs/parameter/doc/html/index.html
quelle
Ich konnte den Namen nicht finden, aber es gibt ein Entwurfsmuster, um etwas Ähnliches zu erreichen, bei dem ein Funktionsaufruf ein neues Objekt zurückgibt, das wie beschrieben geändert wurde. Beispielsweise:
Es wird nicht sehr oft verwendet, da Ihre Daten sehr orthogonal sein müssen, um eine unüberschaubare Komplexität unter der Haube zu vermeiden, kann aber unter den richtigen Umständen nützlich sein.
quelle
Python hat Schlüsselwortparameter. Funktionsdefinitionsbeispiel
Funktionsaufruf Beispiel
(Ich verstehe, dass dies nicht ganz im Sinne der ursprünglichen Frage ist, aber wenn sich Schlüsselwortparameter in lisp qualifizieren, tun Sie dies auch. In Smalltalk und Objective-C sind die Schlüsselwörter zwischen den Argumenten jedoch wirklich Teil des Funktionsnamens / der Funktionssuche .)
quelle
Agda hat Mixfix-Notation
Wenn die Funktion mit einem Unterstrich benannt wird, kann sie mit einem dazwischen liegenden Argument in zwei Teile geteilt werden
quelle
Während keine Programmiersprache per se , Gurke nimmt Parameter in der Mitte der Funktionsnamen, die Leerzeichen enthalten können und wie Englisch aussehen soll.
Die 'Funktionen' sind jedoch in Ruby definiert
quelle
In TeX können Sie Makros mit einem „Argumentmuster“ definieren, was im Grunde bedeutet, dass Ihr Aufrufprotokoll frei ist. Für Ihr spezielles Beispiel könnten Sie verwenden
Beachten Sie, dass es auch möglich ist, das loszuwerden,
;
wenn Sie damit einverstanden sind, mit Registern zu spielen:Mit TeX können Sie den Lexer neu konfigurieren, und dank des oben verwendeten
\afterassignment
Makros können Sie integrierte Prozeduren verwenden, um Zahlen zu lexen. Es ist sehr nützlich, sehr knappe Aufrufprotokolle zu definieren . Zum Beispiel ist es sehr plausibel, TeX-Makros zu schreiben, die die Markdown-Notation für Tabellen verstehen.Nun fragen Sie: "Wie greife ich auf meine Datenbank zu, in der Kunden von TeX gespeichert werden?", Aber dies ist eine andere Frage. :)
In Common lisp ist es definitiv möglich, ein
query
Makro zu definieren , mit dem Sie schreiben könnenDabei werden getCustomers und OfTheYear als Symbole interpretiert. Es ist dann die Aufgabe des Makros, einen Sinn daraus zu machen. Common lisp eignet sich hervorragend für die Lesbarkeit von Code (ja, ich meine es ernst!), Da das Makrosystem die einfache Erstellung von Pseudosprachen ermöglicht, die auf Ihre Anwendung abgestimmt sind. (Ich denke, sie heißen Anwendungssprachen.)
PS: Es scheint, dass niemand C ++ zitiert. Die nächste, die Sie (ohne den Präprozessor) erhalten können, ist
Der Trick besteht darin,
getTopCustomers
einen Verweis aufquery
(oder irgendetwas anderes) zurückgeben zu lassen, der auch implementiert wirdOfTheYear
. Sie können dieses Beispiel auf eine kleine Abfragesprache aufbauen, müssen dann aber die endgültigen Eigenschaften identifizieren (einen Wert zurückgeben) oder einefinalise
Methode hinzufügen (die Suche durchführen und den Wert zurückgeben). Wenn Sie Lust dazu haben, können Sie auch Stream-Controller der STL imitieren und Dinge wie schreibendies geht aber wieder in richtung anwendungssprachen.
Edit: Ich habe @han Antworten übersehen, die auch Common Lisp und C ++ (aber nicht TeX!) Zitieren.
quelle
In JavaScript oder einer anderen Sprache, die Closures unterstützt, können Sie eine Funktion wie diese curry :
quelle
var top5Func = getTopCustomersFunc(37);
. Die '5' ist hier irreführend, aber der Code funktioniert genauso, als ob die Variable benannt worden wäretop37Func
.Dies hängt von Ihrer Definition von "Sprache" ab. Mit dem Testframework von robotframework können Sie jedoch Schlüsselwörter auf diese Weise definieren. Aus ihrer Dokumentation zu eingebetteten Argumenten :
Das obige deklariert ein neues Schlüsselwort (im Wesentlichen eine Funktion) mit dem Namen "select $ {animal} from list", wobei '$ {animal}' ein Parameter ist. Sie nennen es "Katze aus Liste auswählen"
quelle
7 informieren.
Und so weiter.
quelle
Die Schlüsselwörter von Common Lisp wurden bereits erwähnt, aber die Makros von Common Lisp ermöglichen dies auch ziemlich einfach:
Das kann man dann so nennen:
Eine Sache, die zu beachten ist, ist, dass die Bedingungen
from
undat
nicht durchgesetzt werden. Es muss etwas da sein, sie komplett zu überspringen ist ein Fehler, aber da das Makro sie einfach verwirft, ist es unwichtig, was sie nicht lesbar sind (was wichtig ist):quelle
In Clojure werden häufig Schlüsselwortargumente für Situationen wie diese verwendet, z.
(get-customers :top 50 :year 2010)
Schlüsselwortargumente sind ziemlich flexibel, sie können optional sein und Standardeinstellungen usw. haben.
quelle
Sie können dies in Python emulieren. Beispielsweise,
oder auch
quelle