2012-10-29 5 views
11

Czy ktoś może wyjaśnić, jakie są konkretne problemy z użyciem pakietu cl w elicie? Jako nowy programista w emacsie mam wrażenie, że popełniam błąd za każdym razem, gdy sięgam po opcję (wymagam "cl"). Przeczytałem i zrozumiałem problem kompilacji bajtów z pakietem cl. Przyjrzałem się starym argumentom i nie chcę ich ożywić. Nie szukam też ogólnego komentarza na temat tego, czy pospolite seplenienie jest lepsze niż x seplenienie marki.Jak najlepiej korzystać ze zwykłego seplenienia w elicie (jeśli w ogóle)?

To, co chciałbym wiedzieć, to jak używać pospolitego septepu, aby każdy napisany przeze mnie fragment miał dużą szansę na zaakceptowanie przez większość koderów. W szczególności, czy powinienem unikać całkowicie wspólnego seplenienia, czy też są pewne części języka, które są akceptowane przez wszystkich i niektóre części, w których znaczna większość programistów szydzi i szydzi?

Nie chcąc ograniczać szerokość odpowiedź, to:

(mapcar (lambda(x) (* x x)) '(1 2 3)) 

dużo bardziej do przyjęcia niż to:

(require 'cl) 
(loop for el in '(1 2 3) collect (* el el)) 
+1

Byłoby wspaniale, aby uzyskać komentarz od każdego, kto nie lubi pospolitego seplenienia (a może nie ma żadnego i mit jest odpadł). –

+3

Pakiet CL nie jest Common-Lisp, więc możesz go polubić, a nie lubić drugiego. Lubię wiele części tego, co oferuje pakiet CL, ale są inne części, które są problematyczne z różnych powodów. Nowa biblioteka 'cl-lib' w Emacs-24.3 czyści przestrzeń nazw, więc nie musimy się przejmować, czy' cl-lib' jest dobre czy nie. Część CL, której nie lubię, ma związek z funkcjami Common-Lisp, które nie pasują do implementacji "prostego interpretera", więc mogą powodować nieoczekiwane koszty wydajności. (plus kilka funkcji, których implementacja jest błędna) – Stefan

Odpowiedz

8

Podczas korzystania z wielu bibliotek zewnętrznych i pisanie niektórych mój własny kod eLisp, nigdy nie spotkałem się z sytuacją, gdy użycie pakietu CL spowodowało konflikt nazwy. Kusiło mnie więc do stwierdzenia, że ​​argument przeciwko używaniu CL jest niczym innym, jak purytanizmem (w pierwotnym sensie tego słowa, nie znaczącym religijną stroną rzeczy).

Ale jeśli planujesz bardzo długo wsparcie i chcesz mieć jakąś kopię zapasową, oto co bym zrobił (ale nie robię tego sam, ponieważ naprawianie błędów po ich złamaniu wydaje się być lepszą taktyką). Dla funkcji w pakiecie CL, którego używasz, utwórz specjalny plik, w którym wszystkie mają prefiks , aby mieć prefiks cl-. Na przykład, zamiast mieć (position ...), będziesz miał (cl-position ...). Teoretycznie zaoszczędzisz problem kompatybilności w przód. Jednak funkcje nie są usuwane natychmiast, otrzymasz ostrzeżenie przed czasem, gdy będą przestarzałe, i będziesz mieć dużo czasu na aktualizację. Do ciebie naprawdę.

Makro pętli w Common Lisp jest kontrowersją samą w sobie, nie jest typową konstrukcją dla języka i dlatego na przykład istnieje biblioteka iteracyjna. Wymaga to również nauki "pętli mini-języka", aby dobrze z niego korzystać, co jest raczej małym językiem specyficznym dla danej domeny, a tak naprawdę nie ma wymogu, aby ten rodzaj konstrukcji używał jednego. ALE, pętla ma swoje mocne strony. Funkcje przetwarzania list, takie jak mapcar lub reduce, będą ci dobrze służyć w bardziej trywialnych przypadkach, takich jak te, które masz w swoim przykładzie, ale w mniej błahych przypadkach loop będzie lepszym, a także mniej gadatliwym sposobem robienia tego samego.

4

Czy czytasz makra section instrukcji? Używanie makr, takich jak Twój przykład, jest całkowicie w porządku.

Ale można użyć eval-when-compile wokół wymagania.

Faktycznie (eval-when-compile (require 'cl)) pojawia się 66 razy tylko w folderze głównym w moim folderze Emacs.

+0

Tak Przeczytałem sekcję makr i przejrzałem kod makra w pakietach. Wciąż czekam na moment "aha", kiedy znajdę problem, który zakłada rozwiązanie makro. –

+0

Bez problemu _needs_ rozwiązanie makro. Dość kilka można uprościć za pomocą makr. Jest to raczej przykład clojure niż elisp, ale napisałem makro, aby wyodrębnić wszystkie statyczne pola klasy java w celu odsłonięcia go w mojej własnej przestrzeni nazw. "Rozwiązaniem" bez makr byłoby zapisywanie powiązań jeden po drugim ... – Cubic

4

Jeśli nie planujesz zintegrować swojego kodu w Emacs, użyj pakietu CL i umieść ten fragment w swoim numerze .emacs, aby wyłączyć ostrzeżenia.

(byte-compile-disable-warning 'cl-functions) 

Uwaga: Można znaleźć kilka rad na temat programowania w elisp na nicferrier's blog.

Powiązane problemy