Использование специальных символов в именах функций

В Ruby стандартным соглашением является использование вопросительного знака в конце имени метода, чтобы указать, что метод возвращает логический результат:

[].empty?   #=> true 

Другое стандартное соглашение состоит в том, чтобы заканчивать имя метода восклицательным знаком, если метод является деструктивным (то есть он изменяет исходные данные):

mylist.sort! # sort mylist in-place

Недавно я видел те же соглашения, используемые в Scheme. Что заставляет меня задаться вопросом, какие другие языки используют/поддерживают это соглашение? Существуют ли какие-либо другие специальные символы, которые обычно используются для именования в этих или других языках?


person Community    schedule 21.10.2009    source источник


Ответы (4)


Ответ, конечно же, зависит от языка (и языковой культуры).

Например, в зависимости от языка подходят все следующие варианты: empty-p, empty?, empty, is_empty или isEmpty. (Эти примеры, конечно, не являются исчерпывающими).

Примеры в исходном вопросе взяты из Ruby, где такое использование? и ! to end имена методов, где это уместно, принимаются. Это признание исходит из 1) легкодоступных терминаторов символов в грамматике 2) использования ? и ! в стандартной библиотеке. Однако следует отметить, что! не используется повсеместно для обозначения «побочного эффекта» и обычно присутствует только в альтернативных формах: save/save!, sort/sort! и т. д. Существует огромное количество методов, выполняющих побочные действия. эффекты, которые не имеют ! префикс.

Лично, если бы я разрабатывал язык, я бы позволил ?, ! и ', чтобы быть допустимыми завершающими символами без кавычек в именах символов. Несмотря на то, что некоторые языки, такие как Scala, допускают полное экранирование символов, таких символов обычно избегают, потому что их неудобно заключать в кавычки для использования.

// in Scala, esp. with Java-compat, the last form is generally used although
// the first two are perfectly valid -- do what makes sense in the language
foo.`empty?`
foo.empty_?
foo.isEmpty

Когда в Риме...

  • Scala - empty? или пустой_? (необычно)
  • C/C++/JS/Java/Python/Perl — нет? или ! в идентификаторах; JS/Java позволяют $; $ — это символ в Perl.
  • C/C++/Perl/JS — руки вверх?
  • C# — IsEmpty (метод или свойство) или Empty (свойство)
  • Python — is_empty или isEmpty согласно Guido-guide (хотя обычно протокол len: if not len(foo): "empty!")
  • Java — isEmpty для руководства по языку
  • Ruby - специальный трейлинг? и ! (цитирую?)
  • JS — косвенный доступ к идентификатору: obj["пусто?"] (не часто для этого)
  • Лисп (обычный): empty-p для предиката; вариации в читателе/цитировании
  • Джулия - добавляется! к функциям, которые изменяют свои аргументы

Рад видеть исправления и/или дополнения - это капля в море.

person Community    schedule 21.10.2009
comment
Помогите помогите! Как я могу превратить нижнюю часть этого поста в вики сообщества? - person ; 21.10.2009
comment
Любой может редактировать ваш пост, так что это вики сообщества. Что ты пытаешься сделать? Я могу включить эти и все остальные комментарии в исходный вопрос верхнего уровня, чтобы был единый список для всех. - person Justin Ethier; 21.10.2009
comment
Желательно просто отредактировать список внизу. Я не был уверен, что это могут редактировать другие. Эта вещь stackoverflow все еще немного нова для меня. - person ; 21.10.2009
comment
в лиспе уже давно используются вопросительные знаки: (если пусто?...). - person 象嘉道; 10.02.2019

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

Вариант ? можно так же легко сделать с чем-то вроде isEmpty(), а вариант ! с sortInPlace().

Английский очень адаптивный язык, даже без знаков препинания.

В любом случае, предпочитаемые мной языки (C и Java) используют пунктуацию для множества других вещей. Наличие их в идентификаторах также превратило бы лексический анализ в кошмар.

person Community    schedule 21.10.2009
comment
Наличие их в идентификаторах также превратило бы лексический анализ в кошмар. Это утверждение просто не соответствует действительности. Хотя я не буду защищать синтаксис Ruby (который не зависит от контекста и имеет много странностей: например, ‹code›a??b:c‹/code›), использование не [a-z_][a-z0-9_ ] не обязательно сложнее запускать через лексер. Рассмотрим Scheme как очень простой контрпример (и Perl, возможно, как главный пример, хотя он НЕ допускает использование специальных символов в идентификаторах). Однако использование таких символов широко открыто для мнений. - person ; 21.10.2009
comment
@user166390 user166390 Ruby имеет более однородную грамматику. Я думаю, что это не зависит от контекста и может быть описано в BNF. C++ требует контекста для разбора и не может быть описан в BNF. Добавление специальных символов к идентификаторам усложнило бы синтаксический анализ, но я согласен, что в принципе синтаксический анализ все еще возможен, возможно, даже быстро, но я думаю, что код для этого будет труден на практике. - person Sqeaky; 31.07.2015

Предварительное «@» к имени метода (или любому идентификатору) в C# позволяет назвать этот метод обычно зарезервированным ключевым словом.

void null() {}
// Invalid token 'null' in class, struct, or interface member declaration

void @null()
// compiles

Не делайте этого; это в основном для машинного кода, такого как наборы данных. страница MSDN по этой теме.

person Community    schedule 21.10.2009
comment
Есть ли способ указать произвольный идентификатор в С#? - person ; 21.10.2009

Если вы считаете Javascript языком, многие фреймворки, по-видимому, используют символ «$» для обозначения «селектор»; Например, можно использовать $("id-of-some-item") в Prototype.js или $("#id-of-some-item") в jQuery для выбора тега с записью <div id="id-of-some-item">. Использование этих функций выбора на самом деле довольно сложное и мощное (если вам интересно, ознакомьтесь с их вспомогательной документацией на прототипах js.org и jquery.com), но они сводятся к тому, что я считаю семантически похожим на то, что вы указано.

Опять же, это предполагает, что вы считаете Javascript языком.

person Community    schedule 21.10.2009
comment
Если? Это немного грубо, не так ли? - person paxdiablo; 21.10.2009
comment
О, позвольте мне вытащить ленту ... это даже Turing Complete. (Тест компьютерщиков.) Да, это язык программирования, который, возможно, кому-то не нравится, но лимонный пирог с безе не перестает внезапно становиться пирогом, потому что я ненавижу его вкус. - person ; 21.10.2009
comment
Я бы не стал на это рассчитывать (селектор $ ==): stackoverflow.com/questions/205853/ - person Juri Glass; 21.10.2009
comment
Юрий, я только комментировал очевидное соглашение, созданное популярными фреймворками, в JavaScript для этих символов не больше правил, чем в Ruby для ? и !, или в Haskell для ' -- это просто соглашение Paxdiablo, я просто пытаюсь успокоить толпу, которая получает все скряги, если вы подразумеваете, что слабый/динамически типизированный интерпретируемый язык считается программированием. Конечно, да, и сделать это правильно в крупном приложении может быть ничуть не сложнее, чем достичь других целей с помощью других инструментов; это все о выборе правильного для работы. - person Dereleased; 27.10.2009
comment
если вы подразумеваете, что слабый/динамически типизированный интерпретируемый язык считается программированием wtf? надеюсь, ты уже передумал - person Mauricio; 27.04.2011
comment
я веб-разработчик; Я работаю веб-разработчиком 10 лет. Я думаю, что веб-разработка — сложная штука, в арсенале которой множество замечательных и мощных инструментов. Я полагаю, вы пропустили следующее предложение, которое начиналось с «Конечно, да?». Или даже остальную часть предложения, из которого взята эта самая цитата? - person Dereleased; 27.04.2011