Dlaczego Lisp jest użyteczny? [Zamknięte]

64

Lisp jest oczywiście zaletą dla sztucznej inteligencji , ale nie wydaje mi się, że Lisp jest szybszy niż Java, C #, a nawet C. Nie jestem mistrzem Lisp, ale bardzo trudno mi zrozumieć przewagę pisano oprogramowanie biznesowe w Lisp.

Jest jednak uważany za język hakera.

Dlaczego Paul Graham opowiada się za Lispem? Dlaczego ITA Software wybrało Lisp zamiast innych języków wysokiego poziomu? Jaką wartość ma w tych językach?

Peter Mortensen
źródło
20
Wiersz „Nie sądzę, aby Lisp był szybszy niż Java, C # lub w rzeczywistości szybszy niż C” jest nieco mylący. C jest zwykle uznawany za standard dla „szybkiego kodu, ponieważ programujesz blisko metalu” - jest to punkt odniesienia do pobicia w prawie wszystkim. Teraz Java i inne języki GC mogą pokonać go w niektórych kontekstach, na przykład w szybkości przydzielania / czyszczenia pamięci. Jednak zdanie to wydaje się nieco odwrócone.
Michael H.
2
Lisp jest językiem wyższego poziomu niż te, o których wspomniałeś, dlatego jest ogólnie wolniejszy.
segfault
5
@Bo Tian: „język wyższego poziomu” wymaga jednoznacznej definicji. Nawet jeśli tak, brzmi to jak non-sequitur. (dzięki @Mark)
Mike Dunlavey
5
@BoTian „wyższy poziom” domyślnie nie oznacza „wolniejszego”.
24
Lisp istnieje, aby pokazać, jak źle popełnił się każdy inny projektant języka.

Odpowiedzi:

78

Jest kilka powodów, dla których pracuję nad tym, by stać się kompetentnym w Common Lisp.

  1. Kod homoonic. Pozwala to na ustrukturyzowany kod samomodyfikujący.
  2. Makra obsługujące składnię. Pozwalają na przepisywanie kodu płyty grzewczej.
  3. Pragmatyzm. Common Lisp został zaprojektowany do wykonywania zadań przez pracujących profesjonalistów. Większość języków funkcjonalnych z reguły nie jest.
  4. Elastyczność. Może robić wiele różnych rzeczy, wszystko z rozsądną prędkością.
  5. Wartowność Prawdziwy świat jest brudny . Kodowanie pragmatyczne kończy się na wykorzystaniu lub wynalezieniu niechlujnych konstrukcji. Common Lisp ma wystarczającą czujność, że może załatwić sprawę.

Prawdopodobnie jedynym prawdziwym powodem wyboru w stosunku do Common Lisp jest to, że standardowe biblioteki są datowane.

Wyjdę na całość i powiem, że w ogólnym przypadku składnia nie powinna stanowić problemu dla profesjonalnego pracownika oprogramowania.

Paul Nathan
źródło
8
Składnia może być problemem, jeśli znacząco wpływa na czytelność lub zapis. Nie sądzę, że tak jest w przypadku Lisp. Dobry edytor lub IDE potrafi wystarczająco dobrze wyróżniać składnię i dopasowywać paren, aby nie było to wielkim problemem.
Matt Olenik,
4
Ponadto użyłem tylko trochę Lispa (Common Lisp) i ogólnie czułem, że # 2 był największą korzyścią dla Lisp. Może myślę w niewłaściwym paradygmacie, ale nie sądzę, że kiedykolwiek miałem sytuację, w której konieczny był samodmodyfikujący kod. Jeśli masz konkretny powód, aby z niego korzystać, to tak, ale w przeciwnym razie makra wydają się być funkcją prawdziwego zabójcy. Edycja: Właśnie zdałem sobie sprawę, że w rzeczywistości są to te same funkcje.
Matt Olenik,
3
@Matt: Tak. FWIW, ostatnio natknąłem się na Nemerle, eksperymentalny język CR-CLR z makrami. nemerle.org . Myślę, że warto w pewnym momencie szturchnąć, tylko dla doświadczenia.
Paul Nathan
2
„Pragmatyzm. CL ma na celu załatwienie spraw przez pracujących profesjonalistów. Większość funkcjonalnych języków z reguły nie jest.”: Nie zgadzam się z tym stwierdzeniem. Jestem bardzo zainteresowany Lisp i staram się poświęcić trochę czasu na jego naukę. Uważam jednak, że inne języki FP są również bardzo skuteczne w „załatwianiu spraw”, przynajmniej takie były moje dotychczasowe doświadczenia ze Scalą i Haskellem.
Giorgio
1
„CL jest przeznaczony do wykonywania zadań przez pracujących profesjonalistów. Większość funkcjonalnych języków z reguły nie jest.”: Czy możesz to rozwinąć? Zwłaszcza w drugiej części zdania. Czy możesz podać kilka przykładów?
Giorgio
23

Lubię Lisp za to

  • ujednolicony, prosty i elegancki sposób reprezentowania zarówno kodu, jak i danych.
  • unikalny punkt widzenia, który daje mi kluczowe 80 dodatkowych punktów IQ za rozwiązywanie trudnych problemów (z napiwkiem dla Alana Kay)
  • niezwykle zwinne, interaktywne i konwersacyjne środowisko programistyczne
  • bezprecedensowa moc tworzenia i manipulowania abstrakcjami

Programowanie walczy ze złożonością. Abstrakcje są jedynym skutecznym narzędziem do walki z coraz większą złożonością (z naszą bardzo ograniczoną i stałą wielkością czaszki). Zarządzanie abstrakcjami za pomocą Lisp jest jak dżin z życzeniami n + 1.

Maglob
źródło
5
+1 za „Programowanie to walka ze złożonością. Abstrakcje to jedyne skuteczne narzędzie do walki z coraz większą złożonością (z naszym bardzo ograniczonym i stałym rozmiarem czaszki)”. (Chciałbym móc dać +10.)
Giorgio
Co to jest „niezwykle zwinne, interaktywne i konwersacyjne środowisko programistyczne”?
qed
6
Czy nie powinny to być (+ 1 n)życzenia, a nawet więcej praktyczności (incf n)?
Reb.Cabin
21

Uważam, że poprawna odpowiedź Lispa jest bardziej gnomiczna. Coś w stylu: „Jeśli musisz zapytać, nie jesteś gotowy”.

Następnie, jeśli ktoś zadaje dalsze pytania, prawidłowa odpowiedź to „tak”, jeśli jest to pytanie albo / albo „Nie jesteś gotowy”.

glenatron
źródło
5
Paul Graham cytuje Louisa Armstronga: „Jeśli musisz zapytać, co to jest jazz, nigdy się nie dowiesz”
Jason Baker,
25
+1. Chociaż czasami frazy takie jak „Jeśli musisz zapytać, nie jesteś gotowy”, myślę, że ten, kto tak mówi, po prostu nie może wyjaśnić
superM
5
@superM Lisp i języki funkcjonalne podobne do Lisp mają tę właściwość, że gdy się je pozna, nie można ich już wyjaśniać!
esoterik
18

Myślę, że przewaga Lisp w dziedzinie sztucznej inteligencji (AI), o której wszyscy wspominają, jest nieco historycznym wypadkiem ... Lisp zaczął dla / w AI, ale jest to język ogólnego przeznaczenia.

Wierzę, że szybkość wykonania nie jest jedynym ważnym aspektem języka (chociaż raz to zrobiłem). Jednak jednym z aspektów, które lubię w Lisp, jest to, że dla mnie łączy on Python i C. Mogę zacząć kodować bez deklaracji i prototypów natychmiast i bardzo szybko (środowisko uruchomieniowe i REPL są do tego bardzo ważne). Kiedy już coś uruchomię, dodaję deklaracje typu i stopniowo „optymalizuję” mój kod. Dziwne jest naciśnięcie klawisza w SLIME i obserwowanie języka maszynowego generowanego dla funkcji, która mnie interesuje. W Pythonie nie ma deklaracji typu, więc nie mogę uzyskać większej prędkości, ale w C szybkie wykonanie wszystkiego jest o wiele bardziej bolesne. Lisp jest bardzo przydatny w tym przypadku.

Powiedziawszy to, lubię Lisp głównie z powodu makr . Kiedy w końcu zrozumiesz, co mogą osiągnąć makra, myślę, że łatwo sobie radzisz z nawiasami. Ponadto redaktorzy tacy jak Emacs sami zarządzają nawiasami, więc nie musisz. Przyznaję jednak, że na początku nie znalazłem tak nawiasów i wiem, że niektórzy ludzie nie mogą ich znieść. Ale ponieważ głównym celem makr jest generowanie kodu w czasie kompilacji, kod w Lisp używa standardowej struktury danych, a nawiasy po prostu reprezentują kod jako listy, co jest niezbędne, aby makra były łatwe do napisania.

Nie znam żadnego innego języka, w którym można napisać małe podjęzyki, aby lepiej opisać swój problem z łatwością Lisp. Jest to zaleta, o której mówi Paul Graham w Beating the Averages . To ekstremalna modułowość i zwięzłość. W Javie muszę napisać dużo surowego tekstu, aby wyrazić jeden pomysł. W Lisp mogłem napisać kilka makr, które generują ten kod automatycznie, a następnie po prostu z nich korzystać. W każdym razie musisz zrozumieć kilka przykładów tego, a następnie osądzić sam. Kiedy go „zobaczyłem”, byłem zdumiony i nadal uważam, że Lisp jest najlepszym językiem tylko z tego powodu. Zawsze szukam makr w głównych językach, aby zobaczyć, czy pasują one do mocy makr Lisp, ale do tej pory nie znalazłem żadnej. Naprzód jest blisko sekundy.

Kończę kilkoma krytykami dotyczącymi oprogramowania biznesowego:

  1. Oprogramowanie biznesowe potrzebuje bibliotek i dobrych, a Lisp nie jest w tym dobry. Zwykle ich nie potrzebuję, ale kiedy to robię, muszę wybierać z niewielkiego wyboru niekompletnego oprogramowania, z którego korzysta kilka osób. Powinienem przyczynić się do rozwiązania tego, jak sądzę ...

  2. Oprogramowanie biznesowe jest zwykle budowane przez duże grupy ludzi i myślę, że makra mogą utrudniać komunikację, ponieważ zasadniczo zmieniają język. Wielu programistów lepiej czuje określone wzorce w kodzie, nawet jeśli tekst programu jest dłuższy i bardziej powtarzalny. Podejrzewam, że w ITA mają pewne zasady dotyczące makr lub mają ogromną bibliotekę makr, która ułatwia współpracę (lub, prościej, wszyscy programiści są ekspertami Lisp).

Pau Fernández
źródło
7
Spróbuj clojure, to jest seplenienie w JVM. Tak więc używając JVM możesz używać wszystkich rzeczy java.
Zachary K,
@zachary: Istnieją co najmniej 2 implementacje Common Lisp w JVM. ABCL jest stosunkowo dojrzały.
Larry Coleman
Clojure jest w 100% kompatybilny z Javą (przynajmniej nigdy nie znalazłem w Javie niczego, czego Clojure nie mógłby poprawić, i w taki sposób, że Javaists nie mogą narzekać). Na Clojure duży wpływ mają najlepsze z Common Lisp i najlepsze z FP. Dzięki temu, SBCL, CLisp i Emacs, każdy Lisper powinien dziś czuć się królem.
Reb.Cabin
13

Nie lubię Lispa.

(Podoba mi się wiele używanych pojęć, sposób, w jaki udostępnia on potężne techniki w sposób natywny i tak dalej.

Ale nigdy nie byłem przekonany, aby faktycznie go użyć ((chociaż kilka osób próbowało ), ponieważ korzyści z języka można uzyskać za pomocą innych języków programowania (niektóre bezpośrednio, niektóre pośrednio), więc nie ma wystarczających korzyści żeby zmusić mnie do poświęcenia czasu na naukę i znoszenie przerażającej składni.)))

Ale tak, z powodów, które niektórym się podobają, sprawdź poniższe pytania dotyczące przepełnienia stosu:

Prawdopodobnie jest jeszcze kilka podobnych pytań.

Peter Boughton
źródło
26
„Radzenie sobie z przerażającą składnią”. Być może minęło trochę czasu, odkąd byłem nowicjuszem Lisp, ale prostota i regularność składni Lisp to ogromna cecha, ponieważ dzięki temu mogę rozszerzyć Lisp sam w sobie. Mogę dodawać niestandardowe iteratory, mogę dodawać nowe konstrukcje zakresu „with-xxx”, które automatycznie usuwają się po sobie, aby programista nie musiał itp. Składnia jest funkcją, a nie błędem.
Michael H.
5
Możliwość samodzielnego rozszerzenia języka nie wymaga składni ograniczonej do pół tuzina znaków. Ponadto: „Składnia jest funkcją, a nie błędem” ? - Wiem. Nie nazwałam tego błędem.
Peter Boughton,
8
Okej, skąd czerpiesz korzyści z systemu makr? Ile języków pozwala zbudować dla nich rozszerzenie obiektowe w jednym dość krótkim rozdziale (Paul Graham, „On Lisp”).
David Thornley,
6
Składnia nie jest bardziej przerażająca niż w innych językach. Przekonałem się, że nawiasy po prostu wizualnie „znikają” po chwili. Przy dobrym wcięciu kod jest łatwo czytelny.
Barry Brown,
8
Ale możliwość łatwego przemieszczania się między S-exp wydaje się ogromna ... Jeśli chodzi o nawiasy, podoba mi się następujący cytat: Nawiasy? Jakie nawiasy? Od pierwszego miesiąca programowania Lisp nie zauważyłem nawiasów. Chciałbym zapytać ludzi, którzy narzekają na nawiasy w Lisp, czy przeszkadzają im wszystkie odstępy między słowami w gazecie ”- Ken Tilton
Cedric Martin
9

Zinterpretuję „Lisp” jako „ Common Lisp ”; Nie mam wątpliwości, że inne odpowiedzi powiedzą „ Schemat ”. (Wskazówka: Lisp to rodzina języków.)

Co oznacza „szybszy”? Jeśli chodzi o czas potrzebny na przeprowadzenie testu porównawczego, nie, nie jest on szybszy niż C ( ale może być ).

„Szybko”, biorąc pod uwagę, ile czasu zajmuje Joe Random Hacker napisanie działającego programu lub usunięcie błędu w dużym systemie oprogramowania? Prawie na pewno.

Jeśli chodzi o tego hakera, używam go, ponieważ chcę pisać kod, a nie bojler. Chcę coś napisać raz i nie powtarzać się ciągle. I chcę wchodzić w interakcje z programem podczas jego pisania.

Frank Shearar
źródło
Czy nie byłoby wspaniale, gdybyś mógł napisać w edytorze małą funkcję, która natychmiast zrobiłaby coś z resztą kodu? Czy możesz to już zrobić?
Mark C
4
@Mark: Myślę, że opisujesz Emacsa.
Ferruccio
@ Ferruccio Myślałem, że najpierw musisz uruchomić kod.
Mark C
2
@ Mark C: Cóż, musisz zaznaczyć region, a następnie M-x eval-region(lub eval-buffer), ale to wszystko.
Frank Shearar
1
@ MarkC: Ponadto, jeśli jesteś w buforze scratch , możesz po prostu napisać swoją funkcję i nacisnąć C-j(co jest moralnie równoważne z enterem), a zacznie obowiązywać natychmiast.
Tikhon Jelvis,
7

Lubię Lisp, ponieważ jest to doskonałe medium do wyrażania swoich myśli. Predykat dla mojego ulubionego języka brzmi: „Gdybym mógł wybrać coś do wyrażenia pomysłów, co by to było?”. Obecnie jest to Lisp * ( konkretnie schemat ), do tego stopnia, że ​​piszę w nim notatki programistyczne. Jak IRL , notatki papierowe i długopisowe. Nawet gdy myślę o programach, które muszę zaimplementować w PHP, Ruby lub Python.

To nie jest sztuczka, której sam się nauczyłem, ani coś, co robię dla nerdowej wiarygodności (i tak nikt nie może zobaczyć wnętrza mojego notatnika); tylko że Lisp jest więc znacznie bardziej naturalne dla mnie myśleć niż którykolwiek z alternatyw, a każdy język, który rezonuje z tobą, że głęboko to jeden skarb.

* Jednak podobnie jak w przypisie, Haskell dość szybko zamyka lukę, gdy dowiaduję się więcej.

Inaimathi
źródło
6

Problemem jest moc. Moc = praca (funkcjonalność programu) / czas

„Nie byliśmy w stanie wygrać z programistami Lisp; byliśmy za programistami C ++. Udało nam się przeciągnąć wielu z nich w połowie drogi do Lisp”.

- Guy Steele, współautor specyfikacji Java

Narysuj jakąś krzywą między C ++ a Javą. Idź dalej, aw pewnym momencie wzdłuż linii znajdziesz Lisp.

compman
źródło
2
Problem polega na tym, że tracisz dużo funkcjonalności C ++ idąc do Javy, ale podnosisz ją ponownie (często w ulepszonej formie), kiedy wybierasz się do Lisp.
David Thornley,
@DavidT Pytanie SO dotyczące tego konkretnego cytatu zawiera link do źródła (wyszukaj „zacytuj”). Cytat nie powinien być traktowany tak poważnie.
Mark C
@David: Jak makra. Nie chodzi tylko o to, że pominięto ich podczas przechodzenia na Javę (a więc C #), ale uczyniono ich brak „cnotą”. Makra są bardzo przydatne, jeśli buduję DSL na języku podstawowym.
Mike Dunlavey
@Mike Dunlavey: Naprawdę nie lubię makr w C ++ (cholera, nie lubię ich w C, ale nie mam tam dużego wyboru). Naprawdę lubię makra w Common Lisp. Wiesz, myślę, że moim problemem z tym komentarzem jest to, że lubię zarówno C ++, jak i Common Lisp o wiele bardziej niż Javę.
David Thornley,
@David: Jestem z tobą w 100% na makrach w Lisp. W C / C ++ są brzydkie i podatne na nadużycia, ale dla rodzaju ( wprawdzie frędzle ) rzeczy robię, są więc znacznie lepiej niż nic. Oczywiście, kiedy robię to w C ++, bardzo dobrze można to uznać za nadużycie, ale w Lisp jest ciepło uważane za sprytne. Domyśl.
Mike Dunlavey
6

Paul Graham sam odpowiada na to pytanie w What What Lisp Different .

Pamiętaj, że używał go do uruchamiania w połowie lat 90., więc Python i Ruby nie byli tak naprawdę dojrzali (a może nawet się nie urodzili).

Lisp ma w zasadzie wszystkie zalety języków dynamicznych i myślę, że w przypadku większości dzisiejszych aplikacji internetowych Python i Ruby są całkiem niesamowite i mają zalety frameworków i dokumentacji oraz dynamicznych społeczności.

Cechą zabójcy jest prawdopodobnie to, że cały program składa się z wyrażeń. Oznacza to, że możesz przekazywać bloki kodu do funkcji (lub makr ...), ponieważ blok kodu jest niczym więcej jak wyrażeniem.

Python nie ma dokładnie tej funkcji; musisz zdefiniować funkcje i przekazać je. Wydaje się, że Ruby ma bloki, być może jest nieco ograniczony w porównaniu do tego, co potrafi Lisp (nie jestem pewien).

hasen
źródło
Artykuł Paula Grahama jest interesujący, ponieważ poza kilkoma przedmiotami większość języków w dzisiejszych czasach wydaje się mieć funkcje, które wymienia. Więc może Lisp był wtedy bardziej przekonujący; czy obecnie jest to bardziej wartościowe, ponieważ język, który wprowadził te funkcje?
Andres F.,
AST jako składnia języka jest nadal domeną Lisp. Nie znam języka innego niż lisp, w którym makra mają cały dostępny język podczas kompilacji (tak, kompilator zasadniczo obsługuje wywołania makr w definicji makr, która sama jest programem Lisp. Chcesz tworzyć http i db w makrze w czasie kompilacji ?)
przemo_li
6

W przeszłości reagowałem gwałtownie na Scheme , ale teraz jestem gotowy dać szansę Lispowi ( właściwie Clojure ).

Widzisz, z biegiem lat wybrałem trochę języków takich jak Java, C #, C ++, Python i rzeczy nie są już trudne.

Clojure ma wiele obietnic, wydaje się być bardzo czysty i może rozwiązać wiele rzeczywistych problemów. Mocnym argumentem za czystym językiem, takim jak Clojure, jest pojawienie się komputerów wielordzeniowych.

Yay LISP!

EDYCJA: Oprogramowanie ITA zostało założone przez stopnie MIT, a Scheme / Lisp był jedynym językiem, którego nauczyło się wiele stopni MIT. Szczerze mówiąc, algorytmy Lisp można wymieniać podczas pracy w systemie produkcyjnym, co jest ogromnym plusem.

Job
źródło
8
Re: Rzeczy nie są już trudne - daj Haskellowi szansę i daj nam znać, co myślisz. Ponadto zawsze możesz spróbować nauczyć się INTERCAL dla odmiany!
Mark C
3
@ Mark C, przepraszam, ale nie dotykam INTERCAL. Wyzwanie nie jest jedynym kryterium; musi także być w stanie szybko rozwiązać prawdziwe problemy. Przynajmniej Haskell jest używany i kochany przez wielu.
Job
To oczywiście żart.
Mark C
1
Tak, aktualizowanie działającego kodu (ostrożnie!) Na serwerze produkcyjnym to jedna z radości Lisp. Python, przynajmniej kiedy się nim bawiłem, nie radził sobie dobrze; będziesz musiał ręcznie ponownie skompilować wszystkie funkcje / metody, które odnosiły się do twoich zmian, podczas gdy wszystkie implementacje Common Lisp sobie z tym poradzą. Używam tej samej mocy do programowania: pisz, testuj coś, edytuj, testuj - nie ma pętli kompilacji, a jeśli chcesz, możesz wziąć interaktywne testy i przekształcić je w testy jednostkowe.
Michael H.
@Job Zapomniałem ... PLEASE?
Mark C
6

W Lisp podoba mi się to, że wykracza poza paradygmaty. Niektórzy powiedzą, że Lisp jest funkcjonalny, inni powiedzą, że jest deklaratywny, a inni powiedzą, że to multiparadygmat. Myślę, że wszystko to nie ma sensu. Kiedy używasz Lisp, paradygmat nie jest już ograniczeniem.

Chcesz przedmioty? Możesz je mieć. Chcesz programowania funkcjonalnego? Możesz to mieć. Chcesz programowania logicznego w stylu Prolog ? Napisz kilka makr. Chcesz deklaratywne programowanie w stylu SQL? Idź po to. Chcesz zastosować paradygmat, który nie został jeszcze wynaleziony? Jestem pewien, że da się to zrobić w Lisp.

Oprócz języków podobnych do Forth , jeszcze nie widziałem, aby inny język oferował ten poziom elastyczności.

Jason Baker
źródło
+1 Programowanie wielu paradygmatów, dekady przed F #, bardzo dobry punkt.
Orbling
Chciałbym móc to głosować dziesięć razy. Nie ma łyżki ... nie ma paradygmatu ... Z wielką dokładnością opisuje moje odczucia dotyczące Common Lisp :)
MadPhysicist
5

„Szybciej” nie jest prostą rzeczą do zmierzenia - naprawdę zależy od tego, który aspekt jest testowany. W zależności od zadania i implementacji Lisp, prędkości mogą zbliżyć się do C. Spójrz na Great Benchmarking Shoot-Out, aby poznać szczegóły. Implementacja Lisp w SBCL jest na równi z serwerem Java 6 i jest znacznie szybsza niż Ruby lub Python.

Ale czysta prędkość nie jest głównym powodem wyboru języka programowania - gdyby tak było, wszyscy nadal programowalibyśmy w języku asemblera , prawda? Dla mnie codzienną radością Lisp jest to, że kod jest kompilowany, ale nie muszę usuwać aplikacji, rekompilować wszystkiego, a następnie zacząć działać od zera. Zamiast tego mogę zmienić jedną funkcję i ta zmiana zacznie obowiązywać wszędzie i od razu widzę efekt w mojej aplikacji. Co więcej, to bardzo szybkie podejście „pisz, testuj, pisz więcej, testuj więcej” znacznie ułatwia testowanie od razu podczas pisania kodu (a następnie możesz przekształcić te interaktywne sondy w testy jednostkowe później).

Wyobraź sobie pisanie wiadomości e-mail, w której po każdym wierszu trzeba było nacisnąć przycisk, aby skompilować dane wyjściowe wiadomości e-mail na ekranie przed kontynuowaniem myślenia. To jest dla mnie pisanie w Javie lub innym takim języku. Czasami jest ku temu powód i lubię Javę w porządku, ale Lisp jest po prostu bardziej responsywny i łatwiej jest wykonać pracę.

khedron
źródło
Gdybym dzisiaj zaczynał od nowa, prawdopodobnie wybrałbym Ruby - odziedziczył on większość natury Lisp, ale ma bardziej nowoczesne biblioteki i jednego życzliwego dyktatora, który popycha go do przodu. Ale to nie było pytanie OP.
Michael H.
Na początek wybrałem ruby, a teraz próbuję nauczyć się nowego.
Philodadad
5

Uczę się Lisp ( newLisp ) z kilku powodów.

Powód numer jeden: Lisp sprawia, że ​​myślę inaczej, co czyni mnie lepszym koderem Ruby.

Wydaje się bardzo niewygodne robić pewne rzeczy w Lisp, na przykład zagnieżdżoną iterację, aby przejść przez wiele list. Zmusza mnie to do używania innych rzeczy, takich jak map. Mój ulubiony język, Ruby, ma tę samą metodę mapowania, ale nie zawsze go używam, ponieważ jest nieznany: nauczyłem się robić rzeczy przy użyciu złej techniki, a kiedy język obsługuje tę technikę, nadal ją używam.

Powód drugi: Lisp jest praktyczny i ma dobre nowoczesne biblioteki.

Istnieje bardzo ładna, lekka platforma internetowa dla newLisp o nazwie dragonfly . To pozwala mi używać kodu newLisp zamiast PHP do niektórych zadań. Naprawdę nie lubię PHP, a newLisp wydaje się bardziej zabawny w tym konkretnym zadaniu niż Ruby.

Powód trzeci: Lisp jest spójny pod względem składniowym i koncepcyjnym.

Dla mnie jest to duża różnica między Ruby a Pythonem, spójność.

filozof
źródło
+1: „Lisp jest spójny pod względem składniowym i koncepcyjnym”. To bardzo ważna cecha języka. Niektóre źle zaprojektowane języki nie są spójne, są jak duży zbiór idiomów zebranych w pewnej kolejności (mam na myśli jeden język, ale nie wymienię go :-)). Lisp jest pod tym względem bardzo konsekwentny. Jak tylko będę miał trochę czasu, na pewno spróbuję się tego nauczyć.
Giorgio
4

Czy możesz powiedzieć „Lojalność wobec marki”?

Zacząłem w Fortranie. Kocham to.

Przełączyłem się na Lisp. Na początku nienawidziłem tego. Potem nauczyłem się go kochać i nienawidzić Fortrana.

Później Pascal, C, C ++, różne asemblery, C #. (Właściwie nie kocham C #.)

Chyba jestem kapryśna?

Mike Dunlavey
źródło
4

Kiedy stworzono Lisp, zaczęli od matematyki, a nie informatyki (która tak naprawdę jeszcze nie istniała). A zespół Lisp NAPRAWDĘ miał pewne rzeczy. Lisp miał śmieci w 1960 roku! Naprawdę świetnie się spisali.

Myślę, że obejmuje ją piosenka The Eternal Flame .

Zachary K.
źródło
Tak, najwyraźniej Lisp był pierwszym językiem GCed.
Mark C
2

Dużą atrakcją jest społeczność. Od czasu wynalezienia języka Lisp przyciągnął najbardziej ambitnych i bystrych programistów. Wszędzie tam, gdzie badacze próbują rozwiązać problemy, które nigdy nie zostały rozwiązane, prawdopodobnie znajdziesz Lisp, tak jak w badaniach sztucznej inteligencji (AI), wizji komputerowej, planowaniu, reprezentacji wiedzy i złożonej optymalizacji heurystycznej. Język nadaje się do rozwiązywania problemów zarówno od dołu do góry, jak i od dołu do góry, co wydaje się pomagać w stawianiu czoła najbardziej włochatym wyzwaniom.

Kompensowalna składnia za pomocą makr oznacza, że ​​rzadko trzeba rozszerzać definicję języka. Wiele rzeczy, które wymagałyby rozszerzenia języka w bardziej ograniczonym języku, to tylko makro z Lisp. Dlatego programiści Lisp mogą swobodnie korzystać z nowo opracowanych koncepcji językowych bez nowego standardu językowego i niekoniecznie z prawdziwą karą za szybkość. Na poziomie podstawowym ryzki kodu płyty kotłowej są niepotrzebne przez małe rozszerzenia. Całkowicie nowe pomysły w przepływie sterowania, takie jak ujednolicenie stylu Prolog, są wdrażane wydajnie i kompaktowo jako rozszerzenia.

System OOP, CLOS , jest klasą samą w sobie pod względem elastyczności. Po spróbowaniu bardzo trudno jest wrócić do podstawowej wersji C ++ / Java / C # OOP. Wzory  projektowe GoF 5 stają się niepotrzebne, ponieważ można je wyrazić w prosty i bezpośredni sposób.

Język nie ma ani jednego właściciela korporacyjnego ani jednej ostatecznej implementacji, chociaż ma standard ANSI z wieloma zgodnymi implementacjami. Najważniejsze nowe wdrożenia pojawiają się co dekadę, a stare wciąż są dość aktywne. Eksperci mogą planować wykorzystać swoją specjalistyczną wiedzę przez długi czas. Powoduje to pewne anarchistyczne tarcia i rozdrobnienie społeczności, ale oznacza również, że dywan nie może być wyciągnięty, a język nie może stać się konający z powodów politycznych lub korporacyjnych. Zawsze pracuje się nad wieloma implementacjami komercyjnymi i open source. Te bardziej nastawione na wydajność regularnie porównują w ramach 2x współczynnik najszybszych, silnie finansowanych implementacji języka imperatywnego.

Piętą achillesową wczesnej komercjalizacji Lisp był ślad pamięci, aby uwzględnić zarówno funkcje bezpieczeństwa typu języka, jak i zaawansowane środowiska programistyczne, które one obejmowały, z niesamowitymi funkcjami, takimi jak pełna dokumentacja online, w tym grafika. 64- megapikselowa maszyna Symbolics Lisp nie była opłacalna w stosunku do stacji roboczej Sun o pojemności 8 MB. Dzisiaj ceny pamięci RAM spadły i istnieje ogromne zainteresowanie językami Lisp, szczególnie biorąc pod uwagę, że główne języki Java, C # i PHP rozwinęły się dziś tylko minimalnie w porównaniu do tych sprzed 30 lat.

Współczesne języki konkurują z Lisp o udostępnianie myśli inteligentnym programistom: Python, Lua , Erlang , Haskell i OCaml . Ale żadna z nich nie oferuje takiego samego połączenia dojrzałości, elastyczności, wielu implementacji zgodnych ze standardami i szybkości.

bcaulf
źródło
1

Nie robię Lisp. Ale miejsce, w którym pracuję, zawiera elementy skończone z milionami linii, głównie Fortran. Facet, którego najbardziej szanuję w obliczeniach (kody obliczeniowe mechaniki płynów ) uważa, że ​​idealną kombinacją jest Lisp na zewnątrz (głównie dlatego, że unikasz bałaganu z zarządzaniem pamięcią) i Fortran dla algorytmów niskiego poziomu (Fortran najlepiej nadaje się do wykorzystania możliwości wektorowe SSE / AVX i uważamy, że to prawdopodobieństwo raczej nie zostanie zamknięte).

Peter Mortensen
źródło