Після кількох місяців навчання та гри з Ліспом, як з CL, так і з Clojure, я все ще не бачу вагомих причин писати що-небудь замість C #.
Мені дуже хотілося б переконливих причин або для того, щоб хтось зазначив, що я пропускаю щось дійсно велике .
Сильні сторони Lisp (за моїм дослідженням):
- Компактна, виразна нотація - Більше, ніж C #, так ... але, здається, я можу висловити ці ідеї і в C #.
- Неявна підтримка функціонального програмування - C # з методами розширення LINQ:
- mapcar = .Вибір (лямбда)
- mapcan = .Select (лямбда) .Aggregate ((a, b) => a.Union (b))
- машина / перший =. Перший ()
- cdr / rest = .Skip (1) .... і т.д.
- Підтримка функції лямбда та вищого порядку - у C # це є, а синтаксис, можливо, простіший:
- "(лямбда (х) (тіло))" проти "х => (тіло)"
- "# (" з "%", "% 1", "% 2" приємно в Clojure
- Відправлення методу відокремлено від об'єктів - C # має це за допомогою методів розширення
- Мультиметод-диспетчер - C # не має цього в основному, але я міг би реалізувати це як виклик функції за кілька годин
- Код - це дані (і макроси) - можливо, я не "дістав" макросів, але я не бачив жодного прикладу, де ідея макросу не могла бути реалізована як функція; це не змінює "мову", але я не впевнений, що це сила
- DSL - це можна зробити лише за допомогою функції функцій ... але це працює
- Нетипізоване "дослідницьке" програмування - для структур / класів, автоматичні властивості C # та "об'єкт" працюють досить добре, і ви можете легко перерости в сильніший текст, коли ви йдете разом
- Працює на апаратному забезпеченні, яке не є Windows - Так, так? Поза межами коледжу я знав лише одну людину, яка не працює вдома Windows або хоча б VM Windows на * nix / Mac. (Знову ж таки, можливо, це важливіше, ніж я думав, і мені щойно промили мозок ...)
- REPL для дизайну знизу вгору - Гаразд, я визнаю, це дійсно дуже добре, і мені це не вистачає в C #.
Те, чого мені не вистачає в Lisp (завдяки суміші C #, .NET, Visual Studio, Resharper):
- Простори імен. Навіть зі статичними методами я люблю прив'язувати їх до "класу", щоб класифікувати їх контекст (Clojure, здається, має це, CL не здається.)
- Прекрасна підтримка компіляції та дизайну
- система типів дозволяє мені визначати "правильність" структур даних, які я передаю
- в режимі реального часу підкреслюється що-небудь неправильно написане; Мені не потрібно чекати часу виконання, щоб знати
- удосконалення коду (наприклад, використання підходу FP замість імперативного) автоматично запропоновано
- Інструменти розробки графічного інтерфейсу: WinForms та WPF (я знаю, що Clojure має доступ до бібліотек Java GUI Java, але вони мені повністю чужі.)
- Інструменти для налагодження графічного інтерфейсу: точки прориву, вхід, перехід, інспектори значень (текст, xml, користувальницький), годинник, налагодження за допомогою потоку, умовні точки перерви, вікно стека виклику з можливістю переходити до коду на будь-якому рівні в стопку
- (Справедливо кажучи, моє враження щодо Emacs + Slime, здавалося, щось із цього забезпечує, але я частково ставлюся до підходу VS GUI)
Мені дуже подобається ажіотаж навколо Lisp, і я дав йому шанс.
Але чи можу я зробити в Ліспі щось, що я не можу зробити так добре в C #? Це може бути трохи докладніше в C #, але у мене також є автозаповнення.
Що я пропускаю? Чому я повинен використовувати Clojure / CL?
AND
чи OR
як функцію. Це можна зробити (дано LAMBDA
, що також є макросом), але я не бачу очевидного способу зробити це, який би не був повністю смоктати.