(私の非常に好きな個人的な努力を参照してください-この回答の最後にある最後のC ++アプローチ)
言語1
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;
}
言語2
また、 IO言語でこれに非常に近い何かを達成できると思いますが、私はそれを見ているだけです。また、IOに関する無料の抜粋があるSevenWeeksのSevenLanguagesの他の言語と比較してそれについて読みたいと思うかもしれません。
言語3
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;
#defineとクラスの素晴らしいC++ishの組み合わせに基づいています。
#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;
};
注これは役に立たない演習のように見えるかもしれませんが、状況によっては、ライブラリと一緒にコンパイルするC++のドメイン固有言語をユーザーに提供すると非常に便利な場合があります。CSIROのジオモデリング科学者には、Pythonで同様のアプローチを使用しました。