Jak wygląda przepływ pracy w Lisp? [Zamknięte]

39

W tej chwili uczę się Lisp, pochodzę z języka, jakim jest Lokomotywa BASIC -> Z80 Assembler -> Pascal -> C -> Perl -> C # -> Ruby. Moje podejście polega na jednoczesnym:

  • napisz prosty skrobak sieciowy, używając SBCL, QuickLisp, closure-html i drakma
  • obejrzyj wykłady SICP

Myślę, że to działa dobrze; Rozwijam dobre „gogle Lisp”, dzięki czemu mogę dość łatwo czytać Lisp. Dbam też o to, jak działa ekosystem Lisp, np. Quicklisp dla zależności.

Jednak tak naprawdę brakuje mi wyczucia, jak naprawdę działa doświadczony Lisper .

Kiedy koduję .NET, mam Visual Studio skonfigurowane z ReSharper i VisualSVN. Piszę testy, wdrażam, refaktoryzuję, popełniam. Potem, kiedy mam dość tego, by ukończyć historię, piszę kilka AUAT. Następnie uruchamiam wersję Release TeamCity, aby przekazać nową funkcjonalność klientowi w celu przetestowania i, mam nadzieję, zatwierdzenia. Jeśli jest to aplikacja, która wymaga instalatora, używam WiX lub InnoSetup, oczywiście budując instalator za pośrednictwem systemu CI.

Moje pytanie brzmi: jako doświadczony Lisper, jak wygląda Twój przepływ pracy? Czy pracujesz głównie w REPL, czy w edytorze? Jak przeprowadzasz testy jednostkowe? Ciągła integracja? Pakowanie i wdrażanie? Kiedy siadasz przy biurku, parując kubek kawy z jednej strony i oprawione w ramkę zdjęcie Johna McCarthy'ego z drugiej, co robisz ?

Obecnie czuję, że mam do czynienia z kodowaniem Lisp, ale nie rozwojem Lisp ...

Duncan Bayne
źródło
2
To pytanie wydaje się nie na temat, ponieważ jest ankietą i prawdopodobnie przyciągnie odpowiedzi, które nie zapewnią trwałej wartości dla witryny.

Odpowiedzi:

13

Większość osób na comp.lang.lisp i Lisp Forum poleca połączenie Emacsa i SLIME, zakładając, że nie chcesz płacić za komercyjne wdrożenie takie jak Allegro lub LispWorks. Film SLIME ilustruje proces pracy. Używam Emacsa i SLIME do tworzenia osobistych programów w domu, a połączenie może być bardzo wydajne.

SLIME zapewnia integrację Emacsa i REPL. Zazwyczaj ładuję wszystkie moje pliki, a następnie otwieram ten, nad którym pracuję w Emacsie. Po wpisaniu lub zmianie każdej funkcji naciskam przycisk C-x C-e, który wykonuje definicję funkcji w REPL. Następnie mogę przejść do bufora REPL i wypróbować tę funkcję. Cała historia REPL jest dostępna i edytowalna przy użyciu standardowych sekwencji klawiszy Emacsa, dzięki czemu łatwo jest powtarzać wywołania funkcji o różnych parametrach.

Larry Coleman
źródło
4

Pracuję głównie z Clojure, a oto moja konfiguracja:

  1. Eclipse IDE (używam tego, ponieważ wykonuję również dużo pracy w Javie, czasami w tym samym projekcie co Clojure)
  2. Wtyczka dla Clojure przeciwnie do ruchu wskazówek zegara (obejmuje REPL)
  3. Maven do zarządzania zależnościami i kompilacją
  4. Egit do kontroli kodu źródłowego

Przebieg pracy podczas kodowania jest zwykle taki:

  1. Otwórz REPL, ładując wszystkie bieżące pliki źródłowe
  2. Kod i test w REPL
  3. Kiedy jestem zadowolony z kodu, skopiuj / wklej z powrotem do pliku źródłowego
  4. Czasami zrestartuj REPL (albo gdy nieodwracalnie pomieszałem przestrzeń nazw, albo po prostu sprawdzam, czy wszystko nadal działa w plikach źródłowych)
  5. Napisz również testy w plikach źródłowych, które są uruchamiane automatycznie przez każdą kompilację Maven. Czasami nieformalne testy, które właśnie przeprowadziłem w REPL, zamieniają się bezpośrednio w testy jednostkowe.
  6. Zatwierdź itp. W tym momencie - prawie zwykły przepływ pracy programistycznej

Ogólnie rzecz biorąc, nie różni się zbytnio od zwykłego przepływu pracy Java / C # poza bardziej interaktywnym użyciem REPL podczas programowania.

mikera
źródło
Może możesz wspomnieć o nrepl + emacs: o ile wiem, daje środowisko bardziej podobne do szlamu.
Giorgio
4

Aby uzupełnić inne odpowiedzi, robię kombinację stylu „Zastanów się nad problemem, a następnie zapisz rozwiązanie” i „Rozpocznij od repliki i stwórz swój program iteracyjnie”. Zwykle jest na środku. Zaczynam od ogólnego wyobrażenia o tym, jak chcę, aby mój program wyglądał, a potem zaczynam pisać, starając się w miarę możliwości zdobywać nową wiedzę na temat problematycznej domeny, aby zrewidować moje podejście. W praktyce oznacza to, że przeprowadzam dużo eksperymentów i piszę dużo kodu do usuwania. Próbuję różnych podejść i mogę bardzo szybko zmieniać kierunek. Lisp jest dobry do tego rodzaju rozwoju. Dlatego tak bardzo nie lubię TDD, muszę najpierw wiedzieć, co chcę zrobić, aby skutecznie TDD.

Inną ważną rzeczą, którą staram się zrobić, jest zastanowienie się nad protokołem między różnymi częściami programu. W przeciwieństwie do innych języków OO, w Common Lisp CLOS koncentruje się bardziej na koncepcji funkcji ogólnej, metody IOW żyją poza klasami i są w centrum rozwoju. Czasami zaczynam od zestawu GF-ów definiujących protokół, który chcę, piszę prostą implementację i używam jej do opracowania protokołu, zanim napiszę prawdziwą implementację. Powiedzmy, że piszę warstwę, która przechowuje wiele postów na blogu, mogę mieć zestaw GF, które określają sposób tworzenia, edytowania i wyszukiwania postów na blogu, i napisałbym prostą implementację, która zapisuje posty na liście w pamięci i po tym, jak jestem zadowolony z mojego protokołu, piszę implementację, która zapisuje posty na blogu w bazie danych lub zapisuje je w plikach.

Lisp sprawia, że ​​tak łatwo jest zmienić kierunek i zastosować inne podejście, gdy wiesz, że twoje obecne rozwiązanie jest nieoptymalne, co staram się na tym zmaksymalizować.

Ważna uwaga: w pełni wykorzystaj swoje środowisko, dowiedz się, jak korzystać z różnych ustawień kompilacji, aby skompilować kod z większą ilością informacji debugowania, skorzystaj z faktu, że lisp można zarówno kompilować, jak i interpretować. Używaj introspektywnych narzędzi Lisps, takich jak MOP, używaj funkcji szlamów do przeglądania dokumentacji, używaj inspektora do przeglądania obiektów, regularnie konsultuj się z hyperspec, traktuj swój system bardziej jak system operacyjny niż statyczny kompilator kodu, to znacznie więcej potężniejszy niż to.

Dla początkującego seplenienie nie jest tak dużym zwycięstwem nad pytonem i rubinem, ale w miarę zdobywania doświadczenia masz ogromne wygrane w mniejszych środowiskach.

Co najważniejsze, musisz dobrze się bawić i pokochać ten język, czasem łatwo jest się zniechęcić i korzystać z obecnie popularnych języków blub. Jeśli pozostaniesz przy seplenienie, to ci się odpłaci.

Pavel Penev
źródło
2

Zwykle pracuję w edytorze, który ma połączenie z REPL (zazwyczaj edytuje w emacs i używa SLIME jako pomostu do wspólnego środowiska Lisp). Mam tendencję do rozpoczynania zarówno „na dole”, jak i „na górze”, pracując w kierunku środka, zmieniając projekt z biegiem czasu.

Jeśli chodzi o testowanie, to właśnie dlatego mam REPL. Uważam, że pomaga to w testowaniu kodu. Czasami napiszę więcej formalnych testów lub testów porównawczych (zwykle gdy jestem na etapie optymalizacji). Miej wolniejszą, znaną dobrą implementację funkcjonalności, eksperymentuj (w oknie edytora) z kodem dla zoptymalizowanej wersji, wyślij go do leżącego u podstaw kodu seplenia i sprawdź, czy jest on zarówno szybszy, jak i zwraca takie same wyniki jak wolniejszy kod.

Jeśli chodzi o pakowanie, mam trochę kodu narzędziowego, który pomoże mi spakować projekty instalowane w ASDF, umieścić je w repozytorium pobierania i obsłużyć wersjonowanie.

Vatine
źródło