Почему я не должен смешивать табуляции и пробелы?

Это то, что я обычно работаю при разработке интерфейса функции без шаблона:

  1. Пропустить по значению, если функция не хочет изменять параметр, а значение дешево для copy (int, double, float, char, bool и т. д.) Обратите внимание, что std :: string, std :: vector и остальные контейнеры в стандартной библиотеке НЕ)
  2. Pass by const, если значение дорогое копировать, и функция не хочет изменять указанное значение, а NULL - это значение, которое обрабатывает функция.
  3. Пропускать указатель не const, если значение является дорогостоящим копировать, а функция хочет изменить указанное значение, а NULL - это значение, которое обрабатывает функция.
  4. Передавать по ссылке const, когда значение дорого копировать, и функция не хочет изменять указанное значение to и NULL не будут действительным значением, если вместо этого использовался указатель.
  5. Пропускайте по неконстантной ссылке, когда значение дорого копируется, и функция хочет изменить значение и NULL не будут действительным значением, если вместо этого использовался указатель.
24
задан Solomon Ucko 28 March 2019 в 11:03
поделиться

1 ответ

1127 Проблема двоякая. Прежде всего, Haskell чувствителен к отступам, например следующий код недействителен:

example = (a, b)
  where
    a = "Hello"
     b = "World"

Обе привязки должны иметь одинаковое количество пробелов / табуляций (см. правило офсайда ). Хотя в данном случае это очевидно, в следующем он довольно скрыт, где я обозначаю пробел · и табуляцию »:

example = (a, b)
··where
····a = "Hello"
»   b = "World"

Это будет выглядеть как действительный код на Haskell, если редактор покажет вкладки, выровненные по коэффициентам, кратным четырем. Но это не так. Вкладки на Haskell выровнены по кратному восьми, поэтому код будет интерпретироваться следующим образом:

example = (a, b)
··where
····a = "Hello"
»       b = "World"

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

example = (a, b)
»       where»  a = "Hello"
»       »       b = "World"

Но в другом редакторе, который использует 4 пробела, он больше не будет выглядеть правильно:

example = (a, b)
»   where»  a = "Hello"
»   »   b = "World"

Это все еще правильно, хотя. Тем не менее, тот, кто привык к пробелам, может переопределить b 'связывание с пробелами и закончиться ошибкой парсера.

Если вы применяете кодовое соглашение в своем коде, которое гарантирует, что вы используете только табуляции в начале строки и новую строку после where, let или do, вы можете избежать некоторых проблем ( см. 11 ). Тем не менее, текущие выпуски GHC по умолчанию предупреждают о вкладках , потому что они имеют , были , источник из много ошибок синтаксического анализатора в прошлом, так что вы, вероятно, хотите избавиться и от них.

См. Также

31
ответ дан Zeta 28 March 2019 в 11:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: