Lisp에는 몇 가지 다른 방언이 있습니다. Lisp를 배우는 것이 새로운 지적 경험이 될 것이라고 결정 했으므로 어떤 Lisp 방언을 배우고 그 이유를 알고 싶습니다.
다른 것보다 더 인기있는 것이 있습니까? 그들 중 하나가 더 나은 문서화 및 지원과 같이 "완전한"것입니까? 이 방언의 장단점은 무엇입니까?
Lisp에는 몇 가지 다른 방언이 있습니다. Lisp를 배우는 것이 새로운 지적 경험이 될 것이라고 결정 했으므로 어떤 Lisp 방언을 배우고 그 이유를 알고 싶습니다.
다른 것보다 더 인기있는 것이 있습니까? 그들 중 하나가 더 나은 문서화 및 지원과 같이 "완전한"것입니까? 이 방언의 장단점은 무엇입니까?
답변:
단순함과 청결 함, 매력적인 기능, 그리고 흥미롭고 유용한 소프트웨어를 (자신에게) 작성하고 학습 도구로 사용할 수있는 플랫폼 사이의 균형을 찾고 싶습니다. (마지막으로 계속해서 학습 할 수 있습니다.) 다음은 몇 가지 가능성입니다.
계획. 아마도 모든 방언 중에서 가장 깨끗할 것입니다. 이것이 The Little Schemer 가 LISP에서 Scheme으로 번역 된 이유 입니다. 다섯 번째 Scheme 표준 사양 인 R5RS 는 그 자체로 훌륭한 교육입니다. 내가 읽은 가장 멋진 언어와 라이브러리 사양 일뿐만 아니라 합리적으로 포괄적 인 가장 짧은 사양 일 수도 있습니다. PLT 계획 (현재 라켓) 플랫폼은 상당히 괜찮은 인터프리터와 컴파일러를 포함 스크립팅에 대한 좋은, 또한 학습이 우수하게 시각적 도구가 있습니다.
Common Lisp. 아마도 가장 이식 가능하고 포괄적 인 변형 일 것입니다. 이것은 상용 소프트웨어와 같은 것을 작성하려는 경우에 가장 원하는 것입니다. 표준은 광범위한 라이브러리를 정의하고 그 이상으로 더 많은 것을 사용할 수 있습니다. CLOS 가 있습니다. 아마도 OO 언어보다 OO에 대해 더 많이 가르쳐 줄 것이며 일부 컴파일러는 매우 훌륭합니다. 단점은 Scheme에없는 일부 사마귀 (예 : 함수를 참조하는 변수에 대한 별도의 네임 스페이스를 가짐), 명확하고 단순하지 않음 (확장을 가져야하고 필요한 절충안을 만들어야하는 모든 경우와 마찬가지로)입니다. 실제 세계의 대규모 응용 프로그램), 위생적인 매크로가 없으며 Scheme보다 재귀를 훨씬 덜 강조합니다.
클로저.이것은 JVM에서 실행되므로 Java 개발자를 위해 바로 사용할 수 있습니다. 몇 가지 사마귀가 있습니다 (예 : TCO가 JVM에 추가되면 언젠가 변경 될 수 있지만 꼬리 호출 최적화를 명시 적으로 요청해야합니다). 매크로는 위생적이지는 않지만 변수 캡처를 방지하는 데 도움이되는 몇 가지 기능이 있으므로 CL에서보다 실수로 수행 할 위험을 줄이면서 실제로 원하는 경우 변수를 캡처 할 수 있습니다. 모든 Java 라이브러리에 쉽게 액세스 할 수 있습니다. 그것은 아마도 "실제 세계"코드에 좋은 일이며 학습 측면에서는 의미가 없습니다. 영구 데이터 구조를위한 라이브러리 세트와 STM에 대한 지원이있어 동시 관점에서 매우 흥미 롭습니다. 이것은 아마도 당신이 동시 및 병렬 프로그래밍을 처리하는 새로운 방법에 대해 더 많이 배우고 싶습니다. Clojure는 당신이하고 싶지 않고하지 않는 프로덕션 앱에서하는 "추악한 일"을 할 수있는 능력을 갖게 될 것이라는 점에서 Java와 같이 대규모 프로덕션 애플리케이션에 사용할 수있는 것처럼 보입니다. 배울 때.
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 ++ .
저는 Scheme이라고 말하고 싶습니다. Little Schemer 는 제가 지금까지 읽으 려했던 가장 놀랍도록 재미 있지만 매우 어려운 책 중 하나입니다.
또한 Clojure는 요즘 많은 마음을 공유하고 있으며 그럴만 한 이유가 있습니다. 훌륭한 데이터 구조, 매우 우수한 동시성 지원 (이 점에서 Scheme과 CL을 부끄럽게 함) 및 훌륭한 커뮤니티. 또한 비교적 간단합니다. CL은 적어도 C ++만큼 복잡합니다.
이것은 내가 CL이나 Scheme을 좋아하지 않는다는 의미가 아닙니다. 나는 SICP로 Scheme을 배웠다. 그리고 CL은 나를 Clojure로 데려 왔습니다. 그것은 모두 내가 생각하는 당신의 목표에 달려 있습니다. 대단히 실용적인 Lisp를 배우고 싶다면 Clojure를 선택하십시오. 그렇지 않으면 CL 또는 Scheme이 모두 좋습니다.
나는 객체 지향 프로그래밍을 좋아하기 때문에 CL을 선호하고 CLOS는 주변에서 가장 멋진 객체 시스템입니다.
LFE (Lisp Flavored Erlang)가 좋습니다. Erlang VM 위에 lisp 구문을 사용할 수 있습니다.
처음에는 일종의 "로드 된"질문 이었지만 OP는 아마도 그것에 대해 몰랐을 것입니다. 일반적으로 Common과 Scheme lispers는 PC와 Apple 컴퓨터 "사람"과 같으며 혼합되지 않습니다. 어느 것이 가장 좋은지는 아마도 어떤 것이 당신에게 "효과적인"것만 큼 관련이 없을 것입니다. 실제로 그다지 차이가 없습니다. 어느 쪽을 먼저 배웠는지에 따라 다른쪽에 대한 선호도가 영향을받을 수 있습니다. (나에게 빈 목록은 CL에서 NIL로 알려진 "아무것도"여야하며, 이것이 저를 Common Lisper로 만듭니다.) 저는 EMACS를 사용하여 SBCL과 Slime의 통합을 좋아하지만 SBCL이 모든 사람을위한 것은 아닙니다. 우선, SBCL은 매우 엄격합니다. "재미있게"즐기고 싶다면 GNU clisp은 쉽고 거의 모든 플랫폼에서 사용할 수 있습니다.