Czy Lisp nadal ma jakąś specjalną funkcję, która NIE została przyjęta przez inne języki programowania?
Przez Lisp mam na myśli wszystkie języki programowania Lisp jako całość. Powiedziano mi, jak niesamowite jest Lisp i wiem, że wiele języków zostało zainspirowanych przez Lisp. Ale czy Lisp nadal ma jakąś ekskluzywną funkcję projektową, której po prostu nie da się zrobić w żadnym innym języku?
Powodem, dla którego zadałem pytanie, jest to, że ostatnio, będąc programistą-amatorem, zacząłem uczyć się Clojure dla zabawy, w wyniku czego znalazłem wiele postów i komentarzy związanych z Lisp, mówiąc tylko jedno: „Lisp jest wyjątkowy ”, ale inne współczesne języki programowania przyjęły już i wykradły wiele pomysłów Lisp, takich jak warunki warunkowe, rekursja i funkcja obywatela pierwszej klasy. A nawet metaprogramowanie może być wykonywane w wielu językach.
Czy coś przeoczyłem i czy „Lisp wciąż jest inny”?
Albo mam szczęście, ponieważ inne współczesne języki ukradły wszystkie dobre części z Lisp, aby nie trzeba było zagłębiać się w nawiasowy świat Lisp , a „Lisp był inny”.
Odpowiedzi:
Kanonicznym odniesieniem do tego rodzaju pytań jest What What Lisp Different . Paula Grahama . Dwie pozostałe kluczowe cechy Lisp, które nie są powszechnie dostępne, zgodnie z tym artykułem w momencie jego pisania, to:
Komentarz dotyczy każdego punktu i podaje popularne języki, w których ta funkcja jest dostępna.
Pamiętaj, że ten artykuł został po raz ostatni poprawiony w 2002 roku, aw ciągu ostatnich 11 lat pojawiło się wiele nowych języków, z których niektóre mogą zawierać wszystkie te funkcje Lisp w swoich projektach.
źródło
eval
podobne lub podobne, a całkiem sporo może wykonywać metaprogramowanie, np. Szablon Haskell Haskell. (Prawdopodobnie) wyjątkową cechą Lisp jest to, że reprezentacja danych, kodu i meta-kodu jest taka sama - nie tylko w składni, ale tak naprawdę jest taka sama.Odpowiedź na to pytanie jest trudna, ponieważ ktoś musiałby znać wszystkie języki, aby wiedzieć, że żaden inny nie ma żadnej konkretnej funkcji dostępnej w Lisp, więc poniższe informacje są oparte na językach, z którymi mam doświadczenie.
Poza moją głową warunki są czymś, czego nie widziałem w żadnym innym języku. Pomyśl o „wyjątkach”, ale tam, gdzie stos wywołań nie jest rozwijany i gdzie wywołujący może wysłać wartość odzyskiwania do miejsca wyjątku, ale bez zakłócania stosu wywołań między modułem obsługi i źródłem wyjątku. Szczerze mówiąc, jest to tak naprawdę specjalne zastosowanie kontynuacji, więc Ruby i Scheme (przynajmniej) mogą to zrobić.
Makro system Lisp korzysta z regularności / homoikoniczności, ale Scala planuje wprowadzić je jako stabilną funkcję w 2.12, a szablon Haskell twierdzi, że podobne funkcje. Twierdziłbym, że będą one bardziej złożone pod względem składniowym niż w przypadku Lispa, ale generowanie kodu w czasie kompilacji istnieje niezależnie od tego.
Pomyśl o tym, jednak proste budowanie formularzy jest tylko jednym rodzajem makra dostępnym w Lisp: nigdzie indziej nie widziałem odpowiednika makr kompilatora lub czytnika.
Zdolność niektórych dialektów (np. SBCL ) do zapisania pełnego, wznawianego obrazu procesu jest fajna, ale znowu nie jest wyjątkowa: Smalltalk robi to od dziesięcioleci.
Wiele innych języków zezwala na przypisywanie destrukcji przy zwracaniu tablic, ale wartości # 'i #' wiele-wiązania-wiązania / let-wartości nadal wydają się być specyficzne dla Common Lisp i schematu (który nadal może dokonywać regularnej destrukcji również ). „Niedostrzegalna” Perla pozwala funkcji określić, czy jest wywoływana w kontekście skalarnym, listowym czy pustym, aby mogła dostosować swoją wartość zwracaną w podobny (-ish) sposób, ale nie widziałem „prawdziwych” wielokrotnych wartości zwracanych poza programu / CL.
Jeśli chodzi o funkcje językowe, Lisp prawdopodobnie nie jest w stanie zrobić tego, czego nie potrafią inne języki (Turing jest kompletny). Jest to jednak język, w którym kod jest wyrażany za pomocą własnych struktur danych, dzięki czemu Big Idea ™ - ten kod to dane - jest czymś stosunkowo łatwym w obsłudze.
źródło
Po tylu dziesięcioleciach nie sądzę, żeby było coś wyłącznego dla Lisp. Ale nawet dzisiaj istnieje wiele interesujących rzeczy, które trudno znaleźć poza Lisps. Kilka rzeczy, które przychodzą mi na myśl:
Wreszcie, Lisp może się wiele nauczyć, nie dotyczy samego języka, ale stał się częścią historii Lisp i zagubił się w czasie. Np. Interlisp, Symbolics Genera itp. ... jeśli nigdy nie położysz rąk na Genera, zapoznaj się z tym wątkiem comp.lang.lisp, w którym Kent Pitman opisuje, w jaki sposób „Emacs jest tylko bladym cieniem Zmaców Genery” - wszystko to zostało włączone przez mając potężny system Lisp, którego częścią był Zmacs, który działał na maszynie Lisp.
źródło
To niekoniecznie pewna pojedyncza funkcja . To cały wygląd i sposób działania oraz sposób, w jaki pewne zestawy funkcji działają razem.
JavaScript lub Java mają wiele funkcji Lisp (maszyna wirtualna, kompilator / ewaluator, odśmiecanie itp.). Ale JavaScript na przykład nie ma symbolicznej części programistycznej, brakuje matematycznych możliwości (wewnętrznie ma tylko zmiennoprzecinkowe), brakuje obsługi błędów i tak dalej.
Wiele systemów Common Lisp jest zoptymalizowanych pod kątem programistycznym, w którym jeden stopniowo rozszerza nowe oprogramowanie, rozszerzając język Lisp w różnych wymiarach przy użyciu różnych technik metaprogramowania - bez konieczności ponownego uruchamiania oprogramowania przez długi czas. Dlatego musi być elastyczny i rozszerzalny - ale jednocześnie musi być solidny. Zmiana języka (makra są po prostu sposobem na rozszerzenie kompilatora) bez zawieszania programu.
Teraz coś takiego jak JavaScript jest także używane do rozszerzenia programu, zwykle przeglądarki internetowej. Ale przez większość czasu nie robi się zbyt wiele metaprogramowania w JavaScript - oprócz niektórych hakerów OOP .
Przykład:
Można zaimplementować ogólne zaawansowane oprogramowanie matematyczne dla dziedziny algebry komputerowej głównie na dwa sposoby: napisać silnik w C ze specjalnym językiem na wierzchu (jak Mathematica ) lub w bardziej zaawansowanym dialekcie Lisp. Macsyma / Maxima in Common Lisp, Reduce in Standard Lisp, Axiom in Common Lisp.
(Istnieje również jeden lub więcej napisanych w Pythonie).
Nie ma wielu systemów, które oferują zestaw funkcji czegoś takiego jak Axiom , który działa na Common Lisp.
To, co sprawiło, że Lisp jest atrakcyjny dla tego typu aplikacji, to połączenie różnych funkcji: zaawansowanych podstawowych matematyki (bignum, współczynniki, ...), obliczeń symbolicznych, interaktywnego kompilatora itp. Całkiem możliwe jest uzyskanie tych rzeczy poprzez wdrożenie ich w nisko- poziom języka. W ten sposób zaimplementujesz 50% lub więcej typowego systemu Lisp.
źródło
Nie, o ile mi wiadomo. Forth jest równie dynamiczny jak Lisp, być może tym bardziej, że dynamiczny kod w Forth wygląda jak zwykły kod Forth, podczas gdy makra Lisp mają tendencję do używania innych funkcji niż zwykły kod Lisp ( przynajmniej w Clojure nigdy nie użyłem cudzysłowu składni poza makrem) i w rezultacie wyglądają naprawdę inaczej niż zwykły kod Lisp. Jako przykład tego, jak dynamiczny jest Forth, oto sposób na implementację komentarzy w Forth :
źródło
Lisp ma wiele dialektów, a każdy z nich ma swój własny zestaw funkcji. Moją ulubioną funkcją, która prawdopodobnie nie zostanie zaadaptowana w żadnym innym języku, jest „stos spaghetti” firmy Interlisp .
Stos spaghetti jest jak zamknięcie, ale na sterydach. Zapisuje nie tylko bieżącą funkcję, ale cały kontekst do góry stosu. Coś w rodzaju wspólnej procedury , z wyjątkiem tego, że można je utworzyć dowolnie, co daje hierarchię kontekstów stosu.
źródło