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


13

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


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]

Перегрузка обычных операторов обрабатывает большинство случаев этого
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

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


6

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

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

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

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

Я думаю, что последний аргумент является поддельным. Программист должен использовать разумные имена для функций, будь то символы или буквы.
Том Хотин - tackline

@Tom - конечно, программисты должны выбирать разумные имена. Но один из ключевых критериев для «разумного» - «могут ли другие люди интуитивно понять это?» - Я видел много случаев с перегрузкой операторов, где это далеко не так. Я не хочу перепроектировать чье-то дурацкое определение того, что означает «>> =» при применении к какому-либо произвольному типу данных. Правильные названия функций, пожалуйста!
Микера
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.