Clojure, Scheme / Racket 및 Common Lisp의 차이점은 무엇입니까?


120

나는 그들이 lisp라고 불리는 동일한 언어 계열의 방언이라는 것을 알고 있지만 정확히 차이점은 무엇입니까? 가능한 경우 구문, 특성, 기능 및 리소스와 같은 주제를 다루는 개요를 제공 할 수 있습니까?


3
나는이 질문이 다른 많은 사람들에게 유용 할 수 있다고 생각했기 때문에 차이점에 대한 더 일반적인 개요를 요청하고 있습니다.
MaiaVictor

4
나는 항상 어떤 게시물이 어디로 가야하는지 혼란스러워합니다. 이것은 도구에 대한 토론이므로 여기 또는 프로그래머에게 질문입니까? 논리적으로, 특정 문제를 해결하도록 요구하는 것이 아니기 때문에 프로그래머에게 옮기라고 말하고 싶지만 IMHO에 대한 좋은 답변이있는 좋은 게시물입니다.
octopusgrabbus

1
@octopusgrabbus : 질문이 너무 광범위합니다. '구문, 특성, 기능 및 리소스'에 대한 세 가지 프로그래밍 언어를 비교하면 책이나 웹 사이트를 쉽게 채울 수 있습니다. Stackoverflow는 프로그래밍 문제가있는 사람들을위한 것이며 백과 사전 (Wikipedia)도 아니고 일반 토론 포럼 (Usenet)도 아니고 언어 비교 사이트 ( rosettacode.org )도 아닙니다 . 질문에 코드가 있고 답변에도 코드가있는 실제 프로그래밍 문제에 가장 적합합니다. 더하기 : 누군가가 지루하거나 취미라고해서 문제를 해결하지 마십시오.
Rainer Joswig 2012-06-27

3
질문이 광범위하다고해서 여기에 속하지 않는다는 의미는 아닙니다. 완벽하게 명확한 질문이고 확실히 "진짜 프로그래밍 질문"입니다. StackOverflow는 주로 Q & A 형식을 통해 프로그래밍에 대한 지식을 공유 할 수있는 [googleable] 커뮤니티 리소스입니다.
Dan Burton

@RainerJoswig, 지난 며칠 동안 공부하면서 그 언어에 대해 배운 모든 것을 쓸 수 있었지만 스레드가 커질 것입니다. 사람들이 그런 종류의 짧은 문장을 검색하고 큰 텍스트가 요청 된 내용을 빠르게 이해하는 데 방해가되기 때문에 답을 얻을 수 없다는 사실을 깨닫는 것은 정말 나쁜 일입니다. 이렇게하면 더 많은 사람들이 좋은 답변을받을 수 있습니다.
MaiaVictor

답변:


103

그들은 모두 공통점이 많습니다.

  • 동적 언어
  • 강력하게 입력
  • 컴파일
  • Lisp 스타일 구문, 즉 코드는 Lisp 데이터 구조 (양식)로 작성되며 가장 일반적인 패턴은 다음과 같은 함수 호출입니다. (function-name arg1 arg2)
  • 코드를 데이터로 처리하고 런타임에 임의의 코드를 생성 할 수있는 강력한 매크로 시스템 (종종 새 구문으로 "언어를 확장"하거나 DSL을 생성하는 데 사용됨)
  • 다른 패러다임을 수용 할 수 있지만 함수형 프로그래밍 스타일에서 자주 사용됩니다.
  • REPL을 사용한 대화식 개발 강조 (즉, 실행중인 코드 인스턴스에서 대화식으로 개발)

Common Lisp의 특징 :

Clojure의 특징 :

  • Java 라이브러리를 직접 사용할 수 있으므로 가장 큰 라이브러리 에코 시스템
  • 표준 목록에 추가하여 표준으로 사용되는 벡터 []및지도 -벡터 및지도의 일반적인 유용성 외에도 일부 사람들은 이것이 일반적으로 더 읽기 쉽게 만드는 혁신이라고 생각합니다.{}()
  • Haskell에서 영감을 얻은 불변성과 지연 함수 프로그래밍에 대한 강조
  • 언어 수준에서 소프트웨어 트랜잭션 메모리가 지원하는 강력한 동시성 기능 (보기 : http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )

계획의 특징 :

  • 틀림없이 가장 간단하고 배우기 쉬운 Lisp
  • 위생적인 매크로 ( http://en.wikipedia.org/wiki/Hygienic_macro 참조 )-매크로 확장에서 우발적 인 기호 캡처 문제를 우아하게 방지합니다.

11
이것은 좋지만 라켓은 "단지"계획 이상이라는 것을 언급해야 할 것입니다. 여러 (그러나 관련) 언어를 지원하는 시스템입니다 (사용자가 직접 정의 할 수도 있음). 또한 clojure는 oo와 유사한 프로그래밍을 수행하는 다양한 방법을 가지고 있습니다 (둘 다 clos와 모호하게 유사한 다중 디스패치 접근 방식과 jvm에서 더 효율적인 Java에 가까운 방식). 계획은 라켓이 지원하는 r6rs를 사용하는 더 많은 표준 라이브러리 (oo도 포함)를 향해 가고 있습니다.
앤드류 쿡

2
"강하게 입력 된 동적 언어"는 마케팅입니다. 이런 의미에서 파이썬조차도 강력한 형식입니다.
ron

16
@ron : Python Lisp처럼 강력하게 입력됩니다 (Javascript 또는 VB와 달리). 대신 "정적 타이핑"대 "동적 타이핑"을 생각 하고 있습니다. 모든 종류에 대해서는 en.wikipedia.org/wiki/Type_system 을 참조하십시오 . 하지만 예, 마케팅입니다
Nas Banov 2013

2
나는 또한 Racket 이이 답변에 추가되면 좋을 것이라고 생각합니다. 커뮤니티와 언어의 초점으로 인해 Racket이 Scheme보다 배우기가 훨씬 쉽다고 생각합니다. Racket (이전 이름 ​​: PLT Scheme)은 Lisp / Scheme 제품군의 범용 다중 패러다임 프로그래밍 언어입니다. 디자인 목표 중 하나는 언어 생성, 디자인 및 구현을위한 플랫폼 역할을하는 것입니다.
mtelesha 2015

Clojure에는 위생적인 ​​매크로가 있습니다. 여기에 더 많은 정보 : xivilization.net/~marek/blog/2013/09/17/...
크리스토퍼 Kuttruff

50

위의 사람들은 몇 가지를 놓쳤습니다.

  1. Common Lisp에는 벡터와 해시 테이블도 있습니다. 차이점은 Common Lisp는 벡터에 # ()을 사용하고 해시 테이블에는 구문을 사용하지 않는다는 것입니다. Scheme에는 벡터가 있습니다.

  2. Common Lisp에는 리더 매크로가있어 새로운 대괄호를 사용할 수 있습니다 (Schema의 후손 인 Racket과 마찬가지로).

  3. Scheme과 Clojure는 Common Lisp의 비위생적 인 매크로와 달리 위생적인 ​​매크로를 가지고 있습니다.

  4. 모든 언어는 현대적이거나 광범위한 개조 프로젝트가 있습니다. Common Lisp는 지난 5 년 동안 (대부분 Quicklisp 덕분에) 광범위한 라이브러리를 확보했으며 Scheme에는 일부 현대적인 구현 (Racket, Chicken, Chez Scheme 등)이 있으며 Clojure는 비교적 최근에 생성되었습니다.

  5. Common Lisp에는 OO 시스템이 내장되어 있지만 사용했던 다른 OO 시스템과는 상당히 다릅니다. 특히,이 적용되지 않습니다 - 당신은하지 않습니다 OO 코드를 작성 할 수 있습니다.

  6. 언어마다 디자인 철학이 다소 다릅니다. Scheme은 배우 모델을 이해하기위한 최소한의 방언으로 설계되었습니다. 나중에 교육학에 사용되었습니다. Common Lisp는 생겨난 수많은 Lisp 방언을 통합하도록 설계되었습니다. Clojure는 동시성을 위해 설계되었습니다. 결과적으로 Scheme은 미니멀하고 우아하며 Common Lisp는 강력하고 패러다임에 구애받지 않는 (기능적, OO 등) 함수형 프로그래밍을 선호하는 Clojure라는 명성을 얻었습니다.


4
Racket은 호환 모드를 제외하고 Scheme의 구현 이 아닙니다 . stackoverflow.com/questions/3345397
bug

Clojure에는 내가 어려운 길을 찾았 기 때문에 위생적인 ​​매크로 가 없습니다 .
pyon

40

Lisp-1과 Lisp-2의 차이점을 잊지 마십시오.

Scheme과 Clojure는 Lisp-1입니다.
즉, 변수와 함수 이름이 동일한 네임 스페이스에 상주합니다.

Common Lisp는 Lisp-2입니다.
함수와 변수에는 서로 다른 네임 스페이스가 있습니다 (사실 CL에는 많은 네임 스페이스가 있음).


-4

Gimp는 Scheme으로 작성되었습니다. :)

사실 일부 사람들이 C ++로 작성 될 것이라고 생각하는 소프트웨어의 할당은 아마도 Lisp 우산 아래에서 수행되었을 것입니다. 무리에서 황금 사과를 선택하기가 어렵습니다. 사실 C ++가 항상 인기있는 것은 아니었고, 업데이트의 역사 때문에 오늘날에만 인기가있는 것 같습니다. 반세기 미만 동안 C ++는 멀티 스레딩도 사용하지 않았고, 파이썬은 오늘날 테스트되지 않은 쓸모없는 버그가있는 글루 코드의 cesspool이되었습니다. 조금 더 빨리 그리고 이제 우리는 기능적 프로그래밍의 증가를보고 있습니다. 나는 적응 부분에 관한 한 Java가 옳다고 생각합니다.

Scheme은 Lisp 언어를 단순화하기 위해 설계되었는데, 그 의도는 실제로 적용되지 않은 것을 제외하고는 유일한 의도였습니다. 나는 Clojure가 JVM에 대한 Scheme을 더 이상 단순화하기 위해 유사한 것을 수행한다고 생각합니다. 사용자 경험을 부풀리기위한 다른 모든 JVM 언어와 마찬가지로 Java 영역에서 상용구 작성을 단순화합니다.


2
"JVM을위한 Scheme을 더 이상 단순화하려는 의미" "다른 모든 JVM 언어와 마찬가지로"네, 맞습니다.
oskarkv

4
Gimp는 C로 작성되었으며 Scheme, Python 및 Perl을 스크립팅 언어로 지원합니다.
lbalazscs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.