Po kilku miesiącach nauki i gry z Lispem, zarówno CL, jak i odrobiną Clojure, nadal nie widzę przekonującego powodu, aby napisać coś w nim zamiast C #.
Naprawdę chciałbym mieć jakieś ważne powody lub ktoś, kto zauważyłby, że brakuje mi czegoś naprawdę dużego .
Mocne strony Lisp (według moich badań):
- Zwarta, ekspresyjna notacja - Bardziej niż C #, tak ... ale wydaje mi się, że potrafię wyrazić te pomysły również w C #.
- Domniemana obsługa programowania funkcjonalnego - C # z metodami rozszerzenia LINQ:
- mapcar = .Wybierz (lambda)
- mapcan = .Wybierz (lambda) .Aggregate ((a, b) => a.Union (b))
- samochód / pierwszy = .pierwszy ()
- cdr / rest = .Skip (1) .... itd.
- Obsługa funkcji lambda i wyższego rzędu - C # ma to, a składnia jest prawdopodobnie prostsza:
- „(lambda (x) (body))” versus „x => (body)”
- „# (” z „%”, „% 1”, „% 2” jest miłe w Clojure
- Wysłanie metody oddzielone od obiektów - C # ma to poprzez metody rozszerzenia
- Wysyłanie multimetodowe - C # nie ma tego natywnie, ale mógłbym zaimplementować go jako wywołanie funkcji w ciągu kilku godzin
- Kod to dane (i makra) - być może nie „dostałem” makra, ale nie widziałem żadnego przykładu, w którym pomysł makra nie mógłby zostać zaimplementowany jako funkcja; nie zmienia „języka”, ale nie jestem pewien, czy to jest siła
- DSL - Można to zrobić tylko poprzez kompozycję funkcji ... ale działa
- Nietypowe programowanie „eksploracyjne” - w przypadku struktur / klas, autoproperties i „obiekt” C # działają całkiem dobrze i możesz łatwo przerodzić się w mocniejsze pisanie w miarę postępów
- Działa na sprzęcie innym niż Windows - Tak, więc? Poza uczelnią znam tylko jedną osobę, która nie uruchamia systemu Windows w domu, lub przynajmniej maszynę wirtualną systemu Windows na * nix / Mac. (Z drugiej strony, może to jest ważniejsze niż myślałem i właśnie zostałem poddany praniu mózgu ...)
- REPL za projektowanie od dołu do góry - Ok, przyznaję, że to naprawdę bardzo miłe i tęsknię za tym w C #.
Czego brakuje mi w Lisp (ze względu na połączenie C #, .NET, Visual Studio, Resharper):
- Przestrzenie nazw Nawet przy użyciu metod statycznych lubię wiązać je z „klasą”, aby kategoryzować ich kontekst (wydaje się, że Clojure to ma, a CL nie.)
- Świetna obsługa kompilacji i czasu projektowania
- system typów pozwala mi określić „poprawność” struktur danych, które przekazuję
- wszystko błędnie napisane jest podkreślane w czasie rzeczywistym; Nie muszę czekać, aż środowisko uruchomieniowe się dowie
- ulepszenia kodu (takie jak użycie podejścia FP zamiast imperatywnego) są automatycznie sugerowane
- Narzędzia programistyczne GUI: WinForms i WPF (wiem, że Clojure ma dostęp do bibliotek GUI Java, ale są one dla mnie całkowicie obce).
- Narzędzia do debugowania GUI: punkty przerwania, wejście, przejście, inspektory wartości (tekst, xml, niestandardowe), zegarki, debugowanie według wątku, warunkowe punkty przerwania, okno stosu wywołań z możliwością przeskakiwania do kodu na dowolnym poziomie na stosie
- (Szczerze mówiąc, moje doświadczenie z Emacsem + Szlamem zdawało się to zapewniać, ale jestem częściowo zwolennikiem podejścia opartego na VS GUI)
Bardzo podoba mi się szum wokół Lisp i dałem mu szansę.
Ale czy jest coś, co mogę zrobić w Lisp, czego nie mogę zrobić równie dobrze w C #? Może to być nieco bardziej szczegółowe w C #, ale mam również autouzupełnianie.
czego mi brakuje? Dlaczego powinienem używać Clojure / CL?
AND
lub OR
jako funkcję. Można to zrobić (biorąc pod uwagę LAMBDA
, że jest to również makro), ale nie widzę oczywistego sposobu na zrobienie tego, co nie byłoby do niczego.