라켓은 구성표와 어떻게 다릅니 까?


184

라켓은 계획의 자손입니다. 라켓은 R6RS와 어떻게 다릅니 까? 무엇을 추가 또는 제거 했습니까, 아니면 다른가요?

라켓은 언어 그 이상이며 언어 플랫폼입니다. 그러나 나는 주요 라켓 방언을 언급하고 있습니다.

답변:


132

라켓은 궁극적으로 R6RS가 아닌 R5RS를 기반으로하며 엄격한 상위 집합이 아닙니다. 나는 어떤 Scheme 표준과 호환되지 않기 때문에 'Scheme'이라고 부를 수 없다고 생각합니다.

대부분의 구현은 확장 기능을 제공하지만 이전 버전과 호환됩니다. 물론 Racket과 함께 제공되는 컴파일러도 R5RS 또는 R6RS 모드에서 실행할 수 있습니다. 라켓 모드에서 실행되는 유효한 R5 / 6RS 구성표가 거부되거나 런타임 오류가 발생하거나 다르게 동작 할 수 있습니다. 그렇게 말하면 이전 버전과 호환되지 않는 주요 포인트는 다음과 같습니다.

  • 라켓은 더있다 set-cdr!하고 set-car!, 오히려 set-mcar!에만 특별히 변경할로 작성 쌍에서 작동하지 않는.
  • R6RS에서 라켓 호출 letrec이 호출 letrec*되고 R5RS에 존재하지 않는 것, R5RS 및 R6RS 호출 letrec이 라켓에 존재하지 않는 것
  • 라켓에서는 많은 것들이 자체 평가 중이며 R5RS에서 가장 중요한 것은 빈 목록 입니다.
  • R6RS도 대소 문자를 구분하지만 라켓은 대소 문자를 구분합니다.
  • 라켓 취급 ( ... )[ ... ]같은 동등한, R5RS하지 않습니다,하지만 R6RS는 않습니다.

아마도 더 많은 것이 있지만 대부분의 다른 부분에서 라켓은 체계의 상위 집합입니다.


24
라켓 ()에서는 유효하지 않으며 자체 평가가 아닙니다. 또한 라켓 더 제한적입니다 letrec– 예를 들어, r5rs언어의 것; letrec*기본 언어에서 -like 버전 을 사용하는 것은 의도적 인 선택 입니다.
Eli

9
@ Eli, 으악, 맞아, Swindle 모드에서 실행되는 라켓은 ()자체 평가 를 고려하는 것 같습니다 . ()Common Lisp에서와 같이 Scheme에서 자체 평가를하지 않은 이유 는 실제로 얻지 못했습니다 .
Zorf

그것은 쉽게 과부하에 의해 변경 될 수 @Zorf #%app하지만, :#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
수잔 Dupéron

2
이 답변은 업데이트되어야합니다. 라켓의 기능 세트는 현재 모듈과 언어 정의 등 Scheme의 기능을 능가합니다.
CinchBlue

1
@MaliRemorker 정확히 무슨 말인지 이해하지 못하지만 Scheme은 현재 R7RS에 있으며 R6RS에 있습니다. 그러나 Racket은 여전히 ​​R6RS 기능 세트를 능가합니다.
CinchBlue

36

위에서 언급 한 것처럼 불변 목록이 들어 있습니다. 또한 R6RS 레코드 시스템보다 약간 깨끗한 구조 시스템도 포함합니다. 객체 지향 클래스와 객체 시스템이 있습니다. 계약에 의한 설계를 기본적으로 지원합니다. ML 모듈 시스템을 연상시키는 단위 시스템과 R6RS 모듈 시스템과 매우 유사한 모듈 시스템이 있습니다. 내가 언급 한 것만 큼 많은 것을 잊어 버린 것 같습니다.

이름 바꾸기가 마케팅 특수 효과 이외의 다른 용도로 유용했는지는 확실하지 않지만 라켓은 분명히 명확한 체계의 방언입니다.


24
나는 이름이 여러 가지 비표준 추가로 Scheme의 방언이되고 싶지 않았기 때문에 이름이 바뀌 었다고 생각합니다. 더 많은 표준을 가진 Scheme 기반 언어가되고 싶었습니다. PLT Scheme을 "그냥"Scheme의 방언으로 분류하는 것은 Ruby를 Mirah의 방언으로 분류하는 것과 같습니다. 부정확하지는 않지만 언어의 강점을 약간 저하시킵니다.

5
다른 이름을 사용하는 것이 현명한 결정이라고 생각합니다. 공통된 언어를 가진 다른 언어에 동일한 이름을 사용하는 것은 혼란 스럽습니다. 언어에 Scheme이 하위 세트로 포함되어 있지만 너무 많은 추가 사항이 포함되어 있어도 매우 다른 프로그래밍 스타일을 장려하더라도 이름을 변경할 것입니다.
Giorgio


18

Scheme 프로그래밍 언어의 언어 사양 R5RS는 여러 Scheme 구현 자 간의 합의를 기반으로합니다. 이것은 언어가 매우 안정적이라는 것을 의미합니다. 또한 많은 유용한 기능이 R5RS 표준의 일부가 아님을 의미합니다.

라켓은 R5RS를 기반으로하여 크게 확장했습니다. 일부 확장은 매크로로 정의되지만 일부 기능은 런타임 시스템의 지원이 필요합니다.

매크로만으로는 구현할 수없는 라켓의 기능 :

  • 구분 된 연속 (call / cc보다 일반적)
  • 연속 마크
  • 장소
  • ffi

모듈 및 매크로 시스템은 RnRS 사양보다 훨씬 일반적입니다. 함께 #lang리더 / 언어 사양이 가능 (사용자 정의 구문) 사용자 정의 언어를 정의하고 일반 라켓 프로그램을 사용할 수 있습니다.

몇몇 경우에 라켓은 R5RS와 다른 행동을하는 구조를 가지고 있습니다. 가장 확실한 것은 cons불변 쌍을 mcons구성하는 것입니다 (변하기 쉬운 쌍을 구성). 불변 쌍을 갖는 것의 하나의 이점은 length이제 O (1) 상각 시간으로 실행 된다는 것이다.


2
...하지만 O (1) 목록 추가가 불가능합니다.
Will Ness

16

라켓에는 "match" 와 같이 R6RS 체계에 포함되지 않은 정말 멋진 언어 구조가 많이 포함되어 있습니다.


3
"일치"가 좋은 기능인 이유는 무엇입니까? 적어도 의견을 표현할 때, 간단한 설명을해야 라켓에 익숙하지 않은 사람들이 왜 "일치"가 이론적으로 유익한지를 이해할 수 있습니다.
nbro

1
패턴 매칭은 함수형 프로그래밍 배경을 가진 많은 언어에서 실제로 원하는 기능입니다. 불행히도 R6RS 또는 Common Lisp조차도 기본적으로 이것을 구현하지 않으므로 Racket이 제공하는 정말 훌륭하고 차별화 된 기능입니다. 예를 들어 Haskell, Elixir, Rust 및 F #과 같은 언어는 이러한 유형의 구성을 제공하며 많이 사용됩니다. 개인적으로 Lisp 프로그래밍을 주로 Common Lisp에서 만들고 패턴 일치 구현이 부족하다는 사실을 많이 봅니다.
Manoel Vilela

1
match매우 좋지만 다행히도 매크로 일 뿐이므로이를 가지고 있지 않은 Lisp에 쉽게 추가 할 수 있습니다. Common Lisp는를 통해 목록에서 조명 패턴 일치를 수행 할 수 있습니다 destructuring-bind. 그것을 destructuring-case기반으로 매크로 를 작성하는 것은 간단 하며 많은 사람들이 가지고 있습니다. 구성표에는 휴대용 match라이브러리가 있습니다. Clojure의가있다 core.match.
Lassi

매크로는 종종 특수한 의미론을 가지고 있기 때문에 코드를 읽기 어렵게 만들 수 있으므로 언어는 항상 모든 범용 매크로를 표준화하여 모든 사람이 자체 매크로를 작성하지 않도록해야합니다. 패턴 일치는 의도를보다 직접적으로 지정하므로 Arc & Clojure & Racket & Ocaml & Haskell과 같이 기본값이어야합니다. 캐더의 레벨이 너무 낮습니다.
aoeu256

12

하나의 큰 예를 들어, 라켓 목록은 기본적으로 변경 불가능하지만 Scheme은 변경 가능합니다. 라켓에는 또한 다른 체계에는없는 많은 표준 라이브러리 (예 : 웹 서버)가 포함되어 있습니다.

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