LISP (i dialekty, takie jak Scheme, Common LISP i Clojure) nie zyskały dużego wsparcia branży, mimo że są całkiem przyzwoitymi językami programowania. (W tej chwili wydaje się, że zyskują one przyczepność).
To nie jest bezpośrednio związane z pytaniem, czy użyłbyś dialektu LISP dla programu produkcyjnego? Jaki program i dlaczego? Uwzględniono również zastosowania tego rodzaju integracji z jakimś innym kodem (np. C), ale pamiętaj, że to właśnie masz na myśli w swojej odpowiedzi. Preferowane są ogólne koncepcje, ale określone aplikacje również są w porządku.
Odpowiedzi:
Czy użyłbyś dialektu LISP dla programu produkcyjnego?
Absolutnie
Jaki program i dlaczego?
Lisp to dynamiczny język ogólnego przeznaczenia. Dziś ma te same podstawowe trudności, co inne dynamiczne języki ogólnego przeznaczenia, które nie są publikowane przez Microsoft: natywne wątki, integracja GUI, deterministyczne działanie GC i małe ślady pamięci.
Wierzę, że rodzime wątki są osiągane przez LispWorks i SBCL. Być może inni? Nie zbadałem w pełni.
LispWorks i Franz Common Lisp - produkty komercyjne - integrują się z GUI w stopniu sukcesu. Nie mając $$ na ich zakup, nie wiem jak dobrze to działa. Podejrzewam, że działają całkiem dobrze ...
Deterministycznego działanie GC można zrobić (jest to zrobione w Java do pewnego poziomu sukcesu), ale ja nie wiem, czy istniejące systemy Lisp (obsługuje nich) mają żadnego kodu, aby to zrobić.
Mały ślad pamięci, jak sądzę, jest osiągany przez niektórych Lisps.
Chodzi mi o to, że Common Lisp jest technicznie gotowy do produkcji systemów produkcyjnych. I tak jest .
Zdecydowana większość programistów jest przerażona (wybierz jeden) dynamicznymi językami, makrami, nawiasami, brakiem ulubionego IDE, złym doświadczeniem na studiach, niewielką liczbą miejsc pracy, a następnie nie korzysta z nich.
Osobiście skoczyłbym do budowania pełnoprawnego systemu produkcyjnego w Common Lisp od podstaw w środowisku zespołowym.
edycja: Naprawdę nie odpowiedziałem, dlaczego Lisp w przeciwieństwie do innych języków.
Z mojego doświadczenia Lisp - nieistotnego, ale znacznie bardziej niż „witaj świecie” - stwierdziłem, że jest on niezwykle użyteczny po pierwszych bólach związanych z „nowym językiem Argh”. Większość języka pasuje do siebie w bardzo regularny i dość oczywisty sposób, że tak naprawdę nie znajduję innych języków do obsługi. Częścią tego jest połączenie wyrażeń i instrukcji. Częścią tego jest typ danych listy podstawowej. Częścią tego jest system typów. Częścią tego jest system makr. Nie zrozumcie mnie źle, są punkty bólu. Ale nie kopią mnie w twarz tak bardzo, jak bolą inne języki.
Jednym uproszczonym przykładem jest procedura długości listy Pythona. Podejście Python polega na wywołaniu
len(mysequence)
. Ale jeśli się nad tym zastanowić, długość jest właściwością sekwencji. Tak,mysequence.len()
jest bardziej odpowiedni pomysł. Lisp zasadniczo usuwa to rozróżnienie składniowe.(length thing)
jest zarówno składnią wywołania funkcji, jak i składnią metody. Oczywiście niektórzy uważają to za frustrujące i chcą różnicy składniowej. Wolałbym mieć regularność.edit2: Przekształciłem część mojej pracy magisterskiej, która działa na pulpicie, na Common Lisp i do tej pory miałem przyjemność pracować z nią.
źródło
Osobiście znam osoby używające Lisp w postaci Clojure w kilku bankach inwestycyjnych i startupach w Londynie. Wybrałem również Clojure jako podstawowy język programowania dla mojego startupu, więc chętnie wkładam pieniądze tam, gdzie są moje usta :-)
Odkryłem, że nauka języka Clojure w ciągu ostatniego roku była bardzo pouczająca (po wielu doświadczeniach z Javą i C #). Głównymi przyczynami tego są:
Wydaje się również, że jest praktycznym wyborem do rzeczywistego wykorzystania produkcyjnego z następujących powodów:
źródło
Użyłbym LISP, gdyby był to najlepszy wybór do pracy. Tylko niektóre rzeczy, które wpływają na „najlepszy wybór”:
Wszystkie te czynniki należy wziąć pod uwagę przy podejmowaniu decyzji, czy LISP jest odpowiedni dla projektu. W świecie korporacyjnym nigdy tego nie doświadczyłem.
źródło
Absolutnie. Paul Graham wyjaśnia to dobrze .
źródło
Gdzie: Emacs to aplikacja w świecie rzeczywistym, która korzysta z LISP.
Dlaczego: To był świetny sposób na wyrażenie mapowania między naciśnięciem klawisza a akcją. Jest interpretowany i szybki, dobrze zdefiniowany i prosty.
źródło
Zarówno Macsyma, jak i Autocad oparte są na dialekcie Lisp. Sklasyfikowałbym je jako „prawdziwy świat”, jak również Emacsa.
źródło
Absolutnie bym to rozważył. Zwłaszcza w przypadku nowych prac rozwojowych, które miały pewien potencjał przetwarzania równoległego. To wydaje się być miłym miejscem dla tego rodzaju funkcjonalnych języków.
źródło
Lisp jest jednym z najlepszych wyborów do wdrażania kompilatorów. Wraz ze wzrostem wykorzystania DSL i eDSL, Lisp staje się coraz bardziej wartościowy. Używam dialektu Lisp do wszystkich moich zadań związanych z DSL.
źródło
Obecnie próbuję użyć newLisp jako zamiennika Php na mojej osobistej stronie internetowej za pośrednictwem platformy Dragonfly . Jeśli uda mi się wymyślić, jak sprawić, by Apache dobrze grał, skorzystam z niego (wbudowany serwer internetowy działa bardzo dobrze, ale wolałbym pracować za pośrednictwem Apache). A kiedy to się stanie, użyję newLisp wszędzie, gdzie użyłbym Php, ponieważ nie lubię Php i lubię newLisp.
W tej chwili Clojure nie jest dobrym wyborem dla aplikacji na Androida, ale wiem, że ludzie nad tym pracują. Więc jeśli to się wymyśli, to byłoby inne miejsce, w którym używałbym dialektu Lisp do aplikacji w świecie rzeczywistym ... ale znowu, to dlatego, że po prostu nie lubię Javy.
Ale szczerze, wolę Ruby niż Lisp ... ale to głównie kwestia społeczności i dokumentacji.
źródło
Zaimplementowałem zastrzeżoną, komercyjną aplikację w Common Lisp o nazwie Tankan, która działa w systemie Microsoft Windows jako natywny plik wykonywalny.
Jest to program służący do zapamiętywania japońskich znaków kanji.
Program działa jako serwer HTTP w tle. Wykonywanie tego serwera i przechodzenie do jego stron jest koordynowane przez niewielką aplikację w obszarze powiadomień systemowych (znaną również jako „Tray”), którą opracowałem przy użyciu Visual C ++.
Uruchamia się aplikacja ikony małej tacy, monitoruje i zatrzymuje serwer oparty na Lisp i komunikuje się z nim za pomocą potoków Win32 powiązanych ze standardowym wejściem i wyjściem. Za pomocą potoku serwer Lisp informuje aplikację ikony zasobnika o dokładnym adresie URL z odpowiednim numerem portu, a ta aplikacja ikony zasobnika może uruchomić przeglądarkę za pośrednictwem interfejsu API powłoki, aby przeglądać ten adres URL. Użytkownik wystarczy dwukrotnie kliknąć ikonę, aby wyświetlić interfejs użytkownika.
Program Lisp utrzymuje w pamięci dość złożony stan sesji, który zawiera historię danych wejściowych użytkownika i różne relacje między różnymi obiektami. Okrągła notacja obiektowa Lispa (włączana przez
*print-circle*
zmienną) i sposób jej działania w niestandardowychprint-object
metodach CLOS stanowi ogromną pomoc w implementacji trwałości: użytkownicy mogą zapisać stan na dysk i wznowić od miejsca, w którym przerwali. Wszystko jest zapisywane, w tym stan interfejsu użytkownika. Na wykresie obiektowym jest wiele współużytkowanych podkonstrukcji, a także cykli. Plus, wiele statycznych cruft, które nie muszą być utrwalane, jak zawartość obiektów wejściowych słownika. Za pomocą niestandardowych metod drukowania obiektów ANSI Common Lisp można tworzyć skondensowane reprezentacje drukowane dla obiektów, które mimo to można odczytać maszynowo,Prawie nie JavaScript jest używany w interfejsie internetowym. Nawet kontrole ukrywania i pokazywania części interfejsu użytkownika są wykonywane przez przesłanie formularza i ponowne renderowanie HTML. Każdy szczegół stanu interfejsu użytkownika znajduje się zatem na serwerze i jest zapisywany, gdy użytkownik zapisuje dane. Ponowna generacja kodu HTML jest bardzo szybka. Robi to gigantyczne wyrażenie zwrotne Lisp, które zasila makro generujące HTML. Kod skompilowany przez Clozure Common Lisp (CCL) sprawia, że dzieje się to tak szybko, że prawie nie zdajesz sobie sprawy, że kiedy klikniesz przycisk [+] w interfejsie użytkownika, aby coś otworzyć, przesyłasz żądanie do serwera, który regeneruje cała cholerna strona, a nie po prostu uruchomienie lokalnego JavaScript w celu zmiany widoczności lokalnego elementu dokumentu.
Program został pierwotnie opracowany z CLISP. Dzięki temu, że ANSI CL jest językiem standardowym, a implementacje są dobrze zgodne i nie ma zbyt wielu podstępnych pułapek w języku (zachowanie „niezdefiniowane” lub „zdefiniowane w ramach implementacji”) dość łatwo można je przenieść do CCL.
CLISP nie został porzucony; jest nadal używany do zasilania zaplecza licencyjnego, wykorzystując większość tej samej wspólnej bazy kodu.
Opracowałem oryginalny system licencjonowania programu, używając kryptografii krzywej eliptycznej dostarczonej przez bibliotekę IronClad, która jest używana przez serwer licencyjny do podpisywania licencji w celu ich certyfikacji. (Wydaje mi się, że pamiętam, że mogłem użyć programu wiersza poleceń OpenSSL do wygenerowania parametrów EC klucza serwera).
Licencje są reprezentowane jako obiekty Lisp. W hołdzie przenośności Lisp program Windows skompilowany przez Clozure Common Lisp może wygenerować licencję opartą na wyrażeniu S, program CLISP działający na serwerze Debian może wypełnić brakujące pole podpisu cyfrowego w tym obiekcie i odesłać go z powrotem do program Windows, który może sprawdzić poprawność podpisu.
Na serwerze, oprócz usługi licencjonowania opartej na CGI, mam prosty interfejs API wiersza poleceń do zarządzania licencjami. Możesz wyświetlić listę licencji, znaleźć określone i edytować ich atrybuty: na przykład edytować datę wygaśnięcia licencji tymczasowej, aby udzielić użytkownikowi wyjątku. Back-end licencjonowania generuje również e-maile. Nie korzystałem z żadnej biblioteki do obsługi CGI po stronie serwera: po prostu ręcznie zwinięty kod Lisp do obsługi zmiennych środowiskowych Apache i argumentów wiersza poleceń. (Chociaż kod biblioteki jest używany do kodowania adresów URL i generowania HTML.) Żadna baza danych nie jest używana do przechowywania; licencje są catenated do pliku o nazwie
licenses.lisp
i to wszystko.źródło
Jeśli ktoś mi zapłacił, to na pewno.
Prawdopodobnie byliby bardziej zainteresowani płaceniem komuś, kto zna język. Grałem tylko z elisp i planowałem kilka razy.
źródło