Какви са действителните разлики между Scheme и Common Lisp? (Или други два диалекта на Lisp)

Забележка: Не питам кое да науча, кое е по-добро или нещо подобно.

Взех безплатната версия на SICP, защото почувствах, че ще е хубаво да я прочета (чувал съм добри неща за нея и се интересувам от тази страна на програмирането).

Знам, че Scheme е диалект на Lisp и се чудех: каква е действителната разлика между Scheme и, да речем, Common Lisp?

Изглежда има много за „CL има по-голям stdlib... Схемата не е добра за програмиране в реалния свят...“, но няма действително нещо, което да казва „това е, защото CL е това/има това“.


person The Communist Duck    schedule 20.03.2011    source източник
comment
Схемата не е добра за програмиране в реалния свят ... Правя програмиране в реалния свят в Scheme (добре, не много).   -  person knivil    schedule 20.03.2011
comment
Не съм сигурен дали това е подтекстът, но бих препоръчал просто да правите SICP упражненията в Scheme. Можете да използвате почти всяка реализация с правилните параметри, защото подмножеството, върху което се фокусират, е толкова малко. Просто трябва да намерите правилните параметри за вашия избор, например в Racket вероятно ще бъде R5RS-режим. Много идеи от SICP ще ви помогнат в по-нататъшното ви изучаване на Lisp, дори ако вместо това продължите да използвате Common Lisp или дори Clojure.   -  person michiakig    schedule 20.03.2011
comment
Последно, което видях, спецификацията на Scheme беше около 50 страници, а спецификацията на CL беше над 1000. Така че просто отворете спецификацията на CL на която и да е страница и шансовете са добри, че това е нещо, което е в CL, но не и в Scheme. :-)   -  person Ken    schedule 20.03.2011
comment
@knivil Цитирах от други SO въпроси, които видях, за които да използвам.   -  person The Communist Duck    schedule 20.03.2011
comment
възможен дубликат на Common Lisp или Scheme?   -  person nawfal    schedule 21.07.2014


Отговори (4)


Това е малко труден въпрос, тъй като разликите са както технически, така и (по-важното според мен) културни. Отговорът може да предостави само неточна, субективна гледна точка. Това е, което ще предоставя тук. За някои необработени технически подробности вижте Scheme Wiki.

Scheme е език, изграден на принципа на предоставяне на елегантен, последователен, добре обмислен базов езиков субстрат, върху който могат да се надграждат както практически, така и академични езици за приложение.

Рядко ще намерите някой, който пише приложение в чиста R5RS (или R6RS) схема и поради минималистичния стандарт повечето кодове не могат да бъдат преносими между реализациите на схемата. Това означава, че ще трябва внимателно да изберете внедряването на Scheme, ако искате да напишете някакъв вид приложение за краен потребител, тъй като изборът до голяма степен ще определи какви библиотеки са достъпни за вас. От друга страна, относителната свобода при проектирането на действителния език на приложението означава, че имплементациите на Scheme често предоставят функции, нечувани другаде; PLT Racket, например, ви позволява да използвате статично въвеждане и предоставя IDE, която е много съобразена с езика.

Оперативната съвместимост извън основния език се осигурява чрез управлявания от общността SRFI процес, но наличността на даден SRFI варира в зависимост от изпълнението.

Повечето диалекти и библиотеки на Scheme се фокусират върху идиоми на функционалното програмиране като рекурсия вместо итерация. Има различни обектни системи, които можете да заредите като библиотеки, когато искате да направите ООП, но интеграцията със съществуващия код силно зависи от диалекта Scheme и заобикалящата го култура (Chicken Scheme изглежда е по-обектно-ориентирана от Racket, например).

Интерактивното програмиране е друга точка, по която подобщностите на Scheme се различават. MIT Scheme е известна със силна поддръжка на интерактивност, докато PLT Racket се чувства много по-статичен. Във всеки случай, интерактивното програмиране не изглежда да е основна грижа за повечето подобщности на Scheme и аз все още не съм виждал среда за програмиране, подобно интерактивна като повечето Common Lisps.

Common Lisp е изтъркан от битки език, предназначен за практическо програмиране. Той е пълен с грозни брадавици и хакове за съвместимост - точно обратното на елегантния минимализъм на Scheme. Но също така е много по-функционален, когато се вземе сам за себе си.

Common Lisp създаде сравнително голяма екосистема от преносими библиотеки. Обикновено можете да превключите реализациите по всяко време, дори след внедряване на приложението, без много проблеми. Като цяло Common Lisp е много по-унифициран от Scheme и по-радикалните езикови експерименти, ако изобщо се правят, обикновено се вграждат като преносима библиотека, вместо да дефинират изцяло нов езиков диалект. Поради това езиковите разширения обикновено са по-консервативни, но и по-комбинируеми (и често незадължителни).

Универсално полезни езикови разширения като интерфейси с чужди функции не се разработват чрез формални средства, а разчитат на квазистандартни библиотеки, налични във всички основни реализации на Common Lisp.

Езиковите идиоми са дива смес от функционални, императивни и обектно-ориентирани подходи и като цяло Common Lisp изглежда по-скоро като императивен език, отколкото като функционален. Освен това е изключително динамичен, може би повече от който и да е от популярните динамични скриптови езици (предефинирането на класа се прилага например за съществуващи екземпляри, а системата за обработка на условия има вградена интерактивност), а интерактивното, изследователско програмиране е важна част от "начинът на Common Lisp." Това също е отразено в програмните среди, налични за Common Lisp, практически всички от които предлагат някакъв вид директно взаимодействие с работещия Lisp компилатор.

Common Lisp включва вградена обектна система (CLOS), система за обработка на условия, значително по-мощна от обикновеното обработване на изключения, възможност за корекции по време на изпълнение и различни видове вградени структури от данни и помощни програми (включително прословутите LOOP макрос, итерационен подезик, твърде грозен за Scheme, но твърде полезен, за да не споменаваме, тъй като както и подобен на printf механизъм за форматиране с GOTO поддръжка във форматиращи низове).

Както поради интерактивната разработка, базирана на изображения, така и поради по-големия език, имплементациите на Lisp обикновено са по-малко преносими между операционните системи, отколкото имплементациите на Scheme. Да накарате Common Lisp да работи на вградено устройство не е за хора със слаби сърца, например. Подобно на виртуалната машина на Java, вие също сте склонни да срещате проблеми на машини, където виртуалната памет е ограничена (като виртуални сървъри, базирани на OpenVZ). Реализациите на схеми, от друга страна, обикновено са по-компактни и преносими. Нарастващото качество на внедряването на ECL смекчи донякъде тази точка, въпреки че същността й все още е вярна.

Ако държите на търговска поддръжка, има няколко компании, които предоставят свои собствени реализации на Common Lisp, включително графични GUI създатели, специализирани системи за бази данни и т.н.

Обобщавайки, Scheme е език с по-елегантен дизайн. Това е предимно функционален език с някои динамични характеристики. Неговите реализации представляват различни несъвместими диалекти с отличителни характеристики. Common Lisp е напълно развит, силно динамичен, мулти-парадигмен език с различни грозни, но прагматични функции, чиито реализации са до голяма степен съвместими една с друга. Диалектите на схемата са по-статични и по-малко интерактивни от Common Lisp; Реализациите на Common Lisp обикновено са по-тежки и по-трудни за инсталиране.

Който и език да изберете, желая ви много забавление! :)

person Matthias Benkard    schedule 20.03.2011

Някои основни практически разлики:

  • Common Lisp има отделни обхвати за променливи и функции; докато в Scheme има само един обхват -- функциите са стойности и дефинирането на функция с определено име е просто дефиниране на променлива, зададена на ламбда. В резултат на това в Scheme можете да използвате име на функция като променлива и да я съхранявате или предавате на други функции и след това да извършвате извикване с тази променлива, сякаш е функция. Но в Common Lisp трябва изрично да конвертирате функция в стойност с помощта на (function ...) и изрично да извикате функция, съхранена в стойност с помощта на (funcall ...)
  • В Common Lisp nil (празният списък) се счита за невярно (например в if) и е единствената невярна стойност. В Scheme празният списък се счита за верен и (отделното) #f е единствената невярна стойност
person newacct    schedule 22.03.2011
comment
За мен първата точка, която @newacct прави, е най-важната до момента. Ако функциите не са първокласни обекти, голяма част от наистина забавното, креативно програмиране се губи за мен. Добре, може да има практически съображения, за скорост и т.н., но ако искам функционално, неизменно програмиране, просто няма сравнение, IMHO. И ако искам практичност, мога да отида в Clojure и да получа най-доброто от двата свята. Common Lisp има своето място, но подозирам, че това е в света на индустрията, където съм сигурен, че хората са много благодарни за него. - person Alex Gian; 04.09.2018
comment
CL все още има първокласни функции. Това, че има отделно пространство от имена за функции, не означава, че няма първокласни функции (да, изисква се малко повече синтаксис, но това е всичко). - person mwal; 26.04.2019
comment
re: функционира в CL, по-голяма пречка е липсата на задължителен TCO. Разбира се, някои реализации го поддържат, но тогава това означава, че вече не пишете преносим CL код и преносимостта изглежда една от основните точки за рисуване - person Coderino Javarino; 04.09.2020

Трудно е да се отговори безпристрастно на този въпрос, особено защото много хора от LISP биха класифицирали Scheme като LISP.

Джош Блок (и тази аналогия може да не е негово изобретение) описва избора на език като избор на местна кръчма. В тази светлина тогава:

В кръчмата "Схема" има много изследователи на програмни езици. Тези хора отделят много внимание на значението на езика, на това да го поддържат добре дефиниран и прост и на обсъждането на иновативни нови функции. Всеки има своя собствена версия на езика, предназначена да му позволи да изследва своя собствен ъгъл на езиците за програмиране. Хората от Scheme наистина харесват синтаксиса в скоби, който са взели от LISP; той е гъвкав, лек и унифициран и премахва много бариери пред езиковото разширение.

Кръчмата "LISP"? Ами... не би трябвало да коментирам; Не съм прекарал достатъчно време там :).

person John Clements    schedule 20.03.2011

схема:

  • първоначално много малко спецификации (новият R7RS изглежда е по-тежък)
  • поради лесния синтаксис схемата може да се научи бързо
  • реализациите предоставят допълнителни функции, но имената могат да се различават в различните реализации

обикновен лисп:

  • много функции се определят от по-голямата спецификация
  • различно пространство от имена за функции и променливи (lisp-2)

това са някои точки, със сигурност има много повече, които не си спомням в момента.

person Moe    schedule 20.03.2011
comment
Вие се позовавате на RSR7; това вместо това трябва да е R6RS. - person John Clements; 20.03.2011