Как Swift REPL и компилятор swift c интерпретируют язык по-разному? - PullRequest
1 голос
/ 16 января 2020

Swift имеет компилятор (swift c) и REPL. Мне нравится использовать REPL, чтобы учиться и играть с языковыми конструкциями.

В одном из моих экспериментов я натолкнулся на заметную разницу в том, как работает «let».

Ниже приведено следующее. ожидаемо, не допускается в swift c, но REPL это позволяет.

let x = 10
let x = 20 // ok in REPL

А теперь мне интересно, какие еще существуют различия. Они где-нибудь задокументированы?

1 Ответ

0 голосов
/ 16 января 2020

В среде 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, написав две строки в функции, потому что теперь две строки находятся в одной отправке и не будут перезаписывать друг друга.

...