Почему многострочная строка имеет такой странный синтаксис?(когда они делают) - PullRequest
1 голос
/ 25 августа 2010

Возможно, что-то действительно простое, что мне не хватает, но что плохого в том, что строка состоит из нескольких строк?

Например, Ruby это:

 text = <<END
     Some 
     text 
  END

А Python это:

text = """
   Some 
   text
 """

А C #:

string text = @"
     Some 
     Text";

Которые подходят ближе, но все еще нуждаются в символе @.

Что не так с использованием одной строки, подобной этой:

 text = "
    Some 
    text
  "

Я думаю, что в этом случае строковый литерал может закончиться, где (") появляется один, таким образом, если кавычки найдены на пути, они игнорируются.

text = "
  He said "This is cool"
  But it wasn't , until "
 " //<-- quote mark alone  

Какая (-ые) причина (-ы) позволяет избегать использования многострочного строкового литерала в одинарных кавычках во многих языках программирования, а именно в Java, JavaScript, C #, C ++, C, Ruby, Python?

Ответы [ 3 ]

3 голосов
/ 25 августа 2010

Во-первых, разбирать ужас - в зависимости от того, насколько проста остальная часть грамматики, эта единственная «удобная функция» может усложнить порядок внешнего интерфейса.Подробности см. В ответе dierre.

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

В-третьих, мультиСтроковые строки не нужны , что часто (особенно в языках, которые объединяют смежные литеральные строки даже в несколько строк, таких как C и Python).Это просто не окупается по сравнению с вышеуказанными недостатками.

2 голосов
/ 25 августа 2010

Единственная причина, по которой я могу придумать конкретный синтаксис, заключается в том, что вам не нужно беспокоиться о экранировании символов.Я не уверен, что это причина, но это, безусловно, преимущество этого синтаксиса.

Последний пример немного проблематичен, когда вам нужно определить свой синтаксис, потому что вы используете один токен " для выполнениянесколько вещей, и это непросто со стандартным LALR (1), вам потребуется больше токена на входе, чтобы предсказать правильное правило для использования.

Дополнительная информация о LALR-парсере .

0 голосов
/ 25 августа 2010

Я подозреваю, что часть этого пытается разрешить достойное форматирование.

В C или C ++ вы всегда можете написать длинную строку как одну длинную строку, но это расширит путь вправо, и если это обернется, это будет некрасиво. Разрешение его разделения позволяет легче сохранить форматирование программы без изменений. Как правило, программы на C и C ++ не так интенсивно используют многострочные строки, чтобы было полезно изменить язык, чтобы сделать их более удобными.

Часто полезно явно показывать конец строки и тому подобное в строке и разрешать ей сохранять форматирование окружающей программы. Иногда также полезно иметь возможность писать буквальную строку именно так, как вы этого хотите, а примеры на Ruby, Python и C # показывают способы написания буквенных многострочных строк именно так, как вы этого хотите.

Ваше предложение нарушает форматирование, очень похожее на примеры на Ruby и Python, и на самом деле не выглядит лучшим решением. Было бы слишком легко спутать эти строки с обычными строками, в то время как HERE-документы Ruby и Perl и тройная цитата Python точно показывают, что это за строки.

...