스킴 (프로그래밍 언어)
패러다임 | 다중 패러다임: 함수형, 명령형, 메타 |
---|---|
계열 | 리스프 |
설계자 | Guy L. Steele, Gerald Jay Sussman |
발표일 | 1975년 |
최근 버전 | R7RS |
최근 버전 출시일 | 2013년 |
자료형 체계 | 동적, 레이턴트, 스트롱 |
변수 영역 | 변수 영역 |
파일 확장자 | .scm, .ss |
웹사이트 | www |
주요 구현체 | |
다수 | |
방언 | |
래킷, T, 멀티리스프 | |
영향을 받은 언어 | |
알골 (프로그래밍 언어), 리스프, MDL | |
영향을 준 언어 | |
클로저 (프로그래밍 언어), 커먼 리스프, Dylan, EuLisp, 하스켈, Hop, 자바스크립트, 줄리아, 루아, R, 루비, 러스트, S, 스칼라 |
스킴(Scheme)은 함수형 프로그래밍과 절차적 프로그래밍을 지원하는 다중패러다임 프로그래밍 언어로 리스프(LISP)의 방언(변종 언어)이다. 스킴은 1970년대에 가이 루이스 스틸 주니어(Guy Lewis Steele Jr.)와 제럴드 제이 서스먼(Gerald Jay Sussman)이 개발했다. 다른 LISP 방언과 비교할 때 단순함이 특징이다. 전통적인 LISP과 가장 큰 차이점은 동적 영역 규칙 대신 정적 영역 규칙을 사용하고 있다는 것이다. 반복문을 지원하지 않기 때문에 재귀함수를 이용하여 반복 계산을 처리한다. 따라서 대부분의 스킴 구현은 꼬리호출 최적화(tail-call optimization)를 수행한다.
구문과 의미
[편집]스킴 구문은 S식(S-expression)뿐이다. S식은 아톰(atom)이나 리스트(list) 중 하나이며 이 중에서 리스트는 공백으로 분리된 여러 S식을 괄호로 묶은 것이다. S식이 하나도 없는 리스트는 빈 리스트라고 하여 ()
로 나타낸다. 함수 호출도 S식으로 나타낸다. 예를 들어 함수 호출 (f a1 a2 ... an)
은 C 언어의 f(a1, a2, ..., an)
에 해당한다고 볼 수 있다.
S식 (f a1 a2 ... an)
는 함수 호출 결과 계산된 값을 의미하는데 이 함수 호출을 계산하는 방법은 먼저 함수 부분 f
와 각 인수 a1
부터 an
까지 값을 구한 후에 함수 f
를 인수에 적용하는 것이다. 이런 의미에서 스킴의 계산 모델을 ‘계산 후 적용 모델’(eval-apply model)이라고 부르기도 한다.
스킴에는 몇 가지 특수 구문이 존재하는데 이들 구문도 S식 형태를 이루고 있지만 특수한 방식으로 수행된다. 대표적인 특수 구문으로는 quote
, cond
, let
, define
, lambda
가 있다. 차례로 간단히 설명하면 quote
는 인수로 주어진 식의 값을 계산하지 않으며 cond
는 이후 주어진 각 조건에 따라 다른 값을 계산한다. let
은 지역 변수를 생성하며 define
은 변수의 값을 정의한다. lambda
가 스킴의 핵심이라고 할 수 있는데 함수 값을 정의하는 구문이다. 예컨대 인수 값의 두 배를 돌려주는 함수는 (lambda (n) (+ n n))
으로 나타낼 수 있다.
변수
[편집]변수는 동적 선언형이고 그 범위는 define
, let
표현 그리고 몇 가지 스킴 형태 내에서 정의된다. 최상위 수준에 정의된 변수를 전역 변수라 한다.
예제 프로그램
[편집]다음은 0 이상의 정수 n에 대하여 n!을 돌려주는 스킴 함수를 정의한 것이다.
(define fac
(lambda (n)
(if (= n 0)
1
(* n (fac (- n 1))))))
같이 보기
[편집]외부 링크
[편집]- 스킴 - 공식 웹사이트
- (영어) R6RS: The revised6 Report on the Algorithmic Language Scheme
- (영어) R5RS: The revised5 Report on the Algorithmic Language Scheme
- (영어) The Scheme Programming Language - MIT/GNU Scheme뿐만 아니라 다른 스킴 구현들도 링크되어 있다.
- ISBN 0262510871
- ISBN 978-89-91268-32-6
이 글은 프로그래밍 언어에 관한 토막글입니다. 여러분의 지식으로 알차게 문서를 완성해 갑시다. |