(xem nỗ lực cá nhân rất yêu thích của tôi - C++ cách tiếp cận chính thức vào cuối câu trả lời này)
Ngôn ngữ Một
Objective-C nhưng cú pháp gọi là [nhắn đối tượng] như vậy sẽ trông như:
int dist = [cities distanceFrom:cityA to:cityB];
nếu bạn đã xác định distanceFromto
chức năng như thế này, trong một thành phố phản đối:
- (int)distanceFrom:(City *)cityA to:(City *)cityB
{
// find distance between city A and city B
// ...
return distance;
}
Ngôn ngữ Hai
Tôi cũng nghi ngờ bạn có thể đạt được một cái gì đó rất gần với điều này trong IO Language nhưng tôi chỉ nhìn vào nó. Bạn cũng có thể muốn đọc về nó so với các ngôn ngữ khác trong Seven Languages in Seven Weeks có một số free excerpt về IO.
Ngôn ngữ Ba
Có một thành ngữ ("chaining") trong C++ nơi bạn trở về đối tượng tạm thời hoặc đối tượng hiện nay được sử dụng để thay thế đối số từ khóa, theo The Design and Evolution of C++ và trông như thế này:
int dist = distanceFrom(cityA).to(cityB);
nếu bạn đã xác định distanceFrom
chức năng như thế này, với một đối tượng trợ giúp nhỏ. Lưu ý rằng các hàm nội tuyến làm cho loại điều này biên dịch thành mã rất hiệu quả.
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, tôi đã vội vàng trước đó, nhận ra tôi có thể cấu trúc để chỉ cần sử dụng một đối tượng tạm thời để cung cấp cho các cú pháp giống nhau:
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 và đây là một thậm chí cảm hứng hơn Phiên bản C++ cho phép bạn viết
int dist = distanceFrom cityA to cityB;
hoặc thậm chí
int dist = distanceFrom cityA to cityB to cityC;
dựa trên sự kết hợp tuyệt vời C++ ish của #define và các lớp:
#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;
};
LƯU Ý này có thể trông giống như một bài tập vô dụng nhưng trong một số tình huống nó có thể rất hữu ích để cho mọi người một miền -specific language trong C++ mà chúng biên dịch cùng với các thư viện. Chúng tôi đã sử dụng cách tiếp cận tương tự với Python cho các nhà khoa học lập mô hình địa lý tại CSIRO.
Bạn có thể cụ thể hơn một chút về điều này sẽ thực hiện được không? – nos
Tôi nghĩ rằng một số cuộc gọi hàm sẽ dễ đọc hơn nhiều như ví dụ 'distanceFromto'. Nhưng tôi đã chỉ tò mò nếu một ngôn ngữ lập trình như vậy cho phép bạn xác định chức năng như vậy tồn tại. –
Tôi nghĩ rằng bạn cần một ví dụ tốt hơn để minh họa những gì bạn đang cố gắng nói bởi vì việc chuyển nhiều giá trị vào một hàm sẽ đạt được điều tương tự và bằng nhau (nếu không rõ ràng) rõ ràng. VÍ DỤ. dist = distanceTừ (cityA, cityB) –