Любой язык программирования с "странным" вызовом функции? - PullRequest
9 голосов
/ 22 июля 2010

Мне было интересно, есть ли какой-нибудь язык программирования, где вы можете иметь вызовы функций, такие как:

function_name(parameter1)function_name_continued(parameter2);

или

function_name(param1)function_continued(param2)...function_continued(paramN);

Например, вы можете вызвать этот вызов функции:

int dist = distanceFrom(cityA)to(cityB);

если вы определили distanceFromto функцию, подобную этой:

int distanceFrom(city A)to(city B)
{
   // find distance between city A and city B
   // ...
   return distance;
}

Насколько я знаю, в языках программирования C, Java и SML это сделать невозможно.

Вам известен какой-либо язык программирования, который позволяет вам определять и вызывать функции таким образом?

Ответы [ 16 ]

0 голосов
/ 04 августа 2010

Вы можете сделать это в Java , Использовать Шаблон Builder , который появляется в книге Эффективная Java Джошуа Боша (это во второй раз я поместил эту ссылку в SO, я все еще не использовал этот патерн, но выглядит великолепно)

0 голосов
/ 22 июля 2010

Tcl позволяет вам сделать что-то вроде этого:

proc distance {from cityA to cityB} {...}
set distance [distance from "Chicago IL" to "Tulsa OK"]

Я не уверен, что это именно то, о чем ты думаешь.

0 голосов
/ 22 июля 2010

Вы можете сделать это в Scheme или LISP, используя макросы.

Форма будет выглядеть примерно так:

(DISTANCE-FROM city-a TO city-b)

Символы в верхнем регистре обозначают синтаксис.

Вы могли бы даже сделать что-то вроде «именованных параметров»:

(DISTANCE TO city-a FROM city-b)
(DISTANCE FROM city-a TO city-b)
0 голосов
/ 22 июля 2010

В SML вы можете просто сделать «to» некоторое значение (например, единицу измерения) и «distanceFrom» карри-функцию, которая принимает три параметра. Например:

val to = ()
fun distanceFrom x _ y = (* implementation function body *)

val foo = distanceFrom cityA to cityB

Вы также можете воспользоваться тем фактом, что SML не применяет соглашения об именах для конструкторов типов данных (к большому раздражению многих людей), поэтому, если вы хотите убедиться, что система типов применяет ваш собственный синтаксис:

datatype comp = to

fun distanceFrom x to y = (* implementation *)

val foo = distanceFrom cityA to cityB (* works *)
val foo' = distanceFrom cityA cityB (* whoops, forgot 'to' - type error! *)
0 голосов
/ 22 июля 2010

Вы можете использовать функцию-член для этого.

cityA.distance_to(cityB);

Это допустимый код на C ++, C (с небольшой настройкой), C #, Java.Используя цепочки методов, вы можете сделать:

cityA.something(cityB).something(cityC).something(cityD).something(cityE);
0 голосов
/ 22 июля 2010

Это похоже на перегрузку функции (C ++ / C #) / параметры по умолчанию (VB).

Параметры по умолчанию позволяют человеку, определяющему функцию, устанавливать значения по умолчанию для последних параметров:

напримерc # перегрузка:

int CalculateDistance(city A, city B, city via1, city via2) 
{....}

int CalculateDistance(city A, city B) 
{
  return CalculateDistance(city A, city B, null, null)
}
...