Lisp의 어떤 방언을 배워야합니까? [닫은]


89

Lisp에는 몇 가지 다른 방언이 있습니다. Lisp를 배우는 것이 새로운 지적 경험이 될 것이라고 결정 했으므로 어떤 Lisp 방언을 배우고 그 이유를 알고 싶습니다.

다른 것보다 더 인기있는 것이 있습니까? 그들 중 하나가 더 나은 문서화 및 지원과 같이 "완전한"것입니까? 이 방언의 장단점은 무엇입니까?



이 질문을하기 전에 검색을했지만 입력하면서 질문의 본질이 발전했습니다. 나는 바퀴를 재발 명하지 않을 것입니다.
Humphrey Bogart

그렇다면이 질문과 그렉이 위에서 언급 한 질문의 차이점은 무엇입니까?
cjs 2009-06-20

2
그가 말하려고했던 것은 다음과 같았습니다. 처음에 내 마음 속에 내 질문을 공식화했을 때 현재 질문과 완전히 달랐고 관련 검색의 질문을 보면 그가 원하는 내용에 맞는 것이 드러나지 않았습니다. 물어보기. 그러나 그가 질문을 입력했을 때, 그것은 바뀌었고, 따라서 이전에 질문했던 현재의 형태로 SO에 도달했습니다.
J. Polfer 2009-06-20

답변:


77

단순함과 청결 함, 매력적인 기능, 그리고 흥미롭고 유용한 소프트웨어를 (자신에게) 작성하고 학습 도구로 사용할 수있는 플랫폼 사이의 균형을 찾고 싶습니다. (마지막으로 계속해서 학습 할 수 있습니다.) 다음은 몇 가지 가능성입니다.

  1. 계획. 아마도 모든 방언 중에서 가장 깨끗할 것입니다. 이것이 The Little Schemer 가 LISP에서 Scheme으로 번역 된 이유 입니다. 다섯 번째 Scheme 표준 사양 인 R5RS 는 그 자체로 훌륭한 교육입니다. 내가 읽은 가장 멋진 언어와 라이브러리 사양 일뿐만 아니라 합리적으로 포괄적 인 가장 짧은 사양 일 수도 있습니다. PLT 계획 (현재 라켓) 플랫폼은 상당히 괜찮은 인터프리터와 컴파일러를 포함 스크립팅에 대한 좋은, 또한 학습이 우수하게 시각적 도구가 있습니다.

  2. Common Lisp. 아마도 가장 이식 가능하고 포괄적 인 변형 일 것입니다. 이것은 상용 소프트웨어와 같은 것을 작성하려는 경우에 가장 원하는 것입니다. 표준은 광범위한 라이브러리를 정의하고 그 이상으로 더 많은 것을 사용할 수 있습니다. CLOS 가 있습니다. 아마도 OO 언어보다 OO에 대해 더 많이 가르쳐 줄 것이며 일부 컴파일러는 매우 훌륭합니다. 단점은 Scheme에없는 일부 사마귀 (예 : 함수를 참조하는 변수에 대한 별도의 네임 스페이스를 가짐), 명확하고 단순하지 않음 (확장을 가져야하고 필요한 절충안을 만들어야하는 모든 경우와 마찬가지로)입니다. 실제 세계의 대규모 응용 프로그램), 위생적인 ​​매크로가 없으며 Scheme보다 재귀를 훨씬 덜 강조합니다.

  3. 클로저.이것은 JVM에서 실행되므로 Java 개발자를 위해 바로 사용할 수 있습니다. 몇 가지 사마귀가 있습니다 (예 : TCO가 JVM에 추가되면 언젠가 변경 될 수 있지만 꼬리 호출 최적화를 명시 적으로 요청해야합니다). 매크로는 위생적이지는 않지만 변수 캡처를 방지하는 데 도움이되는 몇 가지 기능이 있으므로 CL에서보다 실수로 수행 할 위험을 줄이면서 실제로 원하는 경우 변수를 캡처 할 수 있습니다. 모든 Java 라이브러리에 쉽게 액세스 할 수 있습니다. 그것은 아마도 "실제 세계"코드에 좋은 일이며 학습 측면에서는 의미가 없습니다. 영구 데이터 구조를위한 라이브러리 세트와 STM에 대한 지원이있어 동시 관점에서 매우 흥미 롭습니다. 이것은 아마도 당신이 동시 및 병렬 프로그래밍을 처리하는 새로운 방법에 대해 더 많이 배우고 싶습니다. Clojure는 당신이하고 싶지 않고하지 않는 프로덕션 앱에서하는 "추악한 일"을 할 수있는 능력을 갖게 될 것이라는 점에서 Java와 같이 대규모 프로덕션 애플리케이션에 사용할 수있는 것처럼 보입니다. 배울 때.

  4. Emacs Lisp. LISP 측면에서 이것은 더 나은 예 중 하나가 아닙니다. 가장 큰 결함 중 하나는 동적 범위 지정이지만 다른 많은 결함이 있습니다. 그러나 Emacs 사용자 인 경우 편집기 사용을 개선하기 위해 배울 수있는 가장 강력한 도구 일 수 있습니다. 그러나 Emacs를 확장하는 방법을 넘어서 Emacs Lisp를 배우면서 얼마나 많은 것을 배웠는가는 저에게 열린 질문입니다. 고차 함수와 같은 흥미로운 기술이 Emacs Lisp에서 실제로 얼마나 자주 사용되는지 모르겠습니다.

2018 업데이트

내가이 글을 쓴 지 거의 10 년이 지났고 Lisp 언어 군은 이제 일반 프로그래머 의식에서 상당한 견인력을 얻고있는 것으로 보입니다. 이것의 대부분은 그 자체로 Lisp의 적절하게 분리 된 방언이되었을뿐만 아니라 많은 좋은 아이디어를 소개하는 Clojure와 관련이있는 것으로 보입니다. 또한 이제 JavaScript를 대상으로하는 거의 동일한 버전을 가지고 있으며 다른 많은 Lisps에 영감을 불어 넣었습니다. 다른 플랫폼을 대상으로합니다. 예를 들어, Hy 는 CPython AST 및 바이트 코드를 대상으로하며 먼저 Python과의 상호 운용성을 목표로하지만 "의심스러운 경우"Clojure 아이디어를 사용합니다. (최신 커밋에서는 후자가 약간 변경 될 수 있습니다.)

이것이 의사 결정 과정에 가져다주는 큰 변화는 Lisps 또는 Lisp 유사 언어를 사용할 수 있는지 살펴보고 이미 사용중인 언어 또는 플랫폼 ( Perl , Ruby , Erlang , Go 등) 과 상호 운용되어야한다는 것입니다. 마이크로 컨트롤러의 C ++ .


3
별도의 네임 스페이스를 갖는 것은 사마귀가 아니며 단지 다른 디자인 결정일뿐입니다. Scheme에도 이미 여러 개의 다른 네임 스페이스가 있으므로 논쟁은 Lisp-6에 대한 Lisp-5입니다. CL에서 목록 "목록"과 자동차 "자동차"를 호출 할 수있는 편리함을 제외하고, 컴파일러가 일을 쉽게 혼동하지 않기 때문에 매크로 시스템이 훨씬 더 실용적이고 유용합니다.
Svante

Clojure에는 꼬리 호출 최적화가 없으며 JVM 바이트 코드가 지원하지 않기 때문에 불가능합니다. 그것이 가지고있는 것은 현재 함수를 자기 반복하는 "반복"특수 형식뿐입니다.
Svante

3
Curt : Clojure가 Java VM에서 실행되기 때문에 가장 이식성이 높다고 생각합니다.
justinhj 2009-06-20

1
나는 그것에 대해 모른다. 어쨌든 수정되지 않은 데스크톱 / 서버 프로그램을 실행하지 않을 소형 및 임베디드 장치 (예 : 전화 및 스마트 카드)를 제외하면 elisp는 확실히 JVM보다 더 많은 CPU와 플랫폼에서 실행됩니다.
CJS

1
나는 매우 동의하지 않습니다. 재귀는 a) 더 순수하고, b) 확인하기 쉽고, c) 정확할 가능성이 더 높은 코드를 생성하는 경향이 있습니다. 더 자세히 : a) 함수 외부에서 더 적은 변수를 건 드리는 경향이 적습니다. b) 귀납적 증명은 자연적으로 재귀 함수에서 벗어나는 경향이있는 반면, 루프에서는 루프 불변 등을 확인해야합니다. c) 신뢰성은 a)에서 비롯되며 자연스럽게 b)의 귀납적 증명을 (아마도 비공식적으로) 만드는 방식으로 코드를 작성하는 경향이 있습니다.
CJS

22

저는 Scheme이라고 말하고 싶습니다. Little Schemer 는 제가 지금까지 읽으 려했던 가장 놀랍도록 재미 있지만 매우 어려운 책 중 하나입니다.


15
SICP를 잊지 마세요! mitpress.mit.edu/sicp . 이것은 고전적인 읽기입니다.
Joris Timmermans

7
두 개 또는 세 개의 버전이 있었다 작은 Lisper는 전에 작은 음모가 이들의 번역으로 나왔다.
cjs


8

또한 Clojure는 요즘 많은 마음을 공유하고 있으며 그럴만 한 이유가 있습니다. 훌륭한 데이터 구조, 매우 우수한 동시성 지원 (이 점에서 Scheme과 CL을 부끄럽게 함) 및 훌륭한 커뮤니티. 또한 비교적 간단합니다. CL은 적어도 C ++만큼 복잡합니다.

이것은 내가 CL이나 Scheme을 좋아하지 않는다는 의미가 아닙니다. 나는 SICP로 Scheme을 배웠다. 그리고 CL은 나를 Clojure로 데려 왔습니다. 그것은 모두 내가 생각하는 당신의 목표에 달려 있습니다. 대단히 실용적인 Lisp를 배우고 싶다면 Clojure를 선택하십시오. 그렇지 않으면 CL 또는 Scheme이 모두 좋습니다.


이것은 CL이나 Scheme 모두 "엄청나게 실용적"이 아니지만 실제로는 매우 실용적이라는 것을 의미하는 것 같습니다. 특히 CL 표준은 실용적인 고려 사항 에서 탄생 했습니다.
레슬리 P. Polzer

2
프로그래밍 언어 환경은 1994 년 이후로 변경되었습니다. 그 이후로 배운 내용을 수용하기 위해 CL 표준이 어떻게 변경 / 진화할지 모르겠습니다. 세상은 앞으로 튀어 나오고 있고 내가 말할 수있는 한 CL은 가만히 서있다. 저는 CL을 좋아합니다. Clojure는 그 힘에 접근 할 방법이 있습니다.하지만 CL이 어떻게 진화할지 모르겠습니다. 표준화 된 언어를 사용한다면 진화 경로가 분명해야합니다. 그것이 없으면 언어는 실용적인 선택 이 아닐 가능성이 큽니다 .
dnolen

4
CL은 매우 유용한 라이브러리를 통해 진화하고 발전하고 있습니다. 기본 언어는 1994 년에 오늘날의 모든 "현대"언어보다 이미 더 강력했습니다.
Svante

5

나는 객체 지향 프로그래밍을 좋아하기 때문에 CL을 선호하고 CLOS는 주변에서 가장 멋진 객체 시스템입니다.


5
CL에 관해서는 ClozureCL 또는 SBCL을 추천합니다. 둘 다 오픈 소스이고 잘 문서화되어 있고 성숙하고 다중 플랫폼이며 다중 스레딩과 같은 중요한 비표준 기능을 제공합니다.
Daniel Dickison

5

학교에서 Scheme 을 배웠습니다 . 훌륭한 학습 경험이었고 저는 함수형 프로그래밍의 기초를 결코 잊지 않을 것입니다. 유용성의 핵심 인 상태 비 저장 람다 계산법을 이해하는 한 어떤 버전의 LISP를 선택하든 상관 없습니다.

다음은 MIT가 프로그래밍 입문 과정 에서 Scheme에서 Python 으로 전환 한 이유 에 대한 흥미로운 기사입니다 .


3

나는 적어도 처음에는 그들 모두를 말할 것입니다. 결국 당신은 아마도 Scheme 또는 Common Lisp에 대한 선호도를 개발할 것이지만, 둘 다 거기에있는 모든 것을 처리하는 것이 가장 좋은 충분한 차이가 있습니다.

예를 들어 Scheme에는 연속성이 있으며 Common Lisp에서 구현할 수 있지만 Scheme에있는 항목에 대해 배우는 것이 좋습니다.

어휘와 동적 범위의 차이를 배우는 것이 중요하며 Common Lisp와 elisp를 모두 배우면 둘 다의 의미를 알게 될 것입니다.


0

LFE (Lisp Flavored Erlang)가 좋습니다. Erlang VM 위에 lisp 구문을 사용할 수 있습니다.


0

처음에는 일종의 "로드 된"질문 이었지만 OP는 아마도 그것에 대해 몰랐을 것입니다. 일반적으로 Common과 Scheme lispers는 PC와 Apple 컴퓨터 "사람"과 같으며 혼합되지 않습니다. 어느 것이 가장 좋은지는 아마도 어떤 것이 당신에게 "효과적인"것만 큼 관련이 없을 것입니다. 실제로 그다지 차이가 ​​없습니다. 어느 쪽을 먼저 배웠는지에 따라 다른쪽에 대한 선호도가 영향을받을 수 있습니다. (나에게 빈 목록은 CL에서 NIL로 알려진 "아무것도"여야하며, 이것이 저를 Common Lisper로 만듭니다.) 저는 EMACS를 사용하여 SBCL과 Slime의 통합을 좋아하지만 SBCL이 모든 사람을위한 것은 아닙니다. 우선, SBCL은 매우 엄격합니다. "재미있게"즐기고 싶다면 GNU clisp은 쉽고 거의 모든 플랫폼에서 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.