2009-06-17 2 views
73

나는 Lisp의 몇 가지 다른 방언이 있다는 것을 알고있다. Lisp을 배우는 것이 새로운 지적 경험이 될 것이라고 결정한 후 어떤 Lisp 방언을 배우고 그 이유는 무엇인지 알고 싶습니다.어떤 Lisp 방언을 배워야합니까?

다른 사람들보다 더 인기가있는 사람이 있습니까? 그 중 한 사람이 더 잘 문서화되고 지원되는 것처럼 더 완전합니까? 이 방언의 장단점은 무엇입니까?

+1

중복 : http://stackoverflow.com/questions/563356/which-lisp-should-i-learn –

+0

질문하기 전에 검색을 수행했지만 질문을 입력 할 때 진화했습니다. 나는 바퀴를 재발견하지 않을 것입니다. –

+0

그럼이 질문과 그렉이 언급 한 것과 무슨 차이점이 있습니까? –

답변

21

저는 Scheme을 전적으로 읽기 위해 노력한 가장 열심히 재미 있지만 아직까지 매우 어려운 책 중 하나 인 Little Schemer 때문에 전적으로 말합니다.

+13

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

+6

작은 리서퍼 _가 리틀 리퍼 (Little Lisper) _ _ 그 리틀 시스터 (Little Schemer) _가 그 중 하나의 번역본으로 나왔다. –

5

저는 객체 지향 프로그래밍을 좋아하고 CLOS가 가장 좋은 객체 시스템이므로 CL을 선호합니다.

+5

CL에 관해서는 ClozureCL 또는 SBCL을 권하고 싶습니다. 둘 다 오픈 소스이며, 잘 문서화되고, 성숙하고, 멀티 플랫폼이며, 멀티 스레딩과 같이 중요한 비표준 기능을 제공합니다. –

4

나는 학교에서 Scheme을 알게되었습니다. 훌륭한 학습 경험이었고 함수 프로그래밍의 기본을 결코 잊지 못할 것입니다. LISP의 유용성의 핵심 인 스테이트리스 람다 계산법을 이해한다면 아마 어떤 버전의 LISP를 픽업해도 상관 없습니다.

입문 프로그래밍 과정에서 Why MIT switched from Scheme to Python에 대한 흥미로운 기사가 ​​있습니다.

8

또한 Clojure는 요즘 많은 마음을 사로 잡는 데 좋은 이유가 있습니다. 훌륭한 데이터 구조, 심오한 동시성 지원 (이 점에서 Scheme과 CL을 부끄럽게 여기다), 훌륭한 커뮤니티. 또한 상대적으로 간단합니다. CL은 적어도 C++만큼 복잡합니다.

나는 CL이나 Scheme을 좋아하지 않는다. 나는 SICP와 함께 Scheme을 배웠다. 그리고 CL은 나를 Clojure로 데려왔다. 그것은 모두 당신의 목표에 달려 있습니다. 대단히 실용적인 Lisp을 배우고 싶다면 Clojure로 가라. 그렇지 않으면 CL이나 Scheme 모두 훌륭합니다.

+0

이것은 CL이나 Scheme이 실제로 "실용적"인 반면에 "대단히 실용적"이라고 암시하는 듯하다. 특히 CL 표준은 실제 고려 사항에서 * 태어났습니다. – skypher

+2

프로그래밍 언어의 변화는 1994 년 이래로 바뀌 었습니다. CL 표준이 그 당시부터 배운 것을 수용하기 위해 어떻게 변화/진화 할 것인지 모르겠습니다. 전 세계가 앞으로 나아지고 있으며 CL이 여전히 서있다는 것을 알 수 있습니다. 저는 CL을 좋아합니다. Clojure는 그 힘에 접근 할 수있는 방법이 있지만 CL이 어떻게 진화 하는지를 보지 못합니다. 표준화 된 언어를 사용한다면 진화의 길은 분명해야합니다. 그것이 없으면, 언어는 실용적인 선택이 아닌 것 같다. – dnolen

+3

CL은 진화했으며 많은 유용한 라이브러리를 통해 발전해 왔습니다. 기본 언어는 오늘날 모든 "현대"언어보다 1994 년에 더 강력했습니다. – Svante

9

SBCL에 Common Lisp을 추천 할 수 있습니다. 이 조합은 빠르고 강력하며 성숙하고 잘 문서화되어 있습니다.

2

나는 적어도 처음에는이 모든 것을 말하고 싶습니다. 결국에는 Scheme이나 Common Lisp에 대한 선호도를 개발할 것입니다. 그러나 둘 다 거기에있는 모든 것을 처리하는 것이 가장 좋은 차이점을 가지고 있습니다.

Scheme은 예를 들어 계속 사용되며 Scheme에서 Common Lisp로 구현 될 수 있다고하더라도 Scheme에 대해 배우는 것이 좋습니다.

어휘와 동적 범위의 차이를 배우는 것이 중요합니다. Common Lisp와 elisp을 모두 배우면 두 가지 함의를 알 수 있습니다.

62

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

  1. 계획은. 아마 모든 방언 중에서 가장 깨끗합니다. The Little Schemer가 LISP에서 Scheme으로 변환 된 이유는 틀림 없습니다. 다섯 번째 계획 표준 규격 인 R5R2은 그 자체로 훌륭한 교육입니다. 그것은 내가 읽은 가장 훌륭한 언어와 라이브러리 명세 일뿐만 아니라 합리적으로 포괄적 인 가장 짧은 언어 일 수도 있습니다. PLT Scheme 플랫폼에는 꽤 괜찮은 인터프리터와 컴파일러가 포함되어 있으며 스크립팅에 적합하며 학습을 위해 뛰어난 시각적 도구가 있습니다.

  2. 커먼 리스프. 아마도 가장 이식성이 뛰어나고 포괄적 인 변형 일 것입니다. 상업용 소프트웨어와 같은 것을 쓰고 싶다면 가장 가능성이 높습니다. 이 표준은 방대한 라이브러리를 정의하고 있습니다. 그 외에도 많은 라이브러리가 있습니다. CLOS이 있습니다. 그러면 OO 언어보다 OO에 대해 더 많이 가르쳐 줄 것이며 일부 컴파일러는 매우 훌륭합니다. 단점은 Scheme이 가지고 있지 않은 사마귀 (함수를 참조하는 변수에 대해 별도의 네임 스페이스를 가짐)를 포함하고, 깨끗하고 단순하지는 않습니다 (확장 기능을 필요로하고 타협이 필요했던 것과 마찬가지입니다 현실 세계의 대규모 응용 프로그램의 경우) 위생적인 ​​매크로가 없으며 Scheme보다 훨씬 적은 재귀를 강조합니다.

  3. Clojure. 이것은 JVM에서 실행되기 때문에 자바 개발자에게 도움이 될 수 있습니다. 몇 가지 사마귀가 있습니다 (예 : TCO가 JVM에 추가되는 경우 하루에 변경 될 수 있지만 꼬리 통화 최적화를 명시 적으로 요청해야 함). 위생적이지는 않지만 매크로에는 변수 캡처를 피할 수있는 몇 가지 기능이 있으므로 실제로 원하는 경우 변수를 캡처 할 수 있으며 실수로 CL보다 실수를 줄이는 위험이 적습니다. 모든 Java 라이브러리에 쉽게 액세스 할 수 있습니다. 그것은 "실제"코드에 대해서는 아마도 좋은 일이고, 학습면에서는 무의미합니다. 영구적 인 데이터 구조와 STM 지원을위한 라이브러리 집합이있어 동시 관점에서 매우 흥미 롭습니다. 동시 및 병렬 프로그래밍을 다루는 새로운 방법에 대해 더 많은 것을 배우고 자한다면이 방법이 최선의 방법 일 것입니다. 마치 Clojure가 Java와 같은 대규모 프로덕션 응용 프로그램에서 사용할 수있는 것처럼 보이며, 오히려 수행하지 않는 프로덕션 응용 프로그램에서 수행하는 "추악한 작업"을 수행 할 수 있다는 의미에서 나타납니다 네가 배우고있을 때.

  4. Emacs Lisp. LISP의 관점에서, 이것은 더 좋은 예가 아닙니다. 가장 큰 결점 중 하나는 동적 범위 지정이지만 다른 여러 가지가 있습니다. 그러나, Emacs 사용자라면 에디터 사용법을 배울 수있는 가장 강력한 도구 일 것입니다. Emacs Lisp을 배우면서 얼마나 많은 것을 배울 수 있습니까? Emacs를 확장하는 방법을 넘어서는 것은 열려있는 질문입니다. 고차 함수와 같은 재미있는 기법이 Emacs Lisp에서 실제로 얼마나 자주 사용되는지 모르겠습니다.

+3

별도의 네임 스페이스를 지정하는 것은 사마귀가 아니며 디자인 결정이 다릅니다. Scheme에도 이미 여러 다른 네임 스페이스가 있으므로 Lisp-6에 대한 논쟁은 오히려 Lisp-5입니다. CL에서 list "list"와 car "car"를 호출 할 수있는 편의성 외에, 매크로 시스템은 훨씬 더 실용적이고 유용합니다. 컴파일러가 일을 그렇게 쉽게 혼동하지 않기 때문입니다. – Svante

+0

Clojure는 테일 호출 최적화 기능이 없으며 JVM 바이트 코드가 지원하지 않기 때문에 호출 최적화를 수행 할 수 없습니다. 그것이 가지고있는 것은 현재 기능을 자체 되풀이하는 "되풀이"특수 형식입니다. – Svante

+0

Svante : TCO 의견을 보내 주셔서 감사합니다. JVM에서 TCO 지원을 추가하면 'recur'를 사용할 필요가 없어 질 수 있다는 메모를 게시물에 추가했습니다. –

0

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

0

일종의 "로드 된"질문부터 시작했지만 OP는 아마도 그것에 대해 몰랐습니다. 일반적으로 Common과 Scheme은 PC와 Apple 컴퓨터의 "사람들"과 같지만 혼합되지 않습니다. 어떤 것이 가장 적합한지는 아마 당신에게 어떤 것이 효과가있는 것과 관련이 없을 것입니다. 실제로, 그다지 차이가 ​​없습니다. 다른 것보다 하나에 대한 선호도는 아마도 당신이 먼저 배운 것에 영향을받을 것입니다. (나에게 비어있는 목록은 CL에서 NIL로 알려져있는 "nothing"이어야하며, 그것은 나를 Common Lisper로 만든다.) 나는 EMACS를 사용하여 SBCL과 Slime을 통합하는 것을 좋아하지만, SBCL은 모든 사람들을위한 것이 아니다. 한 가지 들어, SBCL은 매우 엄격합니다. "재미있게 지내고 싶다면"GNU clisp는 거의 모든 플랫폼에서 쉽고 사용 가능합니다.

관련 문제