{{위키데이터 속성 추적}}
{{Infobox programming language
| name = 스킴
| logo = [[파일:Lambda lc.svg|100px]]
| paradigms = [[프로그래밍 패러다임|다중 패러다임]]: [[함수형 프로그래밍|함수형]], [[명령형 프로그래밍|명령형]], [[메타프로그래밍|메타]]
| family = [[리스프]]
| year = {{시작 날짜와 나이|1975}}
| designers = [[Guy L. Steele]], [[Gerald Jay Sussman]]
| latest release version = R7RS
| latest release date = {{시작 날짜와 나이|2013}}
| latest test version = 
| latest test date = 
| typing = [[자료형 체계|동적]], [[레이턴트 타이핑|레이턴트]], [[스트롱 타이핑|스트롱]]
| scope = [[변수 영역]]
| operating system = 
| license = 
| website = 
| file_ext = .scm, .ss
| implementations = 다수
| dialects = [[래킷 (프로그래밍 언어)|래킷]], [[T (프로그래밍 언어)|T]], [[멀티리스프]]
| influenced by = [[알골 (프로그래밍 언어)]], [[리스프]], [[MDL (프로그래밍 언어)|MDL]]
| influenced = [[클로저 (프로그래밍 언어)]], [[커먼 리스프]], [[Dylan]], [[EuLisp]], [[하스켈]], [[Hop]], [[자바스크립트]], [[줄리아]], [[루아]], [[R (프로그래밍 언어)|R]], [[루비 (프로그래밍 언어)|루비]], [[러스트 (프로그래밍 언어)|러스트]], [[S (프로그래밍 언어)|S]], [[스칼라]]
| wikibooks = Scheme
}}
'''스킴'''(Scheme)은 [[함수형 프로그래밍]]과 [[절차적 프로그래밍]]을 지원하는 [[다중패러다임 프로그래밍 언어]]로 [[리스프]](LISP)의 방언(변종 언어)이다. 스킴은 1970년대에 가이 루이스 스틸 주니어(Guy Lewis Steele Jr.)와 제럴드 제이 서스먼(Gerald Jay Sussman)이 개발했다. 다른 LISP 방언과 비교할 때 단순함이 특징이다. 전통적인 LISP과 가장 큰 차이점은 [[변수 영역#동적 영역 규칙|동적 영역 규칙]] 대신 [[변수 영역#정적 영역 규칙|정적 영역 규칙]]을 사용하고 있다는 것이다. 반복문을 지원하지 않기 때문에 [[재귀함수]]를 이용하여 반복 계산을 처리한다. 따라서 대부분의 스킴 구현은 꼬리호출 최적화(tail-call optimization)를 수행한다.

== 구문과 의미 ==
스킴 구문은 S식(S-expression)뿐이다. S식은 아톰(atom)이나 리스트(list) 중 하나이며 이 중에서 리스트는 공백으로 분리된 여러 S식을 괄호로 묶은 것이다. S식이 하나도 없는 리스트는 빈 리스트라고 하여 <code>()</code>로 나타낸다. 함수 호출도 S식으로 나타낸다. 예를 들어 함수 호출 <code>(f a1 a2 ... an)</code>은 C 언어의 <code>f(a1, a2, ..., an)</code>에 해당한다고 볼 수 있다.

S식 <code>(f a1 a2 ... an)</code>는 함수 호출 결과 계산된 값을 의미하는데 이 함수 호출을 계산하는 방법은 먼저 함수 부분 <code>f</code>와 각 인수 <code>a1</code>부터 <code>an</code>까지 값을 구한 후에 함수 <code>f</code>를 인수에 적용하는 것이다. 이런 의미에서 스킴의 계산 모델을 ‘계산 후 적용 모델’(eval-apply model)이라고 부르기도 한다.

스킴에는 몇 가지 특수 구문이 존재하는데 이들 구문도 S식 형태를 이루고 있지만 특수한 방식으로 수행된다. 대표적인 특수 구문으로는 <code>quote</code>, <code>cond</code>, <code>let</code>, <code>define</code>, <code>lambda</code>가 있다. 차례로 간단히 설명하면 <code>quote</code>는 인수로 주어진 식의 값을 계산하지 않으며 <code>cond</code>는 이후 주어진 각 조건에 따라 다른 값을 계산한다. <code>let</code>은 [[지역 변수]]를 생성하며 <code>define</code>은 [[변수 (컴퓨터 과학)|변수]]의 값을 정의한다. <code>lambda</code>가 스킴의 핵심이라고 할 수 있는데 함수 값을 정의하는 구문이다. 예컨대 인수 값의 두 배를 돌려주는 함수는 <code>(lambda (n) (+ n n))</code>으로 나타낼 수 있다.

== 변수 ==
[[변수 (컴퓨터 과학)|변수]]는 동적 선언형이고 그 범위는 <code>define</code>, <code>let</code> 표현 그리고 몇 가지 스킴 형태 내에서 정의된다. 최상위 수준에 정의된 변수를 [[전역 변수]]라 한다.

== 예제 프로그램 ==
다음은 0 이상의 정수 n에 대하여 [[팩토리얼|n!]]을 돌려주는 스킴 함수를 정의한 것이다.
<syntaxhighlight lang="scheme">
 (define fac
    (lambda (n)
       (if (= n 0)
          1
          (* n (fac (- n 1))))))
</syntaxhighlight>
== 같이 보기 ==
* [[래킷 (프로그래밍 언어)]]

== 외부 링크 ==
* {{공식 웹사이트}}
* {{언어링크|en}} [http://www.r6rs.org/final/r6rs.pdf R<sup>6</sup>RS: The revised<sup>6</sup> Report on the Algorithmic Language Scheme]
* {{언어링크|en}} [https://conservatory.scheme.org/schemers/Documents/Standards/R5RS/r5rs.pdf R<sup>5</sup>RS: The revised<sup>5</sup> Report on the Algorithmic Language Scheme]
* {{언어링크|en}} [http://www.swiss.ai.mit.edu/projects/scheme/ The Scheme Programming Language] - MIT/GNU Scheme뿐만 아니라 다른 스킴 구현들도 링크되어 있다.
* {{ISBN|0262510871}}
* {{ISBN|978-89-91268-32-6}}

{{주요 프로그래밍 언어}}
{{위키공용분류}}
{{전거 통제}}
{{토막글|프로그래밍 언어}}

[[분류:함수형 프로그래밍 언어]]
[[분류:절차적 프로그래밍 언어]]
[[분류:1975년 개발된 프로그래밍 언어]]
[[분류:다중 패러다임 프로그래밍 언어]]
[[분류:리스프 프로그래밍 언어 계열]]
[[분류:동적 타입 프로그래밍 언어]]