После нескольких месяцев изучения и игры с Lisp, как с CL, так и с немного Clojure, я все еще не вижу веской причины что-либо писать в нем вместо C #.
Мне бы очень хотелось, чтобы были веские причины, или чтобы кто-то указывал, что мне не хватает чего-то действительно большого .
Сильные стороны Лиспа (согласно моим исследованиям):
- Компактная, выразительная запись - больше, чем C #, да ... но я, похоже, тоже могу выразить эти идеи в C #.
- Неявная поддержка функционального программирования - C # с методами расширения LINQ:
- mapcar =. Выбрать (лямбда)
- mapcan = .Select (лямбда) .Aggregate ((a, b) => a.Union (b))
- автомобиль / первый = .First ()
- cdr / rest = .Skip (1) .... и т. д.
- Поддержка лямбда-функции и функции высшего порядка - в C # есть это, и синтаксис, возможно, проще:
- "(лямбда (х) (тело))" против "х => (тело)"
- "# (" с "%", "% 1", "% 2" хорошо в Clojure
- Диспетчеризация методов отделена от объектов - в C # есть методы расширения
- Диспетчеризация мультиметода - C # не имеет этого изначально, но я мог бы реализовать это как вызов функции через несколько часов
- Код - это данные (и макросы). Возможно, я не «получил» макросы, но я не видел ни одного примера, где идея макроса не могла бы быть реализована как функция; это не меняет "язык", но я не уверен, что это сила
- DSLs - может сделать это только через композицию функций ... но это работает
- Нетипизированное «исследовательское» программирование - для структур / классов, автообъекты C # и «объект» работают достаточно хорошо, и вы можете легко перейти к более сильной типизации по мере продвижения
- Работает на оборудовании, отличном от Windows - Да, так? Вне колледжа я знал только одного человека, который не запускал Windows дома, или хотя бы виртуальную машину Windows на * nix / Mac. (Опять же, может быть, это важнее, чем я думал, и мне только что промыли мозги ...)
- REPL для восходящего дизайна - хорошо, я признаю, что это действительно очень приятно, и я скучаю по нему в C #.
Вещи, которые мне не хватает в Лиспе (из-за сочетания C #, .NET, Visual Studio, Resharper):
- Пространства имен. Даже со статическими методами мне нравится привязывать их к «классу», чтобы классифицировать их контекст (похоже, что у Clojure это есть, а CL нет).
- Отличная поддержка компиляции и разработки
- система типов позволяет мне определить «правильность» структур данных, которые я передаю
- все, что написано с ошибками, указывается в реальном времени Я не должен ждать до времени выполнения, чтобы знать
- улучшения кода (такие как использование подхода FP вместо императивного) выполняются автоматически
- Инструменты разработки графического интерфейса: WinForms и WPF (я знаю, что Clojure имеет доступ к библиотекам Java GUI, но они мне совершенно чужды).
- Инструменты отладки графического интерфейса пользователя: точки останова, пошаговое выполнение, пошаговое управление, инспекторы значений (текст, xml, пользовательские), отслеживание, отладка за потоком, условные точки останова, окно стека вызовов с возможностью перехода к коду на любом уровне. в стеке
- (Чтобы быть справедливым, моя работа с Emacs + Slime, казалось, обеспечила часть этого, но я неравнодушен к подходу, основанному на графическом интерфейсе VS)
Мне действительно нравится ажиотаж вокруг Lisp, и я дал ему шанс.
Но есть ли что-то, что я могу сделать в Лиспе, что я не могу сделать также в C #? Это может быть немного более многословно в C #, но у меня также есть автозаполнение.
Чего мне не хватает? Почему я должен использовать Clojure / CL?
AND
или OR
как функцию. Это может быть сделано (учитывая LAMBDA
, что также является макросом), но я не вижу очевидного способа сделать это, который не будет полностью отстой.