в JavaScript:
function getTopCustomersOfTheYear(howManyCustomers, whichYear) {
// Some code here.
}
getTopCustomersOfTheYear(50, 2010);
в C #:
public List<Customer> GetTopCustomersOfTheYear(int howManyCustomers,
int whichYear)
{
// Some code here
}
List<Customer> customers = GetTopCustomersOfTheYear(50, 2010);
в PHP:
public function getTopCustomersOfTheYear($howManyCustomers, $whichYear)
{
// Some code here
}
$customers = getTopCustomersOfTheYear(50, 2010);
Есть ли какой-нибудь язык, который поддерживает этот синтаксис:
function GetTop(x)CustomersOfTheYear(y)
{
// Some code here
}
returnValue = GetTop(50)CustomersOfTheYear(2010);
Разве это не более семантическая, более читаемая форма написания функции?
Обновление: причина, по которой я задаю этот вопрос, заключается в том, что я пишу статью о новом синтаксисе для нового языка. Однако я подумал, что наличие такого синтаксиса для объявления методов может быть более приятным и более дружественным для разработчиков и уменьшит кривую изучения языка, поскольку он ближе к естественному языку. Я просто хотел знать, была ли эта функция уже рассмотрена или нет.
programming-languages
language-design
syntax
Saeed Neamati
источник
источник
'hello world' indexOf: $o startingAt: 6
илиRectangle width: 100 height: 200
. Кстати, что не так с этим вопросом?returnValue = GetTop(50, CustomersOfTheYear(2010))
что выглядит для меня одинаково читабельным, и на самом деле более гибким / ортогональным. ... и да, это обычный синтаксис.Ответы:
Да и да. Да, есть такой язык, и да, многие люди находят его более читабельным, когда привыкнут к нему.
В Objective-C этот метод будет:
На самом деле это довольно надуманный пример, который не очень хорошо читается, поэтому вот лучший пример из реального кода:
Это прототип для метода, который возвращает новый экземпляр UIColor, используя значения красного, зеленого, синего и альфа. Вы бы назвали это так:
Узнайте больше об именах сообщений с разбросанными параметрами на языке программирования Objective-C .
источник
+colorWithRed:blue:green:alpha:
. Я случайно использовать имена параметров , которые соответствуют методу, но я мог бы так же легко использовалr
,b
,g
иa
. С именованными параметрами, такими как предложения JavaScript, вы будете использовать фактические имена, данные для доступа к значениям. Параметры истинных имен также могут быть заданы в любом порядке, а параметры могут быть необязательными. Так похоже, да, но принципиально отличается.color(r=0xFF,g=0xFF,b=0x55)
илиcolor(b=0x32,r=0x7F,a=.5,g=0xFF)
и так далее. Давайте тогда назовем эти очень именованные параметры . :)Ответ: smalltalk
http://en.wikipedia.org/wiki/Smalltalk
'hello world' indexOf: $o startingAt: 6
это как Java"hello world".indexOfStartingAt(o, 6)
Rectangle width: 100 height: 200
это как Javanew Rectangle(100, 200)
Синтаксис ...
expression word1: parm1 word2: parm2 word3: parm3 ...
Имя вызываемого метода является объединением всех слов.источник
Я считаю, что вы ищете абстракцию под названием " свободный интерфейс (настоящим я поднимаю комментарий, первоначально сделанный @Jesper, к «ответу»). » Этот общий шаблон был успешно реализован во многих языках, из которых Objective-C - только один.
Вот довольно чистый пример:
Вы можете увидеть , как что - то , как это может быть реализовано в Randy Patterson «с Как создать свободный интерфейс» .
Андре Вианна дает краткую историю, а затем обсуждает возможные реализации еще в двух частях статьи, включая множество полезной информации. Вианна указывает на старую идею, с которой я впервые столкнулся в Smalltalk 80, - « каскадирование », которая позволяла отправлять несколько сообщений одному и тому же объекту. Это выглядело так:
Впоследствии каскадирование превратилось в « цепочку методов », где мы « Методы модификаторов Make возвращают хост-объект, так что несколько модификаторов могут быть вызваны в одном выражении ». Позже цепочка методов выросла, чтобы стать свободным интерфейсом. концепцией мы знаем и часто используем сегодня , То, что вы планируете сделать, выглядит очень похоже.
Айенде Рахин обсуждает, как «плавный интерфейс» может существенно отличаться от «цепочки методов», чтобы заслужить свое имя .
Свободные интерфейсы обычно встречаются в некоторых новых инструментах, используемых в поведенчески-ориентированной разработке (BDD), и даже нашли свое применение в NUnit , основном инструменте для модульного тестирования .NET, в своей новой модели Assert на основе ограничений .
Эти основные подходы впоследствии были реализованы на других языках, включая Ruby, Python, C #, Objective-C и Java . Чтобы реализовать нечто подобное, вам нужно изучить идею « замыкания », которая имеет фундаментальное значение для цепочки и беглости.
Возможно, вы можете улучшить эти модели; Вот так мы получаем отличные новые языки. Тем не менее, я верю, что полное понимание цепочки методов и быстрых интерфейсов даст вам отличную отправную точку для развития ваших идей!
источник
function GetTop(x)CustomersOfTheYear(y)
. Это отдельная функция, а не цепочка вызовов двух разных функций.Objective-C делает это. Вот типичный прототип:
Вот как вы называете такой метод:
Objective-C в основном используется с Cocoa для Mac OS X и Cocoa Touch для iOS, но gcc будет создавать код Objective-C практически на каждой платформе, на которой работает gcc.
источник
В Common lisp вы можете определить ключевые аргументы для такой функции:
Функция вызывается так:
В Ada вам не нужно специальное объявление - вы можете вызвать любую процедуру или функцию поочередно, перечислив аргументы по порядку или назвав аргументы следующим образом:
Наконец, библиотека Boost включает слой хаков для добавления этой функции в C ++: http://www.boost.org/doc/libs/release/libs/parameter/doc/html/index.html.
источник
Я не смог найти его название, но есть шаблон проектирования для выполнения чего-то похожего, где вызов функции возвращает новый объект, измененный, как описано. Например:
Он используется не очень часто, потому что ваши данные должны быть очень ортогональными, чтобы избежать неуправляемой сложности под капотом, но могут быть полезны в правильных обстоятельствах.
источник
Python имеет ключевые параметры. Пример определения функции
Пример вызова функции
(Я понимаю, что это не совсем в духе первоначального вопроса, но если параметры ключевого слова в lisp соответствуют требованиям, то сделайте это. Однако в Smalltalk и Objective-C ключевые слова между аргументами действительно являются частью имени функции / поиска .)
источник
Агда имеет миксфиксную запись
Всякий раз, когда функция названа с подчеркиванием, она может быть разделена на две части с аргументом между
источник
Пока не язык программирования как таковой , Cucumber принимает параметры в середине имен функций, которые могут содержать пробелы и должны выглядеть как английский.
Однако «функции» определены в Ruby
источник
В TeX вы можете определять макросы, имеющие «шаблон аргумента», который в основном означает, что ваш протокол вызова бесплатный. Для вашего конкретного примера вы можете использовать
Обратите внимание, что также можно избавиться от
;
если вы согласны играть с регистрами:TeX позволяет вам перенастроить свой лексер, и благодаря
\afterassignment
макросу, который я использовал выше, вы можете использовать встроенные процедуры для лексирования чисел. Это очень полезно для определения очень кратких протоколов вызова. Например, очень вероятно написать макрос TeX, понимающий нотацию Markdown для таблиц.Теперь вы спрашиваете: «Как мне получить доступ к моей базе данных, где хранятся клиенты из TeX?», Но это другой вопрос. :)
В Common lisp определенно можно определить
query
макрос, позволяющий писатьгде getCustomers и OfTheYear интерпретируются как символы. Тогда работа макроса заключается в том, чтобы разобраться в этом. Common lisp превосходен в области читабельности кода (да, я имею в виду!), Потому что система макросов позволяет легко создавать псевдоязыки, настроенные для вашего приложения. (Я думаю, что они называются языками приложений.)
PS: похоже, никто не цитировал C ++. Самое близкое, что вы можете получить (без препроцессора)
хитрость заключается в том, чтобы
getTopCustomers
возвращает ссылку наquery
(или что - нибудь еще) , что также орудияOfTheYear
. Вы можете построить этот пример до небольшого языка запросов, но затем вам нужно определить конечные свойства (возвращая значение) или добавитьfinalise
метод (выполнить поиск и вернуть значение). Если вам это нравится, вы также можете имитировать потоковые контроллеры STL и иметь возможность писать такие вещи, какно это снова идет в направлении языков приложений.
Редактировать: я пропустил @han ответы, которые также цитируют Common Lisp и C ++ (но не TeX!).
источник
В JavaScript или любом другом языке , который поддерживает закрытие, вы можете снискать такую функцию:
источник
var top5Func = getTopCustomersFunc(37);
. «5» вводит в заблуждение, но код работает точно так же, как если бы переменная была названаtop37Func
.Это зависит от вашего определения «языка», но среда тестирования роботизированной конструкции позволяет вам определять ключевые слова таким образом. Из их документации по встроенным аргументам :
Выше объявляется новое ключевое слово (по существу, функция) с именем «select $ {animal} from list», где «$ {animal}» является параметром. Вы называете это как «выбрать кота из списка»
источник
Сообщите 7.
И так далее.
источник
Ключевые слова Common Lisp уже упоминались, но макросы Common Lisp также позволяют это довольно легко:
Это можно затем назвать так:
Однако следует отметить, что условия
from
иat
не соблюдаются. Там должно быть что- то, пропустить их полностью - ошибка, но поскольку макрос просто отбрасывает их, не имеет большого значения, что они за пределами читабельности (что важно):источник
В Clojure обычно используются ключевые аргументы для таких ситуаций, как, например:
(get-customers :top 50 :year 2010)
Аргументы ключевых слов достаточно гибкие, они могут быть необязательными и иметь значения по умолчанию и т. Д.
источник
Вы можете подражать этому в Python. Например,
или даже
источник