w JavaScript:
function getTopCustomersOfTheYear(howManyCustomers, whichYear) {
// Some code here.
}
getTopCustomersOfTheYear(50, 2010);
w C #:
public List<Customer> GetTopCustomersOfTheYear(int howManyCustomers,
int whichYear)
{
// Some code here
}
List<Customer> customers = GetTopCustomersOfTheYear(50, 2010);
w PHP:
public function getTopCustomersOfTheYear($howManyCustomers, $whichYear)
{
// Some code here
}
$customers = getTopCustomersOfTheYear(50, 2010);
Czy jest jakiś język, który obsługuje tę składnię:
function GetTop(x)CustomersOfTheYear(y)
{
// Some code here
}
returnValue = GetTop(50)CustomersOfTheYear(2010);
Czy nie jest to bardziej semantyczna, bardziej czytelna forma pisania funkcji?
Aktualizacja: Powodem, dla którego zadaję to pytanie, jest to, że piszę artykuł o nowej składni dla nowego języka. Pomyślałem jednak, że taka składnia do deklarowania metod może być przyjemniejsza i bardziej przyjazna dla programistów i zmniejszy krzywą uczenia się języka, ponieważ jest bliższa językowi naturalnemu. Chciałem tylko wiedzieć, czy ta funkcja była już rozważana, czy nie.
programming-languages
language-design
syntax
Saeed Neamati
źródło
źródło
'hello world' indexOf: $o startingAt: 6
lubRectangle width: 100 height: 200
. Przy okazji, co jest nie tak z tym pytaniem?returnValue = GetTop(50, CustomersOfTheYear(2010))
który wydaje mi się równie czytelny, a właściwie bardziej elastyczny / ortogonalny. ... i tak, to zwykła normalna składnia.Odpowiedzi:
Tak i tak. Tak, istnieje taki język i tak, wiele osób uważa go za bardziej czytelny, kiedy się do niego przyzwyczai.
W celu C metoda byłaby następująca:
To właściwie całkiem wymyślony przykład, który nie czyta zbyt dobrze, więc oto lepszy przykład z faktycznego kodu:
To prototyp metody, która zwraca nową instancję UIColor przy użyciu wartości czerwonego, zielonego, niebieskiego i alfa. Nazwałbyś to tak:
Przeczytaj więcej o nazwach wiadomości z przeplatanymi parametrami w The Objective-C Programming Language .
źródło
+colorWithRed:blue:green:alpha:
. Zdarzyło mi się używać nazw parametrów pasujących do metody, ale mogę równie dobrze stosowanyr
,b
,g
, ia
. W przypadku nazwanych parametrów, takich jak oferty JavaScript, można użyć rzeczywistych nazw podanych w celu uzyskania dostępu do wartości. Parametry prawdziwych nazw można zwykle podawać w dowolnej kolejności, a parametry mogą być opcjonalne. Tak podobne, ale zasadniczo inne.color(r=0xFF,g=0xFF,b=0x55)
albocolor(b=0x32,r=0x7F,a=.5,g=0xFF)
i tak dalej. Nazwijmy więc te bardzo nazwane parametry . :)Odpowiedź: smalltalk
http://en.wikipedia.org/wiki/Smalltalk
'hello world' indexOf: $o startingAt: 6
jest jak Java"hello world".indexOfStartingAt(o, 6)
Rectangle width: 100 height: 200
jest jak Javanew Rectangle(100, 200)
Składnia jest ...
expression word1: parm1 word2: parm2 word3: parm3 ...
Nazwa wywoływanej metody jest połączeniem wszystkich słów.źródło
Myślę, że szukasz abstrakcji zwanej „ płynnym interfejsem (niniejszym podnoszę komentarz, pierwotnie autorstwa @Jesper, do„ odpowiedzi ”).” Ten obecnie powszechny wzorzec został z powodzeniem wdrożony w wielu językach, z których cel C jest tylko jeden.
Oto całkiem czysty przykład:
Możesz zobaczyć, jak coś takiego można zaimplementować w Randy Patterson 's How to płynnego interfejsu .
Andre Vianna przedstawia krótką historię, a następnie omawia możliwe wdrożenia w dwóch kolejnych częściach artykułu, w tym wiele przydatnych informacji. Vianna wskazuje na stary pomysł, który pierwszy raz spotkałem w Smalltalk 80, zwany „ kaskadowaniem ”, który umożliwiał wysyłanie wielu wiadomości do tego samego obiektu. Wyglądało to tak:
Kaskadowanie przekształciło się później w „ łączenie metod ”, w którym „ Sprawiamy , że metody modyfikujące zwracają obiekt hosta, dzięki czemu można wywoływać wiele modyfikatorów w jednym wyrażeniu. ” Łańcuch metod później wyrósł, aby stać się płynną koncepcją interfejsu znaną i często używaną dzisiaj . To, co planujesz zrobić, wygląda bardzo podobnie.
Ayende Rahien omawia, w jaki sposób „płynny interfejs” może się znacznie różnić od „tworzenia łańcuchów metod”, aby zasłużyć na swoją własną nazwę .
Płynne interfejsy są powszechnie spotykane w niektórych nowych narzędziach wykorzystywanych w rozwoju opartym na zachowaniu (BDD), a nawet znalazły drogę do NUnit , głównego narzędzia do testowania jednostek .NET, w nowym modelu Assert-Based Based .
Te podstawowe podejścia zostały następnie zaimplementowane w innych językach, w tym Ruby, Python, C #, Objective-C i Java . Aby wdrożyć coś podobnego, będziesz chciał przestudiować ideę „ zamknięcia ”, która jest prawie fundamentalna dla łańcuchów i płynności.
Być może możesz ulepszyć te modele; w ten sposób otrzymujemy świetne nowe języki. Mimo to uważam, że pełne zrozumienie tworzenia łańcuchów metod i płynnych interfejsów da ci świetny punkt wyjścia do rozwijania swoich pomysłów!
źródło
function GetTop(x)CustomersOfTheYear(y)
. Jest to pojedyncza funkcja, a nie powiązane łańcuchowo wywołania dwóch różnych funkcji.Cel C to robi. Oto typowy prototyp:
Oto jak wywołać taką metodę:
Objective-C jest używany głównie z Cocoa dla Mac OS X i Cocoa Touch na iOS, ale gcc zbuduje kod Objective-C na prawie każdej platformie, na której działa gcc.
źródło
W Common lisp możesz zdefiniować argumenty słów kluczowych dla funkcji takiej jak ta:
Funkcja nazywa się tak:
W Adzie nie potrzebujesz specjalnej deklaracji - możesz wywołać dowolną procedurę lub funkcję na przemian, wymieniając argumenty w kolejności lub nazywając takie argumenty:
Wreszcie, biblioteka boost zawiera warstwę włamań, aby dodać funkcję do C ++: http://www.boost.org/doc/libs/release/libs/parameter/doc/html/index.html
źródło
Nie mogłem znaleźć jego nazwy, ale istnieje wzorzec projektowy pozwalający osiągnąć coś podobnego, w którym wywołanie funkcji zwraca nowy obiekt zmodyfikowany zgodnie z opisem. Na przykład:
Nie jest często używany, ponieważ dane muszą być bardzo ortogonalne, aby uniknąć niemożliwej do opanowania złożoności pod maską, ale mogą być przydatne we właściwych okolicznościach.
źródło
Python ma parametry słów kluczowych. Przykład definicji funkcji
Przykład wywołania funkcji
(Rozumiem, że nie jest to zgodne z duchem pierwotnego pytania, ale jeśli parametry słów kluczowych w lisp się kwalifikują, zrób to. W Smalltalk i Objective-C jednak słowa kluczowe między argumentami są tak naprawdę częścią nazwy / wyszukiwania funkcji .)
źródło
Agda ma notację mixfix
Ilekroć funkcja nosi nazwę podkreślenia, można ją podzielić na dwie części z argumentem pomiędzy nimi
źródło
Chociaż nie jest to język programowania per se , ogórek pobiera parametry w środku nazwy funkcji, która może zawierać spacji i są przeznaczone do wyglądać angielskim.
„Funkcje” są jednak zdefiniowane w Ruby
źródło
W TeXie możesz zdefiniować makra posiadające „wzorzec argumentów”, co w zasadzie oznacza, że twój protokół wywoływania jest wolny. Na przykład możesz użyć
Pamiętaj, że możesz się również pozbyć,
;
jeśli zgadzasz się grać z rejestrami:TeX pozwala zmienić konfigurację leksykonu, a dzięki makru,
\afterassignment
którego użyłem powyżej, możesz używać wbudowanych procedur do leksykania liczb. Bardzo przydatne jest zdefiniowanie bardzo zwięzłych protokołów wywoływania. Na przykład bardzo prawdopodobne jest napisanie makr TeX-a, które rozumieją notację Markdown dla tabel.Teraz pytasz „jak uzyskać dostęp do mojej bazy danych, w której przechowywani są klienci z TeXa?”, Ale to kolejne pytanie. :)
W Common Lisp zdecydowanie można zdefiniować
query
makro pozwalające na pisaniegdzie getCustomers i OfTheYear są interpretowane jako symbole. Makro ma zatem sens. Wspólne seplenienie jest doskonałe w dziedzinie czytelności kodu (tak, mam na myśli to!), Ponieważ system makr pozwala łatwo tworzyć pseudo-języki dostrojone dla twojej aplikacji. (Myślę, że są one nazywane językami aplikacji).
PS: Wygląda na to, że nikt nie cytował C ++. Najbliżej można dostać (bez preprocesora)
sztuczka polega na tym, aby pozwolić zwrócić
getTopCustomers
referencjęquery
(lub cokolwiek innego), która również implementujeOfTheYear
. Możesz zbudować ten przykład do małego języka zapytań, ale następnie musisz zidentyfikować właściwości końcowe (zwracając wartość) lub dodaćfinalise
metodę (wykonując wyszukiwanie i zwracając wartość). Jeśli masz na to ochotę, możesz także naśladować kontrolery strumienia STL i mieć możliwość pisania takich rzeczyale to znów idzie w kierunku języków aplikacji.
Edycja: Przeoczyłem odpowiedzi @han, które również cytują Common Lisp i C ++ (ale nie TeX!).
źródło
W JavaScript lub innym języku obsługującym zamknięcia możesz curry taką funkcję:
źródło
var top5Func = getTopCustomersFunc(37);
. „5” wprowadza tutaj w błąd, ale kod działa dokładnie tak samo, jakby zmienna została nazwanatop37Func
.Zależy to od twojej definicji „języka”, ale struktura testowania robotframework pozwala w ten sposób definiować słowa kluczowe. Z ich dokumentacji dotyczącej osadzonych argumentów :
Powyższe deklaruje nowe słowo kluczowe (zasadniczo funkcję) o nazwie „wybierz $ {animal} z listy”, gdzie „$ {animal}” jest parametrem. Nazywasz to jak „wybierz kota z listy”
źródło
Poinformuj 7.
I tak dalej.
źródło
Słowa kluczowe Common Lisp zostały już wspomniane, ale makra Common Lisp również pozwalają na to dość łatwo:
Można to nazwać tak:
Należy jednak zauważyć, że warunki
from
iat
nie są egzekwowane. Coś musi tam być , pomijanie ich całkowicie jest błędem, ale ponieważ makro po prostu je odrzuca, nie ma większego znaczenia, czym są poza czytelnością (co jest ważne):źródło
W Clojure często stosuje się argumenty słów kluczowych w takich sytuacjach, np .:
(get-customers :top 50 :year 2010)
Argumenty słów kluczowych są dość elastyczne, mogą być opcjonalne i mieć określone wartości domyślne itp.
źródło
Możesz to naśladować w Pythonie. Na przykład,
lub nawet
źródło