Чому F # має інтерактивний режим, але не C #?


32

F # виходить із коробки з інтерактивною REPL. C # не має нічого подібного, і насправді щось важко обіграти без створення повноцінного проекту (хоча LINQpad працює, і це також можливо зробити через powerhell).

Чи є щось принципово інше в мовах, що дозволяє F # мати інтерактивну консоль, але ускладнює її реалізацію для C #?


Оскільки через багато років люди все ще приходять до цього питання, я мушу зазначити, що зараз існує багато варіантів. Для грати з рамкою .Net ви можете використовувати паттерн з силою (попередньо встановлений на кожній сучасній машині Windows). Або ви можете використовувати LINQpad для прототипування довільного c # коду . Або ви можете використовувати ScriptC, або ви можете використовувати онлайн-середовище типу jsfiddle, як Complify.net або Jsil . Безліч варіантів.


4
C # робить є REPL. Він називається « Негайне вікно» і був доступний досить довгий час. Він має певні обмеження, деякі з яких стають все більш помітними з C # 3.0, оскільки нові мовні функції не підтримуються, але, тим не менш, це повноцінна REPL.
Аллон Гуралнек


Я пам’ятаю, проект демонстрації версії Roslyn в межах 2012 року мав відповідь на VS2010
James

@DanielHakimi: Спасибі за цей коментар, у мене не було поняття, що це було включено до VS2015, я думав, що ви можете скористатися вікном негайного під час налагодження. Тепер VS2015 містить вікно інструменту C # Interactive , доступне через View -> Other Windows -> C # Interactive, яке, здається, є повноцінною REPL на основі Roslyn, відокремленою від середовища налагодження.
Лу

Відповіді:


56

Чи є щось принципово інше в мовах, що дозволяє F # мати інтерактивну консоль, але ускладнює її реалізацію для C #?

Так.

F # є нащадком мови програмування ML, на який, в свою чергу, сильно впливали такі мови, як Lisp та Scheme. Ці мови були розроблені з першого дня, щоб мати три приємні властивості.

По-перше, ці мови насправді не мають висловлювань так, як ви думаєте про них у C #. Скоріше, майже все є виразом, який має цінність , тому механізм оцінювання та друку вартості має сенс майже в будь-якій ситуації.

По-друге, ці мови відштовхують програмування від побічних ефектів, тому ви можете робити оцінки, не переживаючи, що ви зіпсуєте глобальний стан.

По-третє, більша частина роботи, якою ви займаєтесь цими мовами, - «на вищому рівні»; як правило, немає вкладеного "класу" чи "простору імен" чи іншого контексту.

Навпаки, C # підкреслює керування потоком програмування з операторами, які створюють побічні ефекти, і ці оператори завжди знаходяться в декількох вкладених контейнерах - просторі імен, класі, методі тощо.

Отже, це все, що ускладнює C # мати відповідь, але, звичайно, не неможливо . Нам просто потрібно розібратися, що таке семантика для висловлювань та виразів, що з’являються поза звичайним контекстом, і що таке семантика мутацій, які змінюють прив’язки до імен тощо.

Чому F # має інтерактивний режим, але не C #?

Оскільки команда F # вирішила, що цикл REPL є пріоритетним сценарієм для них. Команда C # історично не має. Функції не реалізуються, якщо вони не є найвищими пріоритетними функціями, що входять до бюджету; досі CPL REPL не був у верхній частині нашого списку.

Проект Рослін має C # REPL (і, зрештою, матиме і VB REPL, але він ще не готовий.) Ви можете завантажити попередній випуск його, щоб побачити, як вам це подобається на

http://www.microsoft.com/en-us/download/details.aspx?id=27746


7
У Python є хороша REPL, і в ній є заяви, побічні ефекти та простори імен. І так само Javascript, Bash тощо. Багато мов, які порушують ваші критерії, мають REPL просто чудово.
Лежати Райан

2
Ласкаво просимо, Еріку! Сподіваюся, ми побачимо більше відповідей від вас.
РішенняYogi

16
@LieRyan Я думаю, ви пропустили весь пункт. Єдиний "Критерій" для інтерактивного циклу REPL - це те, що хтось сів і записав його; у F # це було пріоритетним та відносно легким, у C # це було низьким пріоритетним та відносно жорстким, тому F # отримав ранній ранок, а C # не став.
KutuluMike

Цікаво. Додам, що досвід накопичення стільки компіляторів для .NET-рамки до виходу VS2010 (я рахую чотири C #, чотири VB.NET, два J # і два C ++ / CLI), мабуть, вплинув на те, як абсолютно новий компілятор для була побудована абсолютно нова мова .NET. Я впевнений, що він був побудований у стилі Roslyn-esque з великою кількістю роздумів про те, як увімкнути сценарій Compiler as-a-Service, який, схоже, напрямок, який ви розробляєте для всіх майбутніх компіляторів .NET та версій компілятора. Мені здається, епоха, в якій народився F #, неминуче відігравала певну роль у написанні його укладача.
Аллон Гуралнек

Чудова відповідь. Про Python vs C #: {} мови синтаксису не згинаються добре для REPLs, мови, що базуються на відступи, мають великий прогрес тут. Ніколи не думав, що коли-небудь подумаю чи скажу: синтаксис відступу краще, ніж {} синтаксис. Як для REPLs, так і для читабельності коду. Якщо поки немає метасинтаксису C #, який замінює відступ на {}, досвід REPL ніколи не буде таким гладким, як, наприклад, у F # або Python.
citykid

22

Моно має C # repl: http://www.mono-project.com/CsharpRepl

У нього навіть є версія GUI, яка дозволяє безпосередньо маніпулювати графічними об’єктами або створювати віджети Gtk #:

введіть тут опис зображення


Звичайно, і це, безумовно, можливо, але чи є щось про C #, що робить це складніше?
Джордж Мауер

2

Я вважаю, що це здебільшого історична річ. Середовища REPL завжди були пов'язані з функціональними мовами, включені сімейні мови ML, а F # залишається вірним цій традиції. Майте на увазі, що інтерактивне середовище - це те, що користувачі, що виходять з функціональних передумов, сприймають як належне, відсутність такої функції поставило б VS і - за розширенням - F #, у невигідне становище.

З іншого боку, жодна така особливість не була звичною для спільноти OOP.

Однак REPL-файли доступні для багатьох нефункціональних мов, включаючи C, Java або C #. Крім того, поки це далеко не повноцінний REPL, функція Autos в VS показує, що це, звичайно, можливо з C #.


1
Це найбільш правдоподібне пояснення, яке я бачив. На початку там був Фортран і був Лісп, а у Ліпса були відбиття. Лисп породив ... ну, ти зрозумієш. У мовах рядків Lisp були відповіді, а у фортранських - не.
Аарон

@Aaron LISP - це 1959 рік, але REPL приписується машинам LISP, 1973. До того часу вже існувало багато, багато мов. Особливо PASCAL та Smalltalk.
Спрег

1

Я вважаю, що C # насамперед орієнтована на об'єкти. Щоб написати навіть найпростіший код, слід розділити його на кілька класів. Щоб використовувати REPL, вам потрібно буде написати багато коду.

У F #, що є функціональним в основному, немає цієї проблеми, і ви можете легко записати навіть складний код в прямому стилі та перетворити його в об'єкт / с пізніше.

Простіше написати один рядок функції, ніж записати клас, який охоплює багато рядків.


1
Ніщо не заважає вам використовувати функції / класи, визначені у зовнішніх файлах у операторах REPL. Той факт, що OOP є більш багатослівним, сам по собі не перешкоджає функціонуванню REPL.
scrwtp

1
Python, будучи досить об'єктно-орієнтованим і відрізняється синтаксично значущими рядками, має гідну REPL. Будучи статично набраним, складеним і скоріше об'єктно-орієнтованим, Scala має REPL. REPL найбільш корисний для коротких речей, таких як імпорт існуючих класів та виклик деяких методів; багатослівність мови не викликає занепокоєння. Наприклад, SQL є досить багатослівним, але кожна база даних SQL має REPL ("інструмент запитів").
9000
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.