Gdzie nauczyć się praktycznego korzystania z Common Lisp [zamknięte]


79

Jestem programistą C ++ próbującym nauczyć się Common Lisp. Przejrzałem kilka książek, takich jak Land of Lisp i przeczytałem wiele artykułów online o różnych zaletach Lispa. Potrzebuję jednak porady.

Prawie wszystko, co przeczytałem o Common Lisp, wiąże się z tym, jak niesamowity jest on i jak niesamowicie szybko można z nim robić rzeczy i jak niesamowicie rozwiązał wiele problemów ze współczesnymi językami programowania 30 lat temu. Poza tym, jak niesamowite są makra i jak każdy paradygmat programowania (OO, funkcjonalny, oparty na aktorach itp.) Może być użyty w Lispie i jak listy są ostateczną strukturą danych. Zasadniczo traktując Lispa jako język badawczy i mówiąc, jak bardzo jest inny i rewolucyjny.

I wszystko to prawdopodobnie jest prawdą, ale problem polega na tym, że nie widziałem zbyt wielu rzeczy, jak robić praktyczne rzeczy, takie jak czytanie pliku i dzielenie go na słowa i przetwarzanie na nim. Nie jestem zainteresowany nauką Common Lisp ze względu na naukę Common Lisp, ale ze względu na to, że rzeczy, które robiłem w C ++, były wykonywane szybciej i z mniejszą liczbą błędów.

Moje pytanie brzmi więc, jakie jest najlepsze źródło (czy to strona internetowa, książka, cokolwiek), które koncentruje się na nauczaniu używania Common Lisp do wykonywania typowych zadań programistycznych, takich jak

  • Jak czytać pliki
  • Jak czytać plik, zamieniać słowa w pliku i zapisać wynik z powrotem do pliku
  • Iteruj pliki w katalogu i innych elementach systemu plików
  • Interakcja z bazą danych SQL
  • Komunikuj się przez gniazda
  • Tworzenie wątków dla rzeczy takich jak serwer WWW
  • Twórz GUI
  • Wykonuj operacje na plikach binarnych
  • Napisz parser (nie interpreter Lispa w Lisp, co, jak rozumiem, jest jak 5 linii Lispa)
  • Interakcja z systemem operacyjnym (tj. Rzeczy napisane w C lub C ++), aby robić rzeczy, których Lisp nie może robić natywnie
  • Jak pisać rozszerzenia Lisp w C (czy to możliwe?)
  • Osadź interpreter lua (czy to możliwe?)

A także mniej od razu praktyczna uwaga, jak zaimplementować wspólne struktury danych w lispie, takie jak sterta, stos, drzewo wyszukiwania binarnego itp. Jednak może to być po prostu użycie operacji listowych Lispa w taki sam sposób cari cdrwe właściwy sposób. Nie wiem

Bardzo wątpię, czy cokolwiek z tego (z nieprawdopodobnym wyjątkiem dwóch ostatnich na liście) jest niemożliwe w przypadku Lispa lub ludzie nie pokochaliby tego tak bardzo. A wyżej wymienione rzeczy, które przeczytałem, wspominają o wielu prawdziwych programach napisanych w Lisp (przychodzi na myśl sklep internetowy Yahoo!).

Jednak mając programowanie w ( tym? ) Języku imperatywnym wcześniej, nie mogę się doczekać wykorzystania nowej wiedzy, którą otrzymam, do pisania aplikacji w świecie rzeczywistym. Jaki jest więc najszybszy sposób na naukę pisania praktycznego oprogramowania za pomocą Lispa?

Nawiasem mówiąc, widziałem Praktyczny Common Lisp Petera Seibela, ale sądząc po TOC, porusza on tylko niektóre rzeczy, których chciałbym się nauczyć używać Lispa.

Jeszcze jedno pytanie, jeśli mogę (przepraszam, jeśli jest to połączenie dwóch pytań w jedno), gdzie mogę znaleźć odniesienie do funkcji i rzeczy Lispa?

I naprawdę chcę polubić Lispa.


3
Miłe pytanie. Sam, będąc programistą C ++, tego lata uczyłem się Lispa, głównie z książkami zaproponowanymi w odpowiedziach. Do tej pory bardzo szczęśliwy, ale wciąż radzę sobie z makrami. On Lisp autorstwa Paula Grahama to prawdziwy klejnot. Ponadto, materiał na temat Emacs Lisp pomaga ogólnie w śledzeniu Lispa, jak również pozwala na pisanie naprawdę użytecznych skryptów z poziomu samego edytora.
Diego Sevilla

Obecnie istnieje obszerna strona Common Lisp Resources na stronie Getting Started w Common Lisp w Docs.SO.
Gustav Bertram

Istnieje również aktualna książka kucharska Common Lisp . Jednak jego spis treści nie jest jeszcze tak obszerny, więc wyszukujemy niesamowite i nowoczesne biblioteki na liście Awesome CL . I +1 dla „Przepisów CL” E. Weitza.
Ehvince

Odpowiedzi:


95

Proponuję przeczytać „ Practical Common Lisp ”, ponieważ zawiera ona już odpowiedzi na niektóre z Twoich pytań.

Prawdopodobnie powinieneś przeczytać trzy do czterech książek :

Common Lisp Reference

Instrukcje

Teraz następną rzeczą, którą powinieneś sprawdzić, jest podręcznik implementacji Lispa. Opisuje wiele konkretnych rozszerzeń: sieci, wątki, ...

Dokumentacja dla implementacji Common Lisp:

SLIME (oparty na Emacs Lisp-IDE) ma SLIME User Manual .

Dokumentacja dla bibliotek Common Lisp:

Biblioteki

W przypadku bibliotek użyj

Spójrzmy teraz na niektóre z Twoich punktów:

  • Jak czytać pliki

Zobacz słownik plików i strumieni w HyperSpec . WITH-OPEN-STREAM, READ, READ-LINE, READ-CHAR, READ-BYTE, READ-SEQUENCE, ...

  • Jak czytać plik, zamieniać słowa w pliku i zapisać wynik z powrotem do pliku

Użyj powyżej. Zobacz też: NAPISZ i pokrewne.

  • Iteruj pliki w katalogu i innych elementach systemu plików

Patrz wyżej. KATALOG, nazwy ścieżek, ...

  • Interakcja z bazą danych SQL

Użyj na przykład biblioteki CLSQL.

  • Komunikuj się przez gniazda

Zobacz instrukcję swojego Lispa lub użyj jednej z przenośnych bibliotek. Zobacz Quicklisp.

  • Tworzenie wątków dla rzeczy takich jak serwer WWW

Zobacz instrukcję swojego Lispa lub użyj jednej z przenośnych bibliotek. Zobacz Quicklisp.

  • Twórz GUI

Zależy. Zobacz Quicklisp lub bibliotekę specyficzną dla implementacji.

  • Wykonuj operacje na plikach binarnych

Aby uzyskać informacje o operacjach na plikach i strumieniach, zobacz Hyperspec. WRITE-BYTE, READ-BYTE. Otwórz strumień jako strumień binarny.

  • Napisz parser (nie interpreter Lispa w Lisp, co, jak rozumiem, jest jak 5 linii Lispa)

Użyj do tego jednego z istniejących narzędzi. Przestudiuj istniejące parsery. Istnieje wiele parserów napisanych w Lisp, ale niewiele w książkach na ten temat (poza parserami języka naturalnego, które są opisane w literaturze AI).

  • Interakcja z systemem operacyjnym (tj. Rzeczy napisane w C lub C ++), aby robić rzeczy, których Lisp nie może robić natywnie

Zależy. Zobacz Quicklisp lub bibliotekę specyficzną dla implementacji.

  • Jak pisać rozszerzenia Lisp w C (czy to możliwe?)

Zależy. Zobacz Quicklisp lub bibliotekę specyficzną dla implementacji. -> FFI

Końcowa rada: przeczytaj kod od innych autorów.

Przestudiuj inny kod Lispa. Istnieje wystarczająco dużo zróżnicowanego kodu Lispa. Od serwerów internetowych po oprogramowanie do komponowania muzyki.


2
Wygląda na to, że wiele rzeczy jest związanych z implementacją. Czy istnieje coś takiego jak C, które nie jest specyficzne dla implementacji, ale specyficzne dla systemu operacyjnego ? Wydaje się, że niewykonalne jest zmuszenie wszystkich, którzy chcą Twojego kodu, do korzystania z wybranej przez Ciebie implementacji. Nie interesuje mnie też sztuczna inteligencja.
NewLisper

4
@NewLisper: istnieje wiele bibliotek przenośnych. Zobacz Quicklisp.
Rainer Joswig

4
@NewLisper: nawet jeśli nie jesteś zainteresowany sztuczną inteligencją, powinieneś przeczytać trochę literatury, ponieważ opisuje ona podejście „programowania symbolicznego”, dla którego wymyślono Lisp.
Rainer Joswig

2
@NewLisper: To jest całkiem kompletna odpowiedź. Lisp jest bliżej Pythona w związku z wywołaniami OS i C / C ++. Mówi się, że złożenie FFI (obcego interfejsu funkcji) jest całkiem proste. Warto również zauważyć, że wydaje się, że większość użytkowników Common Lisp w sieci wydaje się używać SBCL.
Paul Nathan

2
Dodałbym kilka konkretnych bibliotek: gniazda: usocket; serwer WWW: hunchentoot; gwintowanie: nici bordeaux, chanl; Interakcja z systemem operacyjnym / łączenie elementów C: CFFI, UFFI.
Svante

6

Sprawdź Cliki, wiki Common Lisp , zawiera listę bibliotek dostępnych dla Common Lisp, które pomogą ci osiągnąć wszystkie twoje pozycje.

Będziesz także chciał sprawdzić Common Lisp Cookbook (jest też bardziej zaktualizowana wersja ). Ma kilka kodu dla typowych zadań, takich jak czytanie jedną linię plik na raz i interfejsów funkcjonalnych obce dla interakcji z bibliotek napisanych w C .

Możesz pisać rozszerzenia dla Lispa w C w zależności od używanej implementacji. Na przykład Emacs-Lisp pozwala ci to zrobić, chociaż nie jest to Common Lisp. Zwykle to, co chcesz zrobić, to napisać kod w Common Lisp, a następnie zoptymalizować go tak bardzo, jak to możliwe, używając różnych deklaracji kompilatora Lisp lub innej metody, w której używasz obcego interfejsu funkcji.

Wątkowanie zależy od używanej implementacji, ale myślę, że większość z nich ma teraz wątki.

Hunchentoot jest jednym z najlepszych serwerów internetowych Lisp i jest dość łatwy do rozpoczęcia. Nie musisz samodzielnie pisać żadnego kodu wątków, wystarczy napisać funkcje obsługi żądań HTTP.

Ktoś skompilował listę opcji GUI dla Lispa :

  • cl-gtk2, interfejs do biblioteki GTK gui
  • McClim
  • Granat
  • Wspólne Qt
  • EQL

1
Common Lisp Cookbook wygląda naprawdę użytecznie. Jak powiedziałem drugiemu facetowi, wydaje się, że wiele rzeczy jest związanych z implementacją. Nie wydaje się sprawiedliwe, aby każdy, kto chce mieć możliwość uruchomienia kodu, używał tej samej implementacji, której używasz. Czy tak właśnie jest?
NewLisper

Tak, tak to jest, niektórzy próbują trzymać się standardu ANSI Common Lisp lub próbują trzymać się bibliotek, które działają w wielu implementacjach, więc nie jest to zbyt kłopotliwe.

Czy tracisz zdolność robienia wielu rzeczy, jeśli trzymasz się ANSI Common Lisp, takich jak system plików, rzeczy sieciowe itp.?
NewLisper

Lisp ułatwia pisanie przenośnych bibliotek na podstawie specyficznych dla implementacji API, więc nie martwiłbym się tym.
Pavel Penev

Hej, czy mógłbyś zmienić adres URL książki kucharskiej na lispcookbook.github.io/cl-cookbook ? To ta sama treść, ale w dużej mierze ulepszona, przestarzałe rzeczy usunięte i w lepszym kształcie. Zobacz jego historię Git! Dzięki.
Ehvince
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.