Czy LISP jest nadal użyteczny w dzisiejszym świecie? Która wersja jest najczęściej używana?

117

Staram się uczyć nowego języka programowania w regularnych odstępach czasu. Niedawno przeczytałem, jak Lisp i jego dialekty znajdują się na przeciwległym końcu spektrum od języków takich jak C / C ++, co mnie zainteresowało, aby dowiedzieć się więcej na ten temat. Jednak dwie rzeczy są dla mnie niejasne i szukam wskazówek na ich temat:

  1. Czy LISP jest nadal praktykowany / używany w dzisiejszym świecie, czy jest to język starszego typu, taki jak FORTRAN / COBOL? Mam na myśli, że oprócz utrzymania istniejącego kodu, jest on w ogóle wykorzystywany w nowych projektach?

  2. Jaki jest najczęściej używany dialekt? Spotkałem Scheme i Common Lisp jako 2 najbardziej rozpowszechnione dialekty i chciałem poznać Twoją opinię na temat tego, który z nich jest najbardziej uprzywilejowany / przydatny do nauki - i byłbym niezmiernie zadowolony, gdybyś mógł zasugerować jakieś zasoby dla początkującego rangi.

Choć chętnie uczę się języka, który zasadniczo różni się od języków proceduralnych, do których jestem przyzwyczajony, nie chcę inwestować w coś, jeśli jest całkowicie przestarzały - nadal bym się go uczył, gdyby był zawodowo „martwy”, ale tylko z perspektywy akademickiej ...

TCSGrad
źródło
10
Jestem bardzo zainteresowany tym pytaniem. Od czasu do czasu, kiedy mam czas, decyduję się na naukę Lisp. I za każdym razem, gdy przeszkadzają mi te same pytania i niepewności, o które tu pytasz. Jakiej wersji Lisp powinienem się nauczyć? Czy ktoś (oprócz Paula Grahama) naprawdę używa Lisp? Czy powinienem nauczyć się Lisp, czy jednego z nowszych funkcjonalnych języków programowania, takich jak Haskell? Jakie są zalety Lisp nad Scheme itp. Itd.
Channel72
Practical Common Lisp: gigamonkeys.com/book
Joe Internet
"nadal"? (Żartuję!)
jhocking
Właśnie znalazłem ten inny powiązany wątek na SO: stackoverflow.com/q/1614724/212942
TCSGrad

Odpowiedzi:

59

Raczej podoba mi się Scheme, jeśli chcesz pracować z JVM, powinieneś sprawdzić Clojure, który jest seplenieniem zaprojektowanym do pracy w JVM. I tak, Lisp wciąż warto nauczyć się, jak potężny może być tak minimalny projekt! Ludzie, którzy stworzyli seplenienie, mieli naprawdę pewne rzeczy. To niesamowite, ile fajnych nowych funkcji współczesnych języków wypaczało się w latach sześćdziesiątych!

W przypadku osadzonego schematu wypróbuj podstęp: http://www.gnu.org/s/guile/

Zachary K.
źródło
Czy istnieje dialekt, który działa dobrze w C / C ++, ponieważ jestem przede wszystkim facetem w C ++? Czy mógłbyś również wspomnieć o niektórych zasobach dla początkującego stopnia, aby rozpocząć naukę tego dialektu?
TCSGrad
10
Najlepsze książki do nauki to „The Little Schemer” i „SICP” mitpress.mit.edu/sicp . Istnieje wiele implementacji schematów, które można osadzić w c / c ++, ale tak naprawdę nie wiem, które z nich są dobre w tych dniach, więc być może będziesz musiał zrobić trochę google.
Zachary K
1
Powinienem zauważyć, że schemat jest bardzo prosty! nauczysz się około 90% języka w ciągu 2 godzin. Oczywiście nie oznacza to, że go opanujesz, po prostu będziesz wiedział, jak działa składnia.
Zachary K
5
@ shan23 Program został zaprojektowany do nauczania. Można go bez wątpienia wykorzystać do nauczenia studentów pierwszego roku programowania, więc nie mam wątpliwości, że nie będziesz miał problemów z nauką tego. Jeśli chcesz zintegrować C lub C ++, spójrz na Guile ( en.wikipedia.org/wiki/GNU_Guile ).
Vitor Py
1
Książka języka programowania Kenta Dybviga nie jest może tak sławna, ale jest bardzo ładną książką. schemat.com/tspl4 Jeśli korzystasz z Emacsa, przydaje się nauka Lisp.
blispr
68

W odpowiedzi na pytanie 2 „Najczęściej używany dialekt”:

Zależy od tego, jak interpretujesz „Najczęściej używane”. Oto matematyka na serwetki dla niższych granic tego, ile wykorzystują każdy z wybranych dialektów.

Najczęściej napisany kod

  • Prawdopodobnie Schemat (wszystkie dialekty) z powodu aplikacji edukacyjnych
    • 270 szkół ... Zgadnijmy 50 uczniów / rok, 500 linii kodu / uczeń, 10 lat z rzędu. Ponad 1 000 000 linii opartych na matematyce serwetkowej.
    • 500 000 linii Racket w samym Racket i jego narzędziach.
  • Prawdopodobnie Common Lisp ze względu na AI i całą masę kodu open source i kodu produkcyjnego (patrz kod produkcyjny).
  • Prawdopodobnie Emacs Lisp z powodu ...
    • Sam Emacs: ponad 1 000 000 linii
    • Liczba emacs lisp napisanych publicznie - 237 modułów, około 200 linii / modułów to ponad 40 000 linii tylko na EmacsWiki, prawdopodobnie znacznie więcej w ELPA
    • Plus aplikacje napisane w emacs Lisp, plikach .emacs itp.
  • Clojure
    • Trudno oszacować. Przeważnie mniejsze dotcomy. Może być dużo.

Zwycięzca: Scheme lub Common Lisp. Zbyt wiele niewiadomych.

Większość kodu „produkcyjnego”

Zwycięzca: Zgaduję Common Lisp . Myślę, że możemy odpowiedzieć „Tak” na pytanie 1 w oparciu o użycie Common Lisp i Clojure.

Większość użytkowników końcowych

  • Common Lisp
    • Klienci ITA Software, w tym Orbitz, Bing Travel i Kayak.com - prawdopodobnie miliony.
  • Clojure
    • Citigroup (brak szczegółów), Akamai (brak szczegółów), simple.com, wiele innych. Prawdopodobnie miliony.
  • Schemat
    • Studenci CS, badacze i hobbyści. Mniej niż bazillion.
    • Seria Uncharted - ponad 5 milionów
  • Emacs Lisp - głównie programiści, głównie na platformach unix. Może być milion.

Zwycięzca: Schemat ma najlepszą dolną granicę tutaj, ponieważ w Uncharted istnieją liczby sprzedaży, ale jest dość dyskusyjne.

Wniosek

Podsumowując, uważam, że duże jabłka.

Jesse Millikan
źródło
4
Nie małe pomarańcze? A może cytryny?
Vatine
Rzeczywiście schemat - szczególnie schemat rakietowy - wydaje się być najbardziej aktualnym dialektem seplenieckim. Profesjonalne narzędzia i biblioteki.
Bikal Lem
@Bikal Chciałbym, żeby obsługa OpenGL nie była tak przestarzała, ale wtedy tryb bezpośredni nie jest największą wadą mojego kodu rakiety ...
Jesse Millikan
Nie miałem pojęcia, że ​​Orbitz używał CL ... Wiem, gdzie szukać mojej następnej pracy: D
Rig
2
W Racket napisano dużo ponad 100 000 LOC. Standardowa biblioteka / IDE / narzędzia rakiety to ponad 500 tys., A ponadto jest używana w firmach takich jak SET, Boeing i Naughty Dog.
Sam Tobin-Hochstadt
43

Czy LISP jest nadal praktykowany / używany w dzisiejszym świecie, czy też jest to język starszej generacji?

Tak, ale musisz wiedzieć, gdzie szukać. Ludzie, którzy używają LISP, nie krzyczą zbyt głośno na ten temat, ale jest kilka przykładów kilku głośnych startupów, które wykorzystały go z wielkim skutkiem w ciągu ostatnich 20 lat. Jest również bardzo popularny wśród małych firm w Europie.

Jaki jest najczęściej używany dialekt?

To ważne pytanie, ale odpowiedź na nie jest trudna. Odpowiedź może również nie być szczególnie użyteczna: wiele wdrożeń ma określony cel, więc najlepiej wybrać je, jeśli pasują one do konkretnego problemu, a nie na podstawie tego, jak szeroko jest on używany. Zamiast tego opowiem ci trochę o twoich opcjach i możesz sam zdecydować.

LISP jest rodziną języków, a każdy z tych języków ma rodzinę dialektów i implementacji. Zasadniczo dialekty dzielą się na dwa obozy „LISP” i „Schematy”.

LISP: Do niedawna królem był Common LISP. Była to próba ujednolicenia wszystkich różnych LISP-ów i, nie bez uprzejmości, była „C ++” LISP-a. To znaczy, to był OGROMNY język. Miał wszystko. W ciągu ostatnich kilku lat pojawił się Clojure. Clojure to LISP, który działa na wirtualnej maszynie Java i próbuje zakorzenić się w filozofii programowania funkcjonalnego. Tradycyjnie inne LISP były ściśle paradygmatem. Clojure jest interesujący, ponieważ dostaje zarówno najlepsze, jak i najgorsze z LISP i JVM. Wciąż jest dużo gadatliwości języków opartych na Javie i są one dość bezpłatne i łatwe w składni, dzięki czemu ma wiele pokręteł i przycisków do różnych rzeczy, ale mają kilka naprawdęciekawe pomysły dotyczące typów danych, zwłaszcza niektóre praktyczne sposoby, w jakie wymyślili, aby zastosować pomysły z programowania funkcjonalnego.

Schematy: Schematy są ścisłym podzbiorem LISP. Schemat został wynaleziony przez Steele i Sussmana i we wczesnym okresie życia był znany z zastosowania w kursie wykładowym MIT Computing 101. Schemat jest zdefiniowany w „Poprawionym raporcie n n na temat algorytmu języka algorytmicznego (RnRS)”. Tak: mają tam żart z matematyki. Schemat jest znormalizowanym językiem w taki sposób, jak inne LISP. Pomaga to znacznie w przenośności między implementacjami, ale nie jest to srebrna kula. Wysiłki w zakresie standaryzacji były zwykle konserwatywne, a innowacje we wdrożeniach, szczególnie wokół takich rzeczy, jak moduły, bywały zróżnicowane. Istnieje również seria SRFI (Scheme Requests Implementation), która jest podobna do procesu RFC IETF. Ludzie używają go do standaryzacji drobiazgów według potrzeb.

Schematy różnią się od LISP tym, że mają zestaw twardych wymagań, które muszą spełnić, jednym z nich jest „optymalizacja wywołania ogonowego”, która pomaga zwiększyć efektywność rekurencji. Dlatego rekurencyjne style programowania są znacznie bardziej popularne w Schemacie niż w LISP. Schemat również nie jest nieuprzejmy, podobnie jak „C” LISP. Oznacza to, że są to małe języki i powinieneś być w stanie zachować to wszystko na raz.

Obecnie istnieją dwie rodziny schematów: te oparte na piątej wersji (R5RS) i rodziny oparte na szóstej wersji (R6RS). Złożoność R6RS była znacznie większa niż w przypadku któregokolwiek z jego poprzedników i tak wiele implementacji R5RS zdecydowało się go pominąć, mając nadzieję, że R7RS będzie bardziej podobny do R5RS niż R6RS. Proces standaryzacji R7RS jest obecnie w toku i starał się uwzględnić zarówno pragnienia osób wdrażających R5RS, jak i te z ludu R6RS poprzez ujednolicenie małego podstawowego języka w pierwszej grupie roboczej, a następnie zlecenie drugiej grupie roboczej w celu ustandaryzowania większych funkcji. Dzięki temu język będzie miał wydajne i przydatne implementacje zarówno na niewielkim sprzęcie wbudowanym, jak i na bardziej wydajnych maszynach.

Teraz będę bardziej konkretny:

PicoLisp to naprawdę fajny LISP. Jest malutki! Autor napisał to dla siebie i, jak rozumiem, zarabia na tym od lat 80. Jeśli kiedykolwiek będziesz miał okazję uczestniczyć w jego rozmowie, powinieneś to zrobić: jest naprawdę interesujący i naprawdę zna się na swoich rzeczach, a nie dostaniesz nawet najmniejszego powąchania z głównego nurtu lub nudy.

Nie znam implementacji Common Lisp, więc nie będę ich więcej komentował.

Guile jest oficjalnym programem GNU.

Rakieta jest schematem R6RS, ale ostatnio wydaje się, że poszerzyła sieć i próbuje „służyć jako platforma do tworzenia, projektowania i wdrażania języków”.

Kurczak ma być praktycznym programem. Jest oparty na R5RS i kompiluje się do C. To okazuje się naprawdę, naprawdę ważną zaletą, ponieważ sprawia, że ​​korzystanie z istniejących bibliotek C jest absolutnie trywialne. Dlatego Chicken jest prawdopodobnie najbardziej użytecznym schematem zastępującym Perla, Pythona, Ruby itp. Jako codzienny język skryptowy. Jest kilka osób, które korzystały z niego wyłącznie do swoich potrzeb od kilku lat. Ma interaktywny REPL, a także kompilator. Społeczność (zarówno na liście mailingowej, jak i IRC) jest kompetentna, przyjazna i pomocna.

Poszukaj implementacji z dużą ilością modułów: pokazuje to, że jest szeroko użyteczna i oznacza, że ​​prawdopodobnie będzie miała coś, co pomoże w wykonywanym zadaniu.

Poszukaj implementacji z kompilatorem lub przynajmniej czegoś, co nie jest oparte wyłącznie na IDE lub REPL. Wiele implementacji zaprojektowanych do nauczania jest bardzo trudnych w użyciu do skryptów ogólnego przeznaczenia.

Polecam kurczaka, ponieważ tego właśnie używam. Użyłem go w swoich osobistych projektach i wykorzystałem (i obecnie go używam) profesjonalnie.

Nie chcę inwestować w coś nadmiernego wysiłku, jeśli jest całkowicie przestarzały - nadal bym się go uczył, gdyby był zawodowo „martwy”, ale tylko z perspektywy akademickiej ...

Schemat nie jest zawodowo martwy, ale być może będziesz musiał zrobić wszystko, aby użyć go w tym kontekście. Coś takiego jak Kurczak jest czymś znacznie więcej niż akademickim zajęciem i może z łatwością objąć prawie wszystkie podstawy języków wysokiego poziomu, których obecnie używasz.

andyjpb
źródło
3
Rakieta nie jest programem R6RS; jest jeden z języków dostępnych w dystrybucji rakiet. Rzeczywisty język Racket to Schemat, który odbiega od RnRS na wiele ważnych sposobów (co do których mam mieszane uczucia).
JasonFruit
27

Naprawdę nie mogę mówić w imieniu wszystkich Lisps, ale Clojure jest obecnie zdecydowanie gorącym i odpowiednim językiem. Grupa użytkowników londyńskiego Clojure, do której pojechałam wcześniej w tym tygodniu, miała ponad 100 uczestników ....

Odkryłem, że jest to bardzo pouczające doświadczenie w nauce Lisp w postaci Clojure w ciągu ostatniego roku (po wielu doświadczeniach z Javą i C #). Głównymi przyczynami tego są:

  • Kładzie duży nacisk na programowanie funkcjonalne (bardziej niż większość innych Lisps). Autor i BDFL Rich Hickey często cytowali Haskella jako jedną z jego inspiracji do projektowania języka, co oznacza, że ​​otrzymujesz takie rzeczy, jak w pełni niezmienne struktury danych i leniwe nieskończone sekwencje itp.
  • Metaprogramowanie makr - filozofia Lisp „kod to dane” jest trudna do zrozumienia, chyba że faktycznie tego doświadczyłeś, ale jest to jeden z powodów, dla których Lisps jest tak wyrazisty i produktywny
  • Fantastyczne wsparcie dla wielordzeniowej współbieżności - tak naprawdę uważam, że Clojure jest obecnie najlepszym językiem do programowania współbieżnego. Zobacz http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey, aby uzyskać pouczającą prezentację na ten temat

Wydaje się również, że jest praktycznym wyborem do rzeczywistego wykorzystania produkcyjnego z następujących powodów:

  • Uruchamianie JVM z bardzo łatwą interoperacyjnością Java daje dostęp do wszystkich bibliotek i narzędzi w ekosystemie Java
  • Domyślnie jest to język dynamiczny , co czyni go bardzo wygodnym do programowania i szybkiego prototypowania przy użyciu praktycznie żadnej płyty kotłowej. Możesz jednak dodać wskazówki typu statycznego, aby uzyskać całkiem dobrą wydajność tam, gdzie jest to potrzebne.

Osobiście znam osoby korzystające z Clojure w kilku bankach inwestycyjnych i startupach. 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 :-)

mikera
źródło
9

Obecnie uczę się także Lisp (i uwielbiam to). Korzystam z Common Lisp, ale też pomieszałem z SBCL , Arc (uwaga, to jest wersja Lispa Paula Grahama, która, jak wspomniał Vitor Braga, stworzyła sklep Yahoo / Viaweb) i Allegro CL, który jest podobny do Visual Studio dla Lisp (może tworzyć GUI, jednak nigdy go nie używałem).

Jeśli chodzi o zastosowania, Lisp był często używany w Sztucznej Inteligencji, ale szczerze mówiąc, nie jestem pewien, ile innych „ogólnych” zastosowań Lisp. Wiele stron internetowych, które zostały zbudowane w Lisp, zostały pierwotnie napisane w innych językach, więc trudno powiedzieć, że jest on używany do tworzenia stron internetowych (nie mówiąc, że nie jest, ale większe witryny, które go używają, już nie robią ). Po przeprowadzeniu szybkiego wyszukiwania (bardzo szybko) znajduje się lista oprogramowania napisanego w Common Lisp z Wikipedii .

[EDYCJA] Jeśli chodzi o profesjonalne korzystanie z Lisp, istnieją prace, które pozwoliłyby Ci korzystać z Lisp. Nie są tak liczne, jak powiedzmy zadania Java lub C #, ale istnieją. Myślę, że Lisp jest jednym z tych języków używanych w aplikacjach wewnętrznych i może zapewnić przewagę konkurencyjną, której firmy nie chcą rezygnować z reklam, które używają Lisp. Pamiętam, że widziałem post na P.SE, który stwierdził, że Smalltalk jest podobny na arenie finansowej.

Ponadto, pokazując, że potrafisz nauczyć się różnych paradygmatów, może otworzyć więcej drzwi, nawet jeśli nie używasz Lisp w pracy.

„Lisp jest warte nauki dla głębokiego doświadczenia oświecenia, które będziesz mieć, kiedy w końcu go zdobędziesz; to doświadczenie sprawi, że będziesz lepszym programistą do końca swoich dni, nawet jeśli tak naprawdę nigdy nie korzystasz z samej Lisp”. - Eric Raymond, „Jak zostać hakerem”

[/EDYTOWAĆ]

Jetti
źródło
7
FWIW, SBCL jest implementacją Common Lisp, podobnie jak Allegro CL.
Vatine
@Vatine - miałbyś rację. Gdyby była rumieniąca się twarz, zrobiłbym to teraz. Nie wiem, dlaczego założyłem, że są inni. Głupi mnie inny kompilator! = Inny dialekt :) Dzięki!
Jetti
@Jeff: Cóż, oba rozszerzają język w różnych kierunkach, pozostawiając „rdzeń CL” interoperacyjny.
Vatine
@Jetti Czego używałeś w pierwszej kolejności?
Mark C
Myślę, że korzystałem z CLISP, to było na obrazie VM, którego już nie mam. Myślę, że moja niewiedza sprawiła, że ​​uwierzyłem, że BYŁO powszechne seplenienie. Przynajmniej teraz wiem lepiej.
Jetti
8

Jeśli chcesz nauczyć się Lisp dzisiaj, rzuciłbym okiem na rakietę, która jest szybkim wdrożeniem schematu (no cóż, właściwie trochę odstąpiła od schematu, więc jest teraz własnym dialektem) lub clojure, który korzysta z JVM, na którym działa (więc gazilliony bibliotek są dostępne, a ponadto możesz zmusić go do interakcji z własnym kodem Java).

Nawet jeśli nie nauczysz się go właściwie używać, nauka jest zawsze korzystna: uczysz się nowych sposobów myślenia i radzenia sobie z problemami, nawet w innych językach, po tym, jak opuścisz umysł wokół Lisp.

Fabien
źródło
3
Problem ze Schematem polega na tym, że kiedy zaczniesz ćwiczyć z nim, nie chcesz wracać do innych języków. Właśnie zacząłem implementować strumienie (być może nieskończone, leniwie oceniane, niezmienne sekwencje) w C ++ i to o wiele więcej kodu niż w Scheme! Byłem naprawdę zaskoczony kombinacją prostoty i mocy Scheme.
Giorgio
++ dla rakiety. To naprawdę jest niesamowicie ZUPEŁNE, co jest jedną z krytyków innych programów. I wykracza poza to, co można zrobić w zakresie tworzenia własnych języków.
Scott Klarenbach
7

Znaczna część backendu Amazon była kiedyś w Lisp, ale teraz została przepisana w C ++, a przynajmniej tak słyszałem (muszę przyznać, że nie mam na to wiarygodnego źródła).

Wieśniak! Sklepy to jeden z klasycznych przykładów aplikacji internetowych Lisp. Od Yahoo! Przechowuje sławę, którą mogłeś słyszeć o Paulu Grahamie . Graham jest jednym z najbardziej znanych zwolenników Lispa i pisze obszernie na ten temat. Możesz przeczytać jego stronę, aby poznać jego punkty.

AutoCAD miał dialekt Lisp dla swojego systemu makr. Nie wiem czy nadal tak jest.

Schemat to czysty język i bardzo elegancki. To chyba mój ulubiony język programowania, więc mogę być stronniczy. Gdybym miał teraz napisać ważną aplikację, prawdopodobnie napisałbym aplikację szkieletową w C, rozszerzyłbym i zdefiniował reguły biznesowe w Schemacie. To pozwala mi korzystać ze Schematu i wykorzystywać C - dla szybkości i czystej dostępności bibliotek dla prawie wszystkiego.

Vitor Py
źródło
Co poleciłbyś jako początkową książkę / kompilator dla Scheme? Używam Linuksa, więc jeśli jest jakiś edytor, który jest szczególnie przydatny dla nowicjuszy (jak Kile jest dla LaTex), daj mi znać ...
TCSGrad
1
@ shan23 Mały Schemer ( ccs.neu.edu/home/matthias/BTLS ) to najlepszy wybór. Wierzę, że emacs jest najpopularniejszym edytorem Scheme, ale przyzwyczajenie się do niego zajmuje trochę czasu.
Vitor Py
1
Edytor lisp, to proste, użyj emacsa. Zostało napisane przez seplenienia, i w seplenieniu.
Zachary K
Możesz także użyć Racket IDE ( racket-lang.org ); jest podobny do Emacsa, ale ma automatyczne formatowanie i interakcję z interpretatorem schematu.
Jeremiah Willcock
Lispbox ( common-lisp.net/project/lispbox ) działa od razu po wyjęciu z pudełka (użyteczne jest trochę doświadczenia z emacsem). Opiera się na ccl ( ccl.clozure.com ), patrz także gigamonkeys.com/book/…
Giorgio
4

Czy LISP jest nadal praktykowany / używany w dzisiejszym świecie, czy jest to język starszego typu, taki jak FORTRAN / COBOL? Mam na myśli, że oprócz utrzymania istniejącego kodu, jest on w ogóle wykorzystywany w nowych projektach?

Znam kilku facetów, którzy robią Lisps w niektórych startupach w Dolinie Krzemowej i wiem, że Amazon.com używa Lisp od samego początku (choć słyszałem, że z jakiegoś powodu zastępują go C ++?)

Ale jedną firmą, na którą trzeba uważać, jest Naughty Dog . Wszystkie ich gry są napisane dialektem Lisp. Początkowo wyrzucili własne, ale używają MZScheme w serii Uncharted.

Jaki jest najczęściej używany dialekt? Spotkałem Scheme i Common Lisp jako 2 najbardziej rozpowszechnione dialekty i chciałem poznać Twoją opinię na temat tego, który z nich jest najbardziej uprzywilejowany / przydatny do nauki - i byłbym niezmiernie zadowolony, gdybyś mógł zasugerować jakieś zasoby dla początkującego rangi.

Założę się, że Common Lisp, Clojure, Scheme i Emacs Lisp są czterema najczęściej używanymi dialektami, a spośród nich podejrzewam, że Schemat jest najczęściej wdrażany. Oczywiście nie mam nic na poparcie tego. :)

Raczej podoba mi się SICP i Mały Schemer, jak sugerują inni, ale sugerowałbym także Land of Lisp , który jest raczej zabawną lekturą. :)

greyfade
źródło
Rzeczywiście, Land of Lisp to niesamowita lektura.
Chiron
@ 4bu3li Nie masz pozytywnej opinii?
Mark C
1
O Naughty Dog: To nie do końca poprawne, ich gry na PS2 zostały napisane w GOAL, języku przypominającym seplenienie ... Ale od czasu przejścia na PS3 przeszli na C ++. MZScheme jest używany głównie jako preprocesor makr, napisany zgodnie z C ++ i wykorzystywany do przetwarzania zasobów, a niektóre z ich skryptów są napisane w S-exp. Ale żaden kod MZScheme nie działa na PS3.
Arelius
2

Myślę, że częściowo zależy to od tego, co chcesz z tym zrobić - jeśli chcesz pogłębić swoją wiedzę na temat różnych koncepcji programowania i stać się lepszym programistą, powiedziałbym, że warto nauczyć się przynajmniej odrobiny Lisp. Jeśli szukasz innego języka do dodania do CV w celu znalezienia pracy z tym językiem, prawdopodobnie chcesz poszukać gdzie indziej. Nie ma zbyt wielu miejsc pracy w Lisp.

Osobiście próbuję użyć SBCL lub nowszej, Clojure (i niektórych Emacs Lisp, ale htat, ponieważ jestem długoterminowym użytkownikiem Emacsa - starałbym się nauczyć Emacs Lisp, gdy spróbuję nauczyć się Lisp). Teraz muszę tylko znaleźć czas na zabawę w tych językach ...

Timo Geusch
źródło
1
Jest to przede wszystkim pierwszy ... ponieważ jest całkiem oczywiste, że jeśli mi się to uda, to z pewnością nie zaszkodzi moje CV :). Ale tak na poważnie, chcę spojrzeć na różne „style” programowania, więc mam dobry pomysł, który z nich zastosować w różnych scenariuszach (nie chcę wpadać w sytuację, że będąc wyposażonym tylko w młotek, Wszystkie problemy muszę traktować jak paznokcie !!)
TCSGrad
2

Nie wiem, czy w LISP jest mnóstwo miejsc pracy, na pewno ich nie widzę. Pamiętam jednak, jak długo czytałem o sondach NASA, w których działały LISP i były w stanie wstawić nowy kod z Ziemi.

Również w Nowym Jorku grupa spotkań clojure jest ogromna. Zgaduję, że jeśli jesteś zainteresowany i przejdziesz do grupy spotkań clojure, możesz znaleźć możliwości nawiązania sieci i znalezienia pracy (nie oferty clojure, ale rzeczy takie jak Java / C ++ / itp.). Wydaje się być absolutnie ogromny w rejonie Nowego Jorku, inne obszary mogą się różnić.

LISP to także inny sposób myślenia. Dodatkowo zarówno LISP, jak i SQL powodują użycie wielu zagnieżdżonych wyrażeń. Użyłem ton SQL i zauważyłem, że LISP ma więcej sensu. Ale jeśli masz problemy z przyzwyczajeniem się SQL do super zagnieżdżonych nawiasów i wyrażeń podczas korzystania z LISP, prawdopodobnie znacznie ułatwi to zrozumienie wyrażeń SQL.

Klasycznym przykładem jest sposób implementacji MAX (a, b, c). Możesz wykonać skomplikowaną funkcję za pomocą szeregu instrukcji if. Lub możesz po prostu powiedzieć

MAX (MAX (a, b), c)

i użyj dwóch prostych zagnieżdżonych wywołań elementu MAX, który dla mnie jest łatwiejszy do odczytania. Chociaż jeśli wydajność stanowi problem, możesz chcieć to zrobić również w drugą stronę, nie zadałem sobie trudu policzenia liczby porównań przy użyciu każdej metody ... Również jeśli wdrażasz MAX za pomocą makra C lub innej metody, która ocenia wyrażeń wiele razy, możesz nie otrzymać oczekiwanego wyniku, ponieważ wyrażenie może być oceniane wielokrotnie, więc uważaj ze skutkami ubocznymi ...

Cervo
źródło
3
Możesz faktycznie uprościć MAX przezMAX(MAX(a b) c)
Andrea
Masz rację, właśnie to dostaję za odpowiedź wkrótce po przebudzeniu. Poprawiłem odpowiedź.
Cervo,
2
Projekt NASA to Deep Space 1: flownet.com/gat/jpl-lisp.html
Frank
2

Dwa dodatkowe punkty:

Po pierwsze, Lisp to świetny język do pisania kodu, w którym interakcje między funkcjami lub danymi są często złożone. W wielu popularnych językach, jeśli masz wątpliwości co do tego, dlaczego twój program robi to, co robi, musisz napisać specjalne funkcje, które pozwolą ci zbadać wewnętrzny stan programu. W niektórych językach musisz poczekać na rekompilację kodu. Oczywiście mogą istnieć narzędzia takie jak debuggery, które mogą w tym pomóc. Jednak w Lisp wszystko czego potrzebujesz to sposób na zatrzymanie programu, a następnie zazwyczaj masz dostęp do wszystkiego w Lisp. W Common Lisp czasami po prostu wpisuję ^ C lub dzwonię naerrorw jedną funkcję (która jest jedyną rzeczą, którą należy ponownie skompilować i nie trzeba nic robić, aby ją ponownie skompilować). Po zatrzymaniu programu jestem natychmiast wrzucany do debugera - ale debuger daje mi całą moc Lisp i mogę wyjść z debugera, wywołać określone funkcje itp. Mogę łatwo zbadać dowolną strukturę danych w moim programie. Większość programów powinna dopuszczać podobne praktyki. Lisp nie jest pod tym względem wyjątkowy, ale to, co oferuje, wykracza poza to, co oferuje wiele popularnych języków.

Po drugie: jeśli zamierzasz eksperymentować z dowolnym dialektem Lisp, nie zrobiłbym tego bez (a) użycia edytora pasującego do nawiasów i (b) nauczenia się prawidłowego wcięcia Lisp. Dobrym pomysłem byłoby skorzystanie z edytora, który przybliża również odpowiednie wcięcie. Formatowanie kodu w stylu C / C ++ / Java jest zaprojektowane dla języków z mniejszą liczbą nawiasów / nawiasów klamrowych / nawiasów niż Lisp. Ładny styl drukowania Lisp działa dobrze, gdy się go zaznajomisz, i nie kończysz się na nawiasach lub marnujesz połowę miejsca, umieszczając jeden zamykający nawias na linię.

Mars
źródło
1

W tej chwili mam wrażenie, że Lisp jest najczęściej używany w sklepach konsultingowych (nie że sklepy konsultingowe najczęściej go używają).

Praktyczne oprogramowanie jest uważane za nieco lepsze. Głównie dlatego, że ludzie nie są do tego przyzwyczajeni.

Tradycyjnie Schemat jest dość akademickim dialektem Lisp, a Common Lisp był dialektem branżowym.

Lisp jest szczególnie przydatny w przypadku manipulacji symbolicznych i możliwości tworzenia refleksji.

Na przykład kod, który napisałem, aby nauczyć się Lisp, był programem, który konstruował losowe funkcje lambda, oceniał je, a następnie działał na nich, próbując zminimalizować różnicę funkcji względem funkcji docelowej. Wszystko to było bezpośrednią manipulacją. W języku takim jak C ++ lub Java musiałbym wymyślić reprezentację funkcji, którymi mógłby manipulować komputer.

Paul Nathan
źródło
Ciekawe, co powiedziałeś o różnicach między Scheme / Common Lisp - czy mógłbyś wyjaśnić dlaczego / jak to zrobić?
TCSGrad
1

Chciałbym dodać trochę perspektywy na temat Common Lisp i Scheme. Unikałem clojure z powodu JVM, więc nie mam na to wiele perspektyw.

Schemat to piękny zwięzły, dobrze zdefiniowany język. Podjęło wiele decyzji, które CL musiał podjąć ze względu na dziedzictwo, i przyjęło bardziej czyste podejście. Na przykład zmienne i funkcje znajdują się w tej samej przestrzeni nazw. Domyślny język jest mniejszy i bardziej zwięzły, co dobrze sprawdza się w nauce rzeczy, w których lisp jest dobry, na przykład wywiera nacisk na użycie rekurencji zamiast iteracji, ponieważ domyślnie nie ma pętli iteracyjnych i wymaga optymalizacji wywołania ogona . Schemat ma bardzo interesujący higieniczny system makro, którego nauka jest bardzo ważna. Ale IMO poleciłbym najpierw naukę makr niehigienicznych w stylu CL, z których większość (?) Schematów programowych oferuje przynajmniej jedną implementację, nawet jeśli nie jest to częścią specyfikacji. Ponieważ wydaje się, że bardzo chcesz nauczyć się języka dla nauki, ja ”

Powiedziawszy to, społeczność Scheme jest podzielona i poza kilkoma niewielkimi kieszeniami wydaje się, że jest głównie poświęcona badaniom nad wykonaniem prawdziwej pracy ... Na przykład każdy dialekt ma własnego menedżera pakietów, a pakiety najczęściej nie są przenośne przez dialekty, co jest ogromnym problemem w społeczności schematów.

Z drugiej strony Common Lisp wydaje się być bardziej pragmatycznym podejściem do rozwijania języka. Standard jest taki, że między implementacjami można przenosić dużo kodu lisp, wiele kompilatorów jest szybkich i dobrze zoptymalizowanych. Istnieje duży zestaw pakietów, z których wiele jest przenośnych między implementacjami. I pozornie (stosunkowo) duża liczba prawdziwych produktów powstaje w tym języku. Dzięki powiedzeniu quicklisp zarządzanie pakietami jest dość zbliżone do tego, co można uzyskać w nowoczesnej społeczności, takiej jak np. Ruby lub Node. CL nie jest jednak pozbawiony wad, ma w tym momencie bardzo dużą specyfikację w porównaniu ze schematem, a nawet jego system obiektowy CLOS, coś, co tradycyjnie jest pisane jako biblioteka w Lisps, jest częścią specyfikacji IIRC. I możesz poczuć, że dziedzictwo jest zakorzenione w dużej ilości systemu.

W przeciwnym razie powiedziałem, że nie mogę mówić o clojure, a Emacs Lisp jest wyraźnie właściwym wyborem, jeśli twoim celem jest napisanie rozszerzeń Emacsa, i całkiem wyraźnie nie jest właściwym wyborem dla innego oprogramowania.

TLDR; Jeśli Twoim celem jest nauka, polecam Schemat. Jeśli jednak chcesz stworzyć oprogramowanie, polecam Common Lisp z dwóch głównych wariantów Lisp.

Arelius
źródło
BTW, PLT Racket to język, który jest bardziej podobny do schematu i pochodzi ze społeczności schematów, która wydaje się próbować być przydatna do prawdziwej pracy. Gdybym teraz napisał kod w schemacie, prawdopodobnie byłby to albo PLT, albo Schemat kurczaka, ale później może to być spowodowane słabością w moim sercu.
Arelius
0

Wiele się nauczyłem z odpowiedzi. Dziękuję wszystkim, którzy przyczynili się do tej pouczającej rozmowy.

Powinienem wspomnieć o newLISP . Chociaż różni się nieco zarówno od CL, jak i schematu, implementuje wiele bardzo przydatnych funkcji. Uważam, że serwer http, funkcja wielu procesów (Cilk) i funkcje zdalnej oceny są bardzo czyste i łatwe w użyciu.

Pojedynczy plik wykonywalny jest mały, szybki i zawiera wiele fajnych baterii.

CyberFonic
źródło
Prawdopodobnie warto o tym wspomnieć, ale nie poleciłbym tego dokładnie ... Bez zakresu leksykalnego i na przykład modułów - poważnie? Naprawdę nie rozumiem, co próbuje osiągnąć newLISP.
cji
2
Masz rację - jest inaczej. Wykorzystuje konteksty i dynamiczne określanie zakresu. Z mojego doświadczenia wynika, że ​​moduły i konteksty są ze sobą powiązane. Nie próbuje być innym CL ani Schematem. Czytanie strony na temat jej różnic ( newlisp.org/index.cgi?page=Differences_to_Other_LISPs ) rzuca światło na problemy projektowe. Podobnie, nie poleciłbym tego nikomu, kto chce doświadczenia CL lub Scheme. Ale w niektórych przypadkach może to być dobry wybór. To jest piękno ekosystemu open source - duży wybór!
CyberFonic
0

Kolejnym czynnikiem, który należy wziąć pod uwagę przy wyborze dialektu Lisp do nauki, może być liczba i jakość wdrożeń. Jeśli dialekt ma tylko jedną lub dwie implementacje, utkniesz z ich wadami, dopóki nie zostaną naprawione, i zawsze istnieje szansa, że ​​ludzie przestaną dopracowywać implementację. Sam w sobie nie jest to powód, aby nie używać dialektu Lisp z pojedynczą implementacją, ale należy wziąć to pod uwagę. Zaletą Scheme i Common Lisp jest to, że istnieje wiele implementacji tych dialektów. Oba języki opublikowały standardy, więc stosunkowo niedawne implementacje prawdopodobnie uruchamiają ten sam kod. Niektóre z tych wdrożeń istniały już od dłuższego czasu, ale wciąż są w fazie aktywnego opracowywania: są to obecnie wysokiej jakości wdrożenia i wciąż są udoskonalane.

Marsa
źródło
Cóż, zgodnie z tymi testami Clojure radzi sobie nieźle w porównaniu z SBCL: benchmarksgame.alioth.debian.org/u32/…
AndreasScheinert
Dzięki Andreas. Masz rację. Pokazuje, ile wiem o JVM - niewiele. Po części zostałem wprowadzony w błąd przez ABCL, stosunkowo wolny, ale poza tym miły CL oparty na JVM.
Mars
Kłócę się, jeśli chcesz Lisp na JVM, idź po Clojure. To nie jest idealne, ale to prawdziwa przyjemność (IMHO)
AndreasScheinert