(vedi il mio impegno personale molto favorito - l'avvicinamento finale C++ alla fine di questa risposta)
Lingua Uno
Objective-C, ma la sintassi di chiamata è [messaggio oggetto] così apparirebbe come:
int dist = [cities distanceFrom:cityA to:cityB];
se hai definito distanceFromto
funzione come questa, entro una città oggetto:
- (int)distanceFrom:(City *)cityA to:(City *)cityB
{
// find distance between city A and city B
// ...
return distance;
}
Lingua Due
Ho anche il sospetto che si potrebbe ottenere qualcosa di molto vicino a questo nel IO Language ma sto solo solo a guardarla. Si consiglia inoltre di leggere su di esso in confronto ad altre lingue in Seven Languages in Seven Weeks che ha un free excerpt su IO.
Lingua Tre
C'è un idioma ("concatenamento") in C++ in cui si ritorna oggetti temporanei o l'oggetto corrente che viene utilizzato per sostituire argomenti a parola chiave, secondo The Design and Evolution of C++ e si presenta così:
int dist = distanceFrom(cityA).to(cityB);
se è stata definita la funzione distanceFrom
in questo modo, con un piccolo oggetto di supporto. Nota che le funzioni inline rendono questo tipo di cosa compilare codice molto efficiente.
class DistanceCalculator
{
public:
DistanceCalculator(City* from) : fromCity(from) {}
int to(City * toCity)
{
// find distance between fromCity and toCity
// ...
return distance;
}
private:
City* fromCity;
};
inline DistanceCalculator distanceFrom(City* from)
{
return DistanceCalculator(from);
}
Duhh, ero di fretta in precedenza, sono reso conto che posso refactoring di utilizzare solo un oggetto temporaneo per dare la stessa sintassi:
class distanceFrom
{
public:
distanceFrom(City* from) : fromCity(from) {}
int to(City * toCity)
{
// find distance between fromCity and toCity
// ...
return distance;
}
private:
City* fromCity;
};
MY FAVORITE ed ecco un ancora più ispirato versione C++ che permette di scrivere
int dist = distanceFrom cityA to cityB;
o addirittura
int dist = distanceFrom cityA to cityB to cityC;
sulla base di una combinazione meravigliosamente C++ ish di #define e classi:
#include <vector>
#include <numeric>
class City;
#define distanceFrom DistanceCalculator() <<
#define to <<
class DistanceCalculator
{
public:
operator int()
{
// find distance between chain of cities
return std::accumulate(cities.begin(), cities.end(), 0);
}
DistanceCalculator& operator<<(City* aCity)
{
cities.push_back(aCity);
return *this;
}
private:
std::vector<City*> cities;
};
NOTA questo può sembrare un esercizio inutile, ma in alcuni contesti può essere molto utile per dare alla gente un dominio -specific language in C++ che compilano insieme alle librerie. Abbiamo utilizzato un approccio simile con Python per gli scienziati di geo-modellizzazione presso il CSIRO.
Potresti essere un po 'più esplicito su cosa potrebbe comportare? – nos
Beh, penso che alcune chiamate di funzione siano molto più facili da leggere come l'esempio 'distanceFromto'. Ma ero solo curioso di sapere se esiste un tale linguaggio di programmazione che consente di definire tale funzione. –
Penso che sia necessario un esempio migliore per illustrare cosa si sta tentando di dire perché il passaggio di più valori in una funzione ottiene la stessa cosa ed è altrettanto (se non più) chiaro. PER ESEMPIO. dist = distanceFrom (cityA, cityB) –