R6RS Scheme: 개요
R6RS Scheme: 개요
R6RS(Revised6 Report on the Algorithmic Language Scheme) 문서가 다루는 Scheme 언어의 기본 개념을 소개해요. 이 장은 후속 장들을 참조 매뉴얼로 이해하는 데 필요한 핵심 개념을 설명해요.
출처: 문서
본문
이 장은 Scheme의 의미론(semantics)에 대한 개요를 제공해요. 이 개요의 목적은 참조 매뉴얼 형태로 구성된 이 리포트의 후속 장들을 이해하기 쉽게 하기 위한 언어의 기본 개념을 충분히 설명하는 것이에요. 따라서 이 개요는 언어에 대한 완전한 입문서도 아니고, 모든 면에서 정밀하지도 않으며, 어떤 면에서도 규범적(normative)이지 않아요.
Algol을 따라, Scheme는 정적 유효범위(static scoping)를 가지는 프로그래밍 언어예요. 변수의 각 사용은 그 변수의 어휘적으로 드러난(lexically apparent) 바인딩과 연관되어 있어요.
Scheme는 명시적 타입(manifest types)이 아닌 잠재적 타입(latent types)을 가져요 [28]. 타입은 변수가 아니라 객체(값이라고도 함)에 연관되어 있어요. (일부 저자들은 잠재적 타입을 가진 언어를 무타입(untyped), 약타입(weakly typed), 혹은 동적 타입(dynamically typed) 언어라고 부르기도 해요.) 잠재적 타입을 가진 다른 언어로는 Python, Ruby, Smalltalk 그리고 다른 Lisp 계열 방언들이 있어요. 명시적 타입(때로 강타입(strongly typed) 혹은 정적 타입(static typed)이라고 불림)을 가진 언어로는 Algol 60, C, C#, Java, Haskell, ML 등이 있어요.
Scheme 계산 과정에서 생성되는 모든 객체는 프로시저와 연속체(continuation)를 포함해 무한한 수명(extent)을 가져요. 어떤 Scheme 객체도 파괴되지 않아요. Scheme 구현이 저장 공간을 (보통!) 고갈시키지 않는 이유는, 구현이 어떤 객체가 미래의 어떤 계산에도 절대 중요할 수 없다는 것을 증명할 수 있다면 그 객체가 차지한 저장 공간을 회수할 수 있기 때문이에요. 대부분의 객체가 무한한 수명을 가지는 다른 언어로는 C#, Java, Haskell, 대부분의 Lisp 방언, ML, Python, Ruby, Smalltalk가 있어요.
Scheme 구현은 적절한 꼬리 재귀(properly tail-recursive)여야 해요. 이는 문법적으로 재귀적인 프로시저로 기술된 반복 계산이라 해도 상수 공간에서 실행되게 해요. 따라서 적절한 꼬리 재귀 구현에서 반복은 일반적인 프로시저 호출 메커니즘으로 표현될 수 있고, 특수한 반복 구문은 단지 문법적 설탕(syntactic sugar)으로서만 유용해져요.
Scheme는 프로시저를 그 자체로 객체로 지원한 최초의 언어 중 하나예요. 프로시저는 동적으로 생성되고, 자료구조에 저장되며, 프로시저의 결과로 반환되는 등의 일이 가능해요. 이런 속성을 가진 다른 언어로는 Common Lisp, Haskell, ML, Ruby, Smalltalk가 있어요.
Scheme의 두드러진 특징 중 하나는, 대부분의 다른 언어에서 배후에서만 작동하는 연속체(continuation)가 "일급(first-class)" 지위를 가진다는 점이에요. 일급 연속체는 비지역적 탈출(non-local exit), 백트래킹, 코루틴을 포함한 다양한 고급 제어 구문을 구현하는 데 유용해요.
Scheme에서 프로시저 호출의 인자 표현식은 프로시저가 그 평가 결과가 필요한지 여부와 무관하게 제어권을 얻기 전에 평가돼요. C, C#, Common Lisp, Python, Ruby, Smalltalk도 프로시저를 호출하기 전에 항상 인자 표현식을 평가하는 언어들이에요. 이는 인자 표현식이 프로시저가 그 값이 필요로 할 때만 평가되는 Haskell의 지연 평가(lazy evaluation) 의미론이나 Algol 60의 이름 호출(call-by-name) 의미론과는 구별돼요.
Scheme의 산술 모델은 풍부한 수치 타입과 그에 대한 연산을 제공해요. 또한 정확한(exact) 숫자 객체와 부정확한(inexact) 숫자 객체를 구별해요: 본질적으로 정확한 숫자 객체는 숫자를 정확히 대응하고, 부정확한 숫자 객체는 반올림이나 다른 오차를 포함한 계산의 결과예요.