В среде REPL вы хотите, чтобы мог переопределять переменные, верно? В противном случае, если вы продолжаете использовать REPL и объявляете все больше и больше переменных, let
констант, функций, классов, что угодно, у вас не хватит имен для использования!
Например, скажем, вы Вы хотите попробовать интерполяцию строк:
let x = 10
print("x is \(x)!")
А потом, спустя некоторое время, вы узнаете о конкатенации строк, и вы тоже захотите попробовать это. На этом этапе вы захотите переопределить let
константу x
, верно?
let x = "A"
let y = "B"
print(x + y)
Можно утверждать, что вы можете использовать a
или b
, но как время идет, у тебя медленно кончатся имена. REPL разработан таким образом, чтобы вам не приходилось слишком часто перезапускать REPL.
Таким образом, каждый раз при отправке чего-либо ранее объявленные символы, которые также объявляются в представлении, будут перезаписываться. Это задокументировано здесь .
swiftc
имеет совершенно другой вариант использования - вы обычно используете его для компиляции более крупных программ, содержащих всего несколько строк кода. В этих ситуациях в глобальной области видимости будет намного меньше символов, и перераспределение переменных не очень удобно для реализации, потому что выполнение кода не линейно сверху вниз. Также может быть несколько файлов, которые общаются друг с другом. Как вы выясните, что redeclares что? Просто не имеет смысла делать это где-либо, кроме REPL.
Другие REPL также имеют эту функцию, например csharppad.com
для C#, ghci
для Haskell и python
, Просто назвать несколько. Так что это действительно обычная вещь, которую вы делаете при реализации REPL, а не что-то особенное для Swift.
На самом деле, вы можете воспроизвести поведение swiftc
в REPL, написав две строки в функции, потому что теперь две строки находятся в одной отправке и не будут перезаписывать друг друга.