답변:
라켓은 궁극적으로 R6RS가 아닌 R5RS를 기반으로하며 엄격한 상위 집합이 아닙니다. 나는 어떤 Scheme 표준과 호환되지 않기 때문에 'Scheme'이라고 부를 수 없다고 생각합니다.
대부분의 구현은 확장 기능을 제공하지만 이전 버전과 호환됩니다. 물론 Racket과 함께 제공되는 컴파일러도 R5RS 또는 R6RS 모드에서 실행할 수 있습니다. 라켓 모드에서 실행되는 유효한 R5 / 6RS 구성표가 거부되거나 런타임 오류가 발생하거나 다르게 동작 할 수 있습니다. 그렇게 말하면 이전 버전과 호환되지 않는 주요 포인트는 다음과 같습니다.
set-cdr!
하고 set-car!
, 오히려 set-mcar!
에만 특별히 변경할로 작성 쌍에서 작동하지 않는.letrec
이 호출 letrec*
되고 R5RS에 존재하지 않는 것, R5RS 및 R6RS 호출 letrec
이 라켓에 존재하지 않는 것( ... )
과 [ ... ]
같은 동등한, R5RS하지 않습니다,하지만 R6RS는 않습니다.아마도 더 많은 것이 있지만 대부분의 다른 부분에서 라켓은 체계의 상위 집합입니다.
()
자체 평가 를 고려하는 것 같습니다 . ()
Common Lisp에서와 같이 Scheme에서 자체 평가를하지 않은 이유 는 실제로 얻지 못했습니다 .
#%app
하지만, :#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
위에서 언급 한 것처럼 불변 목록이 들어 있습니다. 또한 R6RS 레코드 시스템보다 약간 깨끗한 구조 시스템도 포함합니다. 객체 지향 클래스와 객체 시스템이 있습니다. 계약에 의한 설계를 기본적으로 지원합니다. ML 모듈 시스템을 연상시키는 단위 시스템과 R6RS 모듈 시스템과 매우 유사한 모듈 시스템이 있습니다. 내가 언급 한 것만 큼 많은 것을 잊어 버린 것 같습니다.
이름 바꾸기가 마케팅 특수 효과 이외의 다른 용도로 유용했는지는 확실하지 않지만 라켓은 분명히 명확한 체계의 방언입니다.
PLT 구성표에서 라켓으로의 이름 변경에 대한 이론적 근거 는 라켓 사이트에서 논의 됩니다 .
Scheme 프로그래밍 언어의 언어 사양 R5RS는 여러 Scheme 구현 자 간의 합의를 기반으로합니다. 이것은 언어가 매우 안정적이라는 것을 의미합니다. 또한 많은 유용한 기능이 R5RS 표준의 일부가 아님을 의미합니다.
라켓은 R5RS를 기반으로하여 크게 확장했습니다. 일부 확장은 매크로로 정의되지만 일부 기능은 런타임 시스템의 지원이 필요합니다.
매크로만으로는 구현할 수없는 라켓의 기능 :
모듈 및 매크로 시스템은 RnRS 사양보다 훨씬 일반적입니다. 함께 #lang
리더 / 언어 사양이 가능 (사용자 정의 구문) 사용자 정의 언어를 정의하고 일반 라켓 프로그램을 사용할 수 있습니다.
몇몇 경우에 라켓은 R5RS와 다른 행동을하는 구조를 가지고 있습니다. 가장 확실한 것은 cons
불변 쌍을 mcons
구성하는 것입니다 (변하기 쉬운 쌍을 구성). 불변 쌍을 갖는 것의 하나의 이점은 length
이제 O (1) 상각 시간으로 실행 된다는 것이다.
라켓에는 "match" 와 같이 R6RS 체계에 포함되지 않은 정말 멋진 언어 구조가 많이 포함되어 있습니다.
match
매우 좋지만 다행히도 매크로 일 뿐이므로이를 가지고 있지 않은 Lisp에 쉽게 추가 할 수 있습니다. Common Lisp는를 통해 목록에서 조명 패턴 일치를 수행 할 수 있습니다 destructuring-bind
. 그것을 destructuring-case
기반으로 매크로 를 작성하는 것은 간단 하며 많은 사람들이 가지고 있습니다. 구성표에는 휴대용 match
라이브러리가 있습니다. Clojure의가있다 core.match
.
()
에서는 유효하지 않으며 자체 평가가 아닙니다. 또한 라켓 은 더 제한적입니다letrec
– 예를 들어,r5rs
언어의 것;letrec*
기본 언어에서 -like 버전 을 사용하는 것은 의도적 인 선택 입니다.