(см. Мое самое любимое личное усилие - окончательный подход C ++ в конце этого ответа)
Language One
Objective-C, но синтаксис вызова[объект сообщения] будет выглядеть так:
int dist = [cities distanceFrom:cityA to:cityB];
, если вы определили distanceFromto
функцию, подобную этой, в объекте города:
- (int)distanceFrom:(City *)cityA to:(City *)cityB
{
// find distance between city A and city B
// ...
return distance;
}
Language Two
Я также подозреваю, что вы могли бы достичь чего-то очень близкого к этому в IO Language , но я только смотрю на это.Вы также можете прочитать об этом по сравнению с другими языками в Семи языках за семь недель , в которых есть бесплатный отрывок о IO.
Language Three
В C ++ существует идиома («цепочка»), в которой вы возвращаете временные объекты или текущий объект, который используется для замены аргументов ключевых слов, согласно Проектирование и развитие C ++ и выглядит так:
int dist = distanceFrom(cityA).to(cityB);
, если вы определили distanceFrom
функцию, подобную этой, с небольшим вспомогательным объектом.Обратите внимание, что встроенные функции делают такие вещи компилируемыми в очень эффективный код.
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);
}
Да, я спешил раньше, понял, что могу рефакторинг, чтобы просто использовать временный объект, чтобы дать тот же синтаксис:
class distanceFrom
{
public:
distanceFrom(City* from) : fromCity(from) {}
int to(City * toCity)
{
// find distance between fromCity and toCity
// ...
return distance;
}
private:
City* fromCity;
};
МОЙ ЛЮБИМЫЙ и вот еще более вдохновляющая версия C ++, которая позволяет писать на
int dist = distanceFrom cityA to cityB;
или даже
int dist = distanceFrom cityA to cityB to cityC;
на чудесной комбинации C ++ для #define и классов:
#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;
};
NOTE это может выглядеть бесполезным упражнением, но в некоторых контекстах может быть очень полезно дать людям предметно-ориентированный язык в C ++, который они компилируют вместе с библиотеками.Мы использовали аналогичный подход с Python для ученых геомоделирования в CSIRO.