Насколько полезны инфиксные операторы в языке программирования?

13

Насколько полезны инфиксные операторы в языке программирования? Стоят ли они дополнительной сложности, которую они предоставляют? Можете ли вы привести примеры, когда инфиксные операторы лучше подходят для задачи, которую нельзя решить, просто перегружая обычные операторы?

Casebash
источник
5
Ты должен быть Лиспером. Я прав?
фактор
@missingfaktor: Едва использовал
Casebash
1
Как инфиксные операторы связаны с перегрузкой операторов?
Рейн Хенрикс
3
Стоит отметить, что большинство популярных OO (ish) языков используют infix для имен методов. Действительно, некоторые языки имеют некоторую длину, позволяющую писать «статические» методы, скажем, arg1.method(arg2)а не method(arg1, arg2).
Том Хотин - tackline

Ответы:

16

Я думаю, что инфиксные операторы проистекают из математики.

Эта:

2 + 3 * 4

более читабелен для большинства людей, чем

(+ 2 (* 3 4))

потому что большинство людей знакомы с математикой.

Достаточно интересно в Haskell, вы можете переключаться между инфиксами и префиксами. Это использует ту же функцию "(+)":

(+) 1 2
1 + 2

и это с помощью той же функции "Elem":

elem 42 [1,2,42]
42 `elem` [1,2,42]
LennyProgrammers
источник
Перегрузка обычных операторов обрабатывает большинство случаев этого
Casebash
1
@Casebash: эти «нормальные» операторы тоже иногда являются инфиксными.
Лиори
2
Должно быть, я просто странный, потому что нахожу (+ 1 2) гораздо более читабельным, чем 1 + 2. По крайней мере (+ 1 2 3 4 5), лучше, чем 1 + 2 + 3 + 4 + 5.
Джо Д
Существует также RPN: нажмите элементы, затем оператор.
Фил Фил
@PhiLho Также называется постфиксными операторами! Как это: 1 2 +или 1 2 3 4 5 +более типично для последнего случая 1 2 + 3 + 4 + 5 +. На самом деле, у тех, кто в совершенстве моделирует основанную на стеке систему, есть замечательное преимущество, и редко (если вообще?) Нужны скобки для настройки приоритета оператора.
CodexArcanum
6

Компьютерные языки предназначены для людей, а не для машин. И люди больше привыкли к инфиксным операторам, чем к префиксам или постфиксам.

Gulshan
источник
6

Единственная реальная причина использования инфиксных операторов в том, что люди обычно находят их легче для чтения. Во многом это связано с двумя фактами:

  • Мы изучаем инфиксные операторы в форме математики с раннего возраста и, следовательно, знакомы с ними: 2 * 2 = 4и т. Д.
  • Инфиксный оператор имеет преимущество «визуального» разделения двух аргументов. например(some complex expression) + (some other complex expression)

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

  • Вы всегда можете конвертировать из инфикса в эквивалентный вызов функции с двумя аргументами, поэтому операторы инфикса никогда не являются чем-то большим, чем «синтаксический сахар»
  • Инфикс может быть неудобен, если вы хотите использовать более двух параметров. (* 1 2 3 4 5)в Лиспе, например, возможно, более чистый синтаксис для умножения набора чисел.
  • С точки зрения синтаксического анализа часто полезно сначала прочитать оператор, чтобы вы знали, как интерпретировать оставшуюся часть выражения. С инфиксными операторами это может быть намного сложнее (например, вам нужно поддерживать стек или что-то подобное, чтобы выяснить, какой оператор относится к каким аргументам)
  • В основанных на стеке / сцепленных языках, таких как Forth, вы хотите, чтобы оператор помещался в стек последним, чтобы его аргументы уже были в правильной позиции. Опять же, закапывание оператора в середине последовательности токенов только усложняет дело.
  • Инфиксные операторы действительно могут запутаться, когда они перегружены - что означает «+», например, применительно к двум HashMaps? Здесь интуитивное человеческое понимание инфиксного оператора работает против вас, потому что легко принять значение, которое на самом деле не было предназначено .....
mikera
источник
Я думаю, что последний аргумент является поддельным. Программист должен использовать разумные имена для функций, будь то символы или буквы.
Том Хотин - tackline
@Tom - конечно, программисты должны выбирать разумные имена. Но один из ключевых критериев для «разумного» - «могут ли другие люди интуитивно понять это?» - Я видел много случаев с перегрузкой операторов, где это далеко не так. Я не хочу перепроектировать чье-то дурацкое определение того, что означает «>> =» при применении к какому-либо произвольному типу данных. Правильные названия функций, пожалуйста!
Микера