스킴 (프로그래밍 언어)
스킴 프로그래밍 언어(Scheme)는 함수형 프로그래밍과 절차적 프로그래밍을 지원하는 다중패러다임 프로그래밍 언어로, 리스프(LISP)의 방언(변종 언어)이다. 1970년대 Guy Lewis Steele Jr. 과 Gerald Jay Sussman 에 의해서 개발되었다. 다른 LISP 방언과 비교할 때 단순함이 특징이다. 전통적인 LISP과 가장 큰 차이점은 동적 영역 규칙 대신 정적 영역 규칙을 사용하고 있다는 것이다. 반복문을 지원하지 않기 때문에 재귀함수를 이용하여 반복 계산을 처리한다. 따라서 대부분의 스킴 구현은 꼬리호출 최적화(tail-call optimization)를 수행한다.
패러다임 | 다중 패러다임: 함수형, 명령형, 메타 |
---|---|
계열 | 리스프 |
설계자 | Guy L. Steele, Gerald Jay Sussman |
발표일 | 1975년 |
최근 버전 | R7RS |
최근 버전 출시일 | 2013년 |
자료형 체계 | 동적, 레이턴트, 스트롱 |
변수 영역 | 변수 영역 |
파일 확장자 | .scm, .ss |
웹사이트 | www |
주요 구현체 | |
다수 | |
방언 | |
래킷, T, 멀티리스프 | |
영향을 받은 언어 | |
알골 (프로그래밍 언어), 리스프, MDL | |
영향을 준 언어 | |
클로저 (프로그래밍 언어), 커먼 리스프, Dylan, EuLisp, 하스켈, Hop, 자바스크립트, 줄리아, 루아, R, 루비, 러스트, S, 스칼라 |
구문과 의미
편집스킴 구문은 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
- (영어) The revised5 Report on the Algorithmic Language Scheme[깨진 링크(과거 내용 찾기)]
- (영어) Racket - 안정적인 스킴 해석기. 이전에는 Dr Scheme, PLT Scheme이라고 불렸으나 지금은 이름이 Racket으로 바뀌었다.
- (영어) The Scheme Programming Language - MIT/GNU Scheme뿐만 아니라 다른 스킴 구현들도 링크되어 있다.
- (영어) Hal Abelson, Jerry Sussman and Julie Sussman. 《Structure and Interpretation of Computer Programs,》. 2017년 12월 26일에 원본 문서에서 보존된 문서. 2009년 6월 19일에 확인함.
- (한국어) 번역서: 김재우, 안윤호, 김수정 옮김. 《『컴퓨터 프로그램의 구조와 해석』》. 2016년 3월 13일에 원본 문서에서 보존된 문서. 2009년 6월 19일에 확인함.
이 글은 프로그래밍 언어에 관한 토막글입니다. 여러분의 지식으로 알차게 문서를 완성해 갑시다. |