문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 Scheme (문단 편집) == 특징 == 다른 리스프 계열[* Clojure 제외]보다 함수형 프로그래밍을 적극 장려하는 언어로, 언어 표준에 순수 함수형에서 벗어나는 함수 이름 뒤에는 꼭 "!"를 붙이는 것을 관례로 명시할 정도이다.[* 예를 들어 (set! a 1)은 이미 만들어진 이름 a에다가 새로 1을 배정한다.] 그러나 그보다 더 핵심적인 특징은 최소한의 기본 명령만 기계어로 정의가 되어있고, 언어 표준에 명시된 다른 명령들은 기본 명령에 속한 람다(lambda)함수를 이용해 정의가 되어있다는 것이다. 이 때문에 스킴은 다른 프로그래밍 언어에 비해 매우 사이즈가 작으면서도, 기본만 사용해 필요에 따라 무엇이든 정의해 사용할 수 있는 독특한 디자인을 가지고 있다. 커먼 리스프를 109가지 기능이 붙어있는 다목적 공구에 비유하자면, 스킴은 딱 최소한의 10개 기능만 붙어있는 맥가이버 칼에 비유할 수 있다. 같은 뿌리에서 나온 다른 사이즈의 언어라는 점에서 C++와 C의 관계와도 비슷할지도 모르겠지만, C++의 기능을 C에서 구현하려면 오만가지 삽질을 해야하는데 비해 스킴은 커먼 리스프의 기능을 구현 가능한, Greenspun's Tenth Rule[* "Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp." 복잡한 C나 포트란 프로그램은 커먼 리스프에 이미 기본적으로 있는 기능을 직접 만들어 써야 할 가능성이 높은데, 큰 기능들을 여러 개 구현하려다보니 대충 끼워맞추고 상세도 불분명해 버그가 넘쳐나고 느릴 수밖에 없다는 말이다.]에서 가장 안전한 언어라 할 수 있다. 위에 말했듯이 스킴은 워낙 표준에 따라 다양한 구현이 있고, 그마저도 표준은 그저 대충 거의 다 지키면 되는 것. 수준의 인식이 있어서 각각의 구현이 조금씩 다른 언어나 방언이라고 할 수 있다. 관계가 조금 먼 Racket을 제외하면, 스킴을 스킴으로 묶는 특성은 다음과 같다. * Lambda: 스킴의 뿌리인 [[람다식]]. (lambda (x) ...)로 스킴에 존재하는 거의 모든 것을 나타낼 수 있다. [[https://ko.wikipedia.org/wiki/람다_대수#람대 대수|람다 대수]]에서의 그 람다 맞다. * Tail-call elimination (TCE): 위에서 나왔듯 "함수간에 값을 주고받는 형식"이 아닌 "값을 환경으로 두고 함수를 점프해서 갈아끼우는 방식"을 일반화한 것으로, 함수 A가 B를 부를 때 B를 부르는 장소가 Tail[* B를 부른 후에 할 것이 return밖에 없는 경우]인 경우 그냥 B의 주소로 점프해버리는 방식이다. 하는 법을 알면 재귀적 함수를 부를 때 절대 스택 오버플로우가 나지 않으며 함수 호출 속도도 빠른 스킴의 전매특허 특징으로, 언어 상세에 "tail-call elimination을 하지 않으면 스킴이 아니다"라고 명시되어 있을 정도다. 이후에 많은 언어(주로 함수형) 에서 채용했다.[* GCC에서 -O2를 하면 C에서도 제약이 많지만 TCE가 된다!] * Continuation: TCE과 함께 연구의 부산물로, TCE가 함수에 대한 설명이라면 Continuation은 환경에 대한 설명이다. 함수가 서로를 호출하고 자리를 넘겨줄 때 주변 환경을 같이 연속적(continuous)으로 넘겨준다는 의미로, 핵심 call/cc[* call-with-current-continuation]라는 명령어는 "현재 환경을 기억했다가 새 값을 넘겨받으면 이 자리로 즉시 돌아와서 값을 전달해라"라는 뜻으로 쓰인다. 실 용례로는 간단하게는 return, break 등의 대용품, 복잡하게는 멀티태스킹 관리(!) 등이 있다. 이해하기 복잡하면 C의 setjmp/longjmp의 업그레이드 버전이라 생각하면 된다. * S-expression: 리스프라면 빼놓을 수 없는 문법 구조로, atom(심볼, 문자, 문자열, 숫자 등)과 괄호 리스트 딱 두개로만 이루어져있어 코드 (car a)와 데이터 '(car a)의 구조가 똑같고 바꿔치기도 가능하다. 이를 Homoiconicity라고 한다. * Macro: 바로 그 바꿔치기를 가능하게 하는 일등공신으로, 기본 매크로는 커먼 리스프의 매크로보다 덜 강력하지만 오류가 적고 간편한 문법을 사용하며[* "..." 점 3개로 뭐든지 패턴매칭이 가능하다!], 대부분의 스킴은 자체적으로 커먼 리스프 수준의 매크로도 함께 지원한다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기