스킴(프로그래밍 언어)

Scheme (programming language)
스킴
Lambda lc.svg
패러다임멀티패러다임: 기능, 필수, 메타
가족리스프
설계자가이 L. 스틸
제럴드 제이 서스먼
처음 등장한1975년; 47년 전 (재설정)
안정된 릴리스
R7RS / 2013, 9년 전(2013년)
타이핑 분야동적, 잠재성, 강성
범위어휘
파일 이름 확장자.scm, .ss
웹 사이트www.scheme-reports.org
주요 구현
많이
(스킴의 실장 참조)
영향을 받다
ALGOL, 리스프, MDL
영향받은
Clojure, Common Lisp, Dylan, EuLisp, Haskell, Hop, JavaScript, Julia, Lua, MultiLisp, Python, R, Rocke, Rust, S, Scala, T

Scheme리스프족 프로그래밍 언어방언입니다.스킴은 1970년대에 MIT AI 연구소에서 만들어졌으며 개발자인 가이 스틸과 제럴드 제이 서스먼에 의해 현재 람다 페이퍼스로 알려진 일련의 메모를 통해 공개되었다.Lisp의 첫 번째 방언으로 어휘적 범위를 선택하였고, 테일콜 최적화를 수행하기 위해 구현을 요구한 첫 번째 방언으로, 기능적 프로그래밍과 재귀 알고리즘과 같은 관련 기술을 더욱 강력하게 지원하였다.또한 1등급 연속성지원하는 최초의 프로그래밍 언어 중 하나이기도 했습니다.그것은 Common [1]Lisp의 발전을 이끈 노력에 큰 영향을 미쳤다.

Scheme 언어는 공식[2] IEEE 표준 및 Algorithmic Language Scheme(RnRS; 알고리즘 언어 체계에 관한 개정 보고서)라고n 불리는 사실상의 표준으로 표준화되어 있습니다.널리 구현된 표준은 R5RS(1998)[3]이다.가장 최근에 승인된 체계의 표준은 "R7RS-small"(2013년)[4]이다.보다 광범위하고 모듈러형 R6RS는 [5]2007년에 비준되었습니다.둘 다 R5RS로부터의 하강을 추적한다.아래의 스케줄은 비준의 시간순서를 반영하고 있다.

역사

오리진스

스킴은 1970년대에 칼 휴이트배우 모델을 이해하기 위한 시도로 시작되었는데, 스틸과 서스먼은 맥클립을 사용하여 "타이니 리스프 인터프리터"를 쓴 후 "배우를 [6]만들고 메시지를 보내기 위한 메커니즘을 추가했다"고 말했다.스킴은 원래 플래너나 코니버와 같은 리스프에서 유래한 다른 언어들의 전통에서 "Schemer"라고 불렸다.현재의 이름은 저자가 ITS 운영체제를 사용했기 때문에 생겨났습니다.이 운영체제는 파일명을 각각 최대 6자로 구성된 2개의 컴포넌트로 제한했습니다.현재 "Schemer"는 Scheme 프로그래머를 가리키는 데 일반적으로 사용됩니다.

R6RS

새로운 언어 표준화 프로세스는 2003년 스킴 워크숍에서 시작되었으며, 2006년에 R6RS 표준을 만드는 것을 목표로 하고 있습니다.이 과정은 만장일치의 초기 RnRS 접근방식으로 깨졌다.

R6RS는 표준 모듈 시스템을 갖추고 있어 핵심 언어와 라이브러리를 분할할 수 있습니다.R6RS 규격의 많은 초안이 발표되었으며, 최종 버전은 R5.97RS이다.투표에 [5]성공하여 2007년 8월 28일에 발표된 새로운 표준이 승인되었습니다.

현재 다양한 스킴 구현의[7] 최신 릴리스는 R6RS 표준을 지원합니다.syntax라고 불리는 R6RS를 위한 암묵적 단계별 라이브러리의 휴대용 참조 구현이 있으며, 이는 다양한 오래된 스킴 [8]구현에 적절히 로드 및 부트스트랩됩니다.

R6RS 의 기능은, Record-Type Descriptor(RTD; 레코드 타입 디스크립터)입니다.RTD를 생성하여 사용하면 레코드 유형 표현에 메모리 레이아웃이 표시될 수 있습니다.또한 오브젝트 필드 비트마스크와 변경 가능한Scheme 오브젝트필드 비트마스크를 계산하여 가비지 컬렉터가 RTD에 저장되어 있는 필드 리스트 전체를 통과하지 않고 필드를 어떻게 처리해야 하는지 알 수 있도록 합니다.RTD를 사용하면 기본 RTD를 확장하여 새로운 레코드 [9]시스템을 만들 수 있습니다.

R6RS는 [10]언어에 수많은 중요한 변화를 가져옵니다.이제 소스 코드가 Unicode로 지정되고 Unicode 문자의 큰 부분 집합이 Scheme 기호 및 식별자에 나타날 수 있으며 어휘 규칙에 다른 사소한 변경 사항이 있습니다.문자 데이터도 유니코드로 지정됩니다.많은 표준 절차들이 새로운 표준 라이브러리로 옮겨졌고, 그 자체도 표준의 일부가 아니었던 절차와 통사적 형식을 포함하는 표준의 대규모 확장을 이루고 있다.새로운 모듈 시스템이 도입되어 예외 처리를 위한 시스템이 표준화되었습니다.구문 규칙은 매크로 확장 시 모든 스킴을 사용할 수 있는 보다 표현적인 구문 추상화 기능(syntax-case)으로 대체되었습니다.이제 스킴의 완전한 숫자 타워를 지원하기 위해 준거 구현이 필요하며, 숫자의 의미는 주로 부동 소수점 숫자 표현을 위한 IEEE 754 표준을 지원하는 방향으로 확장되었습니다.

R7RS

R6RS 표준은 일부에서 미니멀리즘 [11][12]철학을 벗어나는 것으로 보기 때문에 논란을 일으켰다.2009년 8월 표준화 프로세스를 감독하는 Scheme Steering Committee는 스킴을 2개의 언어로 분할할 것을 권장합니다.프로그래머를 위한 대형 현대 프로그래밍 언어와 교육자 및 캐주얼한 [13]구현자가 칭찬하는 미니멀리즘을 유지하는 대형 버전의 서브셋입니다.이 두 가지 새로운 버전의 Scheme에서 작업하기 위해 두 개의 작업 그룹이 생성되었습니다.Scheme Reports Process 사이트에는 작업 그룹의 헌장, 공개 토론 및 문제 추적 시스템에 대한 링크가 있습니다.

R7RS(소형 언어)의 9차 초안은 2013년 [14]4월 15일에 제공되었습니다.이 초안을 승인하는 투표는 2013년 [15]5월 20일에 종료되었으며, 최종 보고서는 2013년 8월 6일부터 제공되어 "그 노력의 '작은' 언어이므로 R6RS의 후속 기기로서 단독으로 고려할 수 없다"[4]고 기술하고 있다.

1955 1960 1965 1970 1975 1980 1985 1990 1995 2000 2005 2010 2015 2020
LISP 1, 1.5, LISP 2(abandoned)
마클리스프
인터리스크
MDL
리스프 기계 리스프
스킴 R5RS R6RS R7RS 소형
없음
ZIL(Zork 구현 언어)
프란츠 리스프
일반적인 리스프
르 리스프
MIT 스킴
T
체즈 스킴
Emacs 리스프
자동 LISP
피코리스프
EuLisp
ISLISP
오픈리스프
PLT 방식 라켓
GNU Guile
비주얼 LISP
클로쥬르
LFE
하이

특징의 구별

스킴은 주로 기능성 프로그래밍 언어입니다.Lisp 프로그래밍 언어 패밀리의 다른 멤버들과 많은 특징을 공유합니다.Scheme의 매우 간단한 구문은 s-표현식, 괄호 안의 목록, prefix 연산자 뒤에 인수가 이어지는 것을 기반으로 합니다.따라서 스킴 프로그램은 중첩된 목록의 시퀀스로 구성됩니다.리스트는 스킴의 주요 데이터 구조이기 때문에 소스 코드와 데이터 형식(호모아이코니시티)이 거의 일치합니다.스킴 프로그램은 스킴 코드 조각을 동적으로 쉽게 만들고 평가할 수 있습니다.

데이터 구조로서의 리스트에 대한 의존도는 모든 리스프 방언에서 공유됩니다.Scheme는 Lisp의 조상으로부터와 같은 풍부한 목록 처리 프리미티브 세트를 상속합니다.스킴은 엄격하지만 동적으로 입력된 변수를 사용하며 퍼스트 클래스 절차를 지원합니다.따라서 프로시저는 변수에 값으로 할당되거나 프로시저에 인수로 전달될 수 있습니다.

이 섹션에서는 Scheme를 다른 Lisps와 구별하는 특징을 포함하여 언어의 혁신적인 특징에 초점을 맞춘다.달리 명시되지 않은 한, 특징의 설명은 R5RS 표준과 관련된다.이 절에서 제공하는 예에서는 "===> result" 표기를 사용하여 직전 줄의 식을 평가한 결과를 나타냅니다.이것은 R5RS에서 사용되는 것과 같은 표기법입니다.

미니멀리즘

스킴은 매우 단순한 언어이며, 동등한 [16]표현력을 가진 다른 많은 언어보다 구현이 훨씬 쉽습니다.이러한 용이성은 람다 미적분을 사용하여 보다 원시적인 형태에서 언어의 구문 대부분을 도출했기 때문입니다.예를 들어, R5RS 체계 표준에 정의된 23개의 s-표현 기반 구문 구조의 경우, 14개는 파생 형식 또는 라이브러리 형식으로 분류되며, 이는 주로 람다와 같은 보다 기본적인 형식을 포함하는 매크로로 작성될 수 있다.R5RS(33.1)가 말하듯이, "변수 바인딩 구조 중 가장 기본적인 것은 람다 식이다. 왜냐하면 다른 모든 변수 바인딩 구조는 람다 [3]식으로 설명될 수 있기 때문이다."

기본 형식: 정의, 람다, 따옴표, if, 정의 구문, let-syntax, letrec-syntax, 구문 규칙, 설정!
파생 형식: do, let, let*, letrec, condition, case 및 또는 begin, let, delay, unquote, quiquote

예: 구현할 매크로let사용하는 표현으로서lambda변수 바인딩을 수행합니다.

(정의 표시허락하다   (구문 검색()     ((허락하다((변화하다 expr) ...)  ...)       ((람다(변화하다 ...)  ...) expr ...)))) 

이 때문에,let위에서 정의한 바와 같이, 스킴의 실장은 「」를 고쳐 씁니다.(let ((a 1)(b 2)) (+ b a))" 로서.((lambda (a b) (+ b a)) 1 2)이는 구현 작업을 코딩 프로시저 인스턴스화의 작업으로 줄여줍니다.

1998년, Sussman과 Steel은 Scheme의 미니멀리즘은 의식적인 설계 목표가 아니라 설계 과정의 의도하지 않은 결과라고 언급했습니다.「실제로, 복잡한 것을 만들려고 하고 있었습니다만, 우연하게도, 우리가 의도한 것보다 훨씬 심플한 것을 설계하고 있었습니다.우리는 람다 미적분(작고 단순한 형식주의)이 강력하고 표현력 있는 프로그래밍 언어의 핵심 역할을 할 수 있다는 것을 깨달았다."[6]

어휘 범위

대부분의 현대 프로그래밍 언어 및 Maclisp와 같은 이전 Lisps와 달리 Scheme는 어휘 범위입니다. 프로그램 유닛에서 가능한 모든 변수 바인딩은 호출할 수 있는 컨텍스트를 고려하지 않고 프로그램 유닛의 텍스트를 읽음으로써 분석될 수 있습니다.이것은 초기 리스프 방언의 특징이었던 동적 범위 지정과 대조되는데, 이는 당시의 컴파일러 및 인터프리터에서 어휘 범위 지정 알고리즘을 구현하기 위해 사용된 원시 텍스트 대체 방법과 관련된 처리 비용 때문이다.이러한 Lisps에서는 프로시저 내의 자유변수에 대한 참조가 콜의 맥락에 따라 프로시저 외부의 상당히 다른 바인딩을 참조하는 것이 완벽하게 가능했습니다.

1970년대 초 흔치 않은 스코핑 모델이었던 어휘 스코핑을 Lisp의 새로운 버전에 포함시킨 계기는 ALGOL에 대한 서스만의 연구에서 비롯되었다.그는 ALGOL과 같은 어휘 스코핑 메커니즘Hewitt의 Actor 모델[6]Lisp에 구현하려는 초기 목표를 실현하는 데 도움이 될 것이라고 제안했다.

어휘 범위를 리스프 방언으로 도입하는 방법에 대한 주요 통찰력은 서스먼과 스틸의 1975년 람다 페이퍼 "Scheme:확장된 람다 미적분을 위한 해석자"[17]에서, 그들은 1970년 조엘 모세의 AI 메모에 기술된 어휘 폐쇄 개념을 채택했습니다(21페이지). 그는 이 아이디어를 피터 J. 랜딘의 아이디어로 돌렸습니다.[18]

람다 미적분

Alonzo Church의 수학적 표기법인 람다 미적분은 Lisp가 절차를 도입하기 위한 키워드로 "lambda"를 사용하는 것과 동시에 Lisp에서 고차 함수를 사용하는 것과 관련된 함수 프로그래밍 기술의 개발에 영향을 미치는 것에 영감을 주었다.그러나 초기 Lisps는 자유 [6]변수를 다루기 때문에 람다 미적분의 적절한 표현은 아니었다.

공식 람다 시스템은 공리와 완전한 계산 규칙을 가지고 있다.수학적 논리와 도구를 이용한 분석에 도움이 됩니다.이 시스템에서 계산은 방향성 연산으로 볼 수 있다.람다 미적분의 구문은 x, y, z, ..., 부모, 공백, 마침표 및 기호 [19]λ에서 나오는 재귀식을 따릅니다.람다 계산 기능에는 다음이 포함됩니다.첫째, 강력한 수학적 논리의 출발점 역할을 한다.둘째, 기계 평가를 모방하는 데 사용할 수 있기 때문에 프로그래머가 구현 세부사항을 고려할 필요가 줄어듭니다.마지막으로 람다 계산은 상당한 메타이론을 [20]만들어냈다.

어휘적 범위의 도입은 람다 표기법의 일부 형태와 작동 프로그래밍 언어의 실용적 표현 사이에 등가성을 만들어 문제를 해결했다.서스먼과 스틸은 새로운 언어가 단순한 프로시저 인스턴스화가 아닌 "컨트롤 구조와 환경 수정자"[21]로서 람다 표현식을 사용함으로써 ALGOL과 Fortran을 포함한 다른 프로그래밍 언어의 모든 명령적 의미론 및 선언적 의미론, 그리고 다른 Lisps의 동적 범위를 우아하게 도출하기 위해 사용될 수 있다는 것을 보여주었다.그들은 람다 논문의 첫 번째에서 체계에 대한 첫 번째 설명과 함께 연속 통과 스타일을 도입했고, 후속 논문에서 람다 미적분의 실제적인 사용의 원초적인 힘을 계속해서 증명했다.

블록 구조

Scheme는 이전의 블록 구조 언어, 특히 ALGOL로부터 블록 구조를 상속합니다.Scheme에서 블록은 3개의 바인딩 구조에 의해 구현됩니다. ,let*그리고.letrec예를 들어, 다음 구문은 기호가 호출된 블록을 만듭니다.var는 숫자 10에 바인딩되어 있습니다.

(정의하다변화하다 "실패") ;; 여기서 var에 대한 참조는 모두 "goose"가 됩니다. (허락하다((변화하다 10))   ;; 스테이트먼트는 여기에 들어갑니다.여기서 var에 대한 참조는 모두 10으로 묶입니다.   ) ;; 여기서 var에 대한 참조는 모두 "goose"가 됩니다. 

프로그래머의 필요에 따라 블록을 네스트하여 임의로 복잡한 블록 구조를 만들 수 있습니다.블록 구조를 사용하여 로컬바인딩을 작성하면 네임스페이스 충돌 위험이 경감됩니다.

의 1가지 변종let,let*그럼 바인딩은 같은 구성 내에서 이전에 정의된 변수를 참조할 수 있습니다.따라서 다음과 같습니다.

(렛*((변수 1 10)        (변수 2 (+변수 1 12)))   ;; 단, var1의 정의는 var2를 참조할 수 없습니다.   ) 

또 다른 변종은letrec는, 상호 재귀적인 순서를 서로 바인드 할 수 있도록 설계되어 있습니다.

;; 호프스타터의 남성 및 여성 염기서열 쌍 목록 계산  (정의하다(호프스타터-남성-여성 n)   (인식하다((여자 (람다(n)        (한다면(=n 0)     1     (-n (남자 (여자 (-n 1)))))))     (남자 (람다(n)      (한다면(=n 0)          0          (-n (여자 (남자 (-n 1))))))))     (허락하다고리 ((i 0))       (한다면(>i n)    '()    (단점(단점(여자 i)         (남자 i))   (고리 (+i 1)))))))  (호프스타터-남성-여성 8)  ===> ((1 . 0) (1 . 0) (2 . 1) (2 . 2) (3 . 2) (3 . 3) (4 . 4) (5 . 4) (5 . 5)) 

(이 예에서 사용되는 정의에 대해서는 Hofstadter의 남성 및 여성 시퀀스를 참조하십시오).

모든 프로시저가 단일로 바인드됨letrec서로 이름으로 참조할 수도 있고, 같은 이름으로 앞서 정의한 변수 값도 참조할 수도 있습니다.letrec단, 나중에 정의된 값을 참조할 수 없습니다.letrec.

의 변종let, 「named let」형식의 뒤에 식별자가 있습니다.let키워드를 지정합니다.그러면 이름이 지정된 식별자이고 본문이 let 형식의 본문인 프로시저의 인수에 let 변수가 결합됩니다.절차를 호출하여 원하는 대로 본문을 반복할 수 있습니다.이름 있는 let은 반복 구현에 널리 사용됩니다.

예: 간이 카운터

(허락하다고리 ((n 1))   (한다면(>n 10)       '()       (단점n      (고리 (+n 1)))))  ===> (1 2 3 4 5 6 7 8 9 10) 

Scheme의 다른 프로시저와 마찬가지로 이름 있는 let으로 작성된 프로시저는 퍼스트클래스 객체입니다.

적절한 테일 재귀

스킴에는 반복 구성이 있습니다.do단, 반복을 표현하기 위해 테일 재귀를 사용하는 것이 Scheme에서는 보다 관용적입니다.Standard-conforming 체계 구현(R5RS초. 3.5)[3]—a 속성은 그 계획 보고 적절한 꼬리를 안전한을 꾀하다 프로그래머들이 반복적 알고리즘은 가끔 더 직관적인 재귀적 구조, 쓸 recursion—making로에 대해 설명합니다 그렇게 적극적인 꼬리의 전화를 무한한 수 지원 계획에 꼬리를 최적화할 필요가 있다..테일 재귀 프로시저 및 명명된 형식은 테일 재귀를 사용한 반복을 지원합니다.

;; 0 ~ 9의 정사각형 목록 작성: ;; 참고: 루프는 단순히 라벨로 사용되는 임의 기호입니다.어떤 기호라도 좋습니다.  (정의하다(일람표 n)   (허락하다고리 ((i n) (인식하다 '()))     (한다면(< >i 0)         인식하다         (고리 (-i 1) (단점(*i i) 인식하다)))))  (일람표 9) ===> (0 1 4 9 16 25 36 49 64 81) 

최고 수준의 연속성

Scheme의 연속은 1등급 객체입니다.스킴은 절차를 제공합니다.call-with-current-continuation(일명call/cc프로그래머가 제공하는 프로시저에서 형식적인 인수에 바인딩된 이스케이프 프로시저로서 현재의 계속을 캡처합니다.(R5RS sec. 6.4)[3] 1등급 연속은 프로그래머가 반복기, 코루틴백트랙킹과 같은 로컬이 아닌 제어 구조를 만들 수 있도록 합니다.

연속은 명령형 프로그래밍 언어로 반환문의 동작을 에뮬레이트하기 위해 사용할 수 있습니다.다음 함수find-first, 지정된 함수func및 목록lst는 첫 번째 요소를 반환합니다.xlst그렇게 해서(func x)true를 반환합니다.

(정의하다(제일 먼저 발견 기능하다 첫 번째)   (전류에 의한 계속    (람다(재빠르게 돌아오다)      (각각을 위한(람다(x)    (한다면(기능하다 x)        (재빠르게 돌아오다 x)))    첫 번째)      #f)))  (제일 먼저 발견 정수? '(1/2 3/4 5.6 7 8/9 10 11)) ===> 7 (제일 먼저 발견 제로? '(1 2 3 4)) ===> #f 

전통적인 프로그래머의 퍼즐인 다음 예시는 Scheme가 연속을 변수에 바인딩하고 프로시저에 대한 인수로 전달하면서 1등급 객체로 처리할 수 있음을 보여줍니다.

(렛*((음의          ((람다(참조) (표시"@") 참조) (전류에 의한 계속(람다(c) c))))        (          ((람다(참조) (표시"*") 참조) (전류에 의한 계속(람다(c) c)))))     (음의 )) 

이 코드를 실행하면 카운트 시퀀스가 표시됩니다.@*@**@***@****@*****@******@*******@********...

프로시저 및 변수의 공유 네임스페이스

Common Lisp와는 대조적으로 Scheme의 모든 데이터와 프로시저는 공통 네임스페이스를 공유하지만, 공통 Lisp의 함수와 데이터는 서로 다른 네임스페이스를 가지고 있기 때문에 함수와 변수가 동일한 이름을 가질 수 있고 함수를 값으로 참조하기 위한 특별한 표기법이 필요합니다.이것은 「Lisp-1 vs라고 불리는 경우가 있습니다. Lisp-2" 구분: Scheme의 통합 네임스페이스와 Common [22]Lisp의 개별 네임스페이스를 나타냅니다.

Scheme에서 데이터를 조작하고 바인드하는 데 사용되는 것과 동일한 프리미티브를 프로시저를 바인드하는 데 사용할 수 있습니다.일반 리스프와 동등한 것은 없습니다.defun그리고.#'원형을 선택합니다.

;; 숫자에 바인딩된 변수: (정의하다f 10) f ===> 10 ;; 변환(바운드 값 변경) (세트!f (+f f 6)) f ===> 26 ;; 동일한 변수에 프로시저 할당: (세트!f (람다(n) (+n 12))) (f 6) ===> 18 ;; 식 결과를 동일한 변수에 할당: (세트!f (f 1)) f ===> 13 ;; 기능 프로그래밍: (적용합니다.+ '(1 2 3 4 5 6)) ===> 21 (세트!f (람다(n) (+n 100))) (지도f '(1 2 3)) ===> (101 102 103) 

실시 기준

본 항에서는, 스킴에 특정의 특징을 부여해 왔지만, 원래의 설계의 직접적인 결과는 아닌, 수년간 행해진 설계 결정을 문서화하고 있습니다.

숫자탑

스킴은 스킴에서 숫자 타워(R5RS sec. 6[3].2)로 알려진 복잡하고 합리적인 유형을 포함한 비교적 완전한 숫자 데이터 유형을 지정한다.이 기준서는 이러한 사항을 추상화로 취급하며, 시행자에게 특정 내부 표현을 위임하지 않는다.

숫자는 정확성의 품질을 가질 수 있습니다.정확한 숫자는 다른 정확한 숫자와 관련된 일련의 정확한 연산에 의해서만 산출될 수 있습니다. 따라서 부정확성은 전염될 수 있습니다.표준에서는 두 가지 구현이 모든 작업에 대해 동일한 결과를 생성해야 하며, 그 결과 정확한 수가 산출되도록 규정되어 있습니다.

R5RS 표준은 절차를 규정한다.exact->inexact그리고.inexact->exact숫자의 정확성을 바꾸는 데 사용할 수 있습니다. inexact->exact는 "인수에 가장 가까운 수치"를 생성합니다. exact->inexact는 "인수에 가장 가까운 수치"를 생성합니다.R6RS 표준은 이러한 절차를 주 보고서에서 제외하지만 표준 라이브러리(rnrs r5rs(6))에서 R5RS 호환성 절차로 명시한다.

R5RS 표준에서 체계 구현은 전체 숫자 타워를 구현하기 위해 필요하지 않지만, "구현 목적과 체계 언어의 정신에 부합하는 일관된 부분 집합"을 구현해야 한다(R5RS 6.2.[3]3항).새로운 R6RS 규격은 타워 전체를 구현해야 하며, "정확한 정수 객체 및 크기 및 정밀도가 거의 무제한인 정확한 합리적 수 객체 및 특정 절차를 구현해야 합니다.따라서 정확한 인수가 주어지면 항상 정확한 결과를 반환한다."(R6RS 3.4항, 11.[5]7.1항).

예 1: 정확한 합리적 복소수를 지원하는 구현에서의 정확한 산술.

;; 유리 실수 3개와 유리 복소수 2개의 합 (정의하다x (+1/3 1/4 -1/5 -1/3i 405/50+2/3i)) x ===> 509/60+1/3i ;;정확한지 확인합니다. (정확합니까?x) ===> #t 

예 2: 정확한 유리수나 복소수 모두 지원하지 않지만 유리 표기법으로 실수는 받아들이는 구현에서 동일한 산술입니다.

;; 4개의 유리실수의 합계 (정의하다xr (+1/3 1/4 -1/5 405/50)) ;; 2개의 유리실수의 합계 (정의하다xi (+-1/3 2/3)) xr ===> 8.48333333333333 xi ===> 0.333333333333333 ;;정확한지 확인합니다. (정확합니까?xr) ===> #f (정확합니까?xi) ===> #f 

두 가지 구현 모두 R5RS 표준을 준수하지만 두 번째 구현은 완전한 수치 타워를 구현하지 않기 때문에 R6RS를 준수하지 않습니다.

평가 지연

스킴은, 를 개입시켜 지연된 평가를 서포트합니다.delay형식과 절차force.

(정의하다a 10) (정의하다평가판 2 (지연시키다(+a 2))) (세트!a 20) (힘.평가판 2) ===> 22 (정의하다평가판 50 (지연시키다(+a 50))) (허락하다((a 8))   (힘.평가판 50)) ===> 70 (세트!a 100) (힘.평가판 2) ===> 22 

약속의 원래 정의의 사전적 맥락은 보존되며, 그 가치 또한 최초 사용 후 보존된다.force그 약속은 단 한 번만 평가된다.

이러한 프리미티브는 약속으로 알려진 값을 생성하거나 처리하며 [23]스트림과 같은 고급 게으름 평가 구조를 구현하는 데 사용할 수 있습니다.

R6RS 표준에서는 이것들은 더 이상 기본이 아니라 R5RS 호환성 라이브러리(rnrs r5rs(6))의 일부로 제공됩니다.

R5RS에서 권장되는 구현:delay그리고.force인수(펑크)가 없는 절차로서 약속을 실장하고 메모화를 사용하여 횟수에 관계없이 한 번만 평가되도록 합니다.force는 (R5RS sec. 6.4)[3]라고 불립니다.

SRFI41은 유한 및 무한 시퀀스의 양쪽 모두를 뛰어난 경제성으로 표현할 수 있도록 한다.예를 들어 SRFI [23]41에서 정의된 함수를 사용한 피보나치 시퀀스의 정의입니다.

;; 피보나치 시퀀스를 정의합니다. (정의하다파이브   (스트림콘 0     (스트림콘 1       (스트림 맵 +         파이브         (스트림 CDR 파이브))))) ;; 시퀀스의 100번째 숫자를 계산합니다. (스트림 참조 파이브 99) ===>  218922995834555169026 

절차 인수 평가 순서

대부분의 Lisps는 절차 인수에 대한 평가 순서를 지정합니다.스킴은 그렇지 않습니다.오퍼레이터 포지션의 표현이 평가되는 순서를 포함한 평가 순서는 콜 단위로 구현에 의해 선택될 수 있으며, 유일한 제약조건은 "오퍼레이터와 오퍼랜드 표현의 동시 평가의 영향이 평가의 순서와 일치하도록 제한된다"는 것입니다.(R5RS 4.1.[3]3항)

(허락하다((에바 (람다(n) (표시'평가 중')                      (표시(한다면(절차요? n) "실패" n))                      (줄바꿈) n)))   ((에바 +) (에바 1) (에바 2))) ===> 3 

ev는 전달된 인수를 설명한 후 인수 값을 반환하는 절차입니다.다른 Lisps와 달리 Scheme 식의 연산자 위치(첫 번째 항목)에서 식의 출현은 연산자 위치의 표현 결과가 절차인 한 매우 합법적입니다.

1과 2를 더하기 위해 절차 "+"를 호출할 때, (ev +), (ev 1) 및 (ev 2)는 그 효과가 병렬로 평가되지 않는 한 임의의 순서로 평가될 수 있다.따라서 위의 예제 코드가 실행되면 다음 세 줄을 표준 스킴에 의해 임의의 순서로 표시할 수 있습니다.단, 한 줄의 텍스트는 순차적 평가 제약을 위반하기 때문에 다른 줄과 인터리브할 수 없습니다.

평가 1
평가 2
평가 절차

위생 매크로

R5RS 표준 및 이후 보고서에서는 매크로 시스템을 통해 Scheme 구문을 쉽게 확장할 수 있습니다.R5RS 표준은 프로그래머가 간단한 패턴 매칭 하위 언어를 사용하여 새로운 구문 구조를 언어에 추가할 수 있는 강력한 위생 매크로 시스템을 도입했습니다(R5RS sec 4.3).[3]이에 앞서 위생 매크로 시스템은 "저수준" 매크로 시스템과 함께 "고수준" 시스템으로서 R4RS 표준의 부록으로 밀려났으며,[24] 두 시스템 모두 언어의 필수적인 부분이 아닌 스킴의 확장으로 취급되었다.

위생 매크로 시스템(일명 ')의 구현syntax-rules는 나머지 언어의 어휘 범위를 존중해야 합니다.이는 매크로 확장을 위한 특별한 이름 지정 및 범위 지정 규칙에 의해 보장되며 다른 프로그래밍 언어의 매크로 시스템에서 발생할 수 있는 일반적인 프로그래밍 오류를 방지합니다.R6RS는 보다 정교한 변환 시스템을 지정합니다.syntax-caseR5RS Scheme의 언어 확장으로 사용할 수 있게 되었습니다.

;; 매크로를 정의하여 다중 표현식을 사용하여 "if"의 변형을 구현합니다. ;;; 진정한 브랜치이며 거짓 브랜치는 없습니다. (정의 표시언제   (구문 검색()     ((언제 프리드 exp 소비하다 ...)       (한다면프리드 (시작한다.exp 소비하다 ...))))) 

매크로와 프로시저의 기동에는, 모두 s-표현이지만, 취급은 다릅니다.컴파일러는 프로그램에서 s-표현식을 발견하면 먼저 심볼이 현재 어휘 범위 내에서 구문 키워드로 정의되어 있는지 확인합니다.그런 다음 매크로 확장을 시도하고 s-expression의 꼬리 부분에 있는 항목을 평가하는 코드를 컴파일하지 않고 인수로 처리합니다.이 프로세스는 매크로 호출이 남아 있지 않을 때까지 반복됩니다.구문 키워드가 아닌 경우, 컴파일러는 코드를 컴파일하여 s-표현의 말미에 있는 인수를 평가하고, 다음으로 s-표현의 선두에 있는 기호로 표현된 변수를 평가하여 평가된 말미에 실제 인수로 전달된 절차로 호출한다.

대부분의 스킴 구현에서는 추가 매크로 시스템도 제공합니다.통사적 폐쇄, 명시적 이름 변경 매크로 및define-macro, 와 유사한 비표준 매크로 시스템defmacro시스템은 Common Lisp로 제공됩니다.

매크로가 위생적인지 여부를 특정할 수 없는 것이 매크로 시스템의 단점 중 하나입니다.스코프 세트등의 확장 모델을 사용하면,[25] 잠재적인 솔루션을 얻을 수 있습니다.

환경 및 평가

R5RS 이전에 이 계획에는 표준과 동등한 것이 없었습니다.eval첫 번째 람다 페이퍼가 설명했지만 다른 Lisps에 보편적으로 존재하는 절차evaluate"LISP 함수 [17]EVAL과 유사" 및 1978년 첫 번째 개정 보고서가 이를 다음과 같이 대체했다.enclose두 개의 인수가 필요했습니다.두 번째, 세 번째 및 네 번째 수정된 보고서에서는 다음과 같은 사항이 누락되었습니다.eval.

이러한 혼동의 이유는 어휘 범위를 갖는 체계에서 표현식의 평가 결과가 평가되는 위치에 따라 달라지기 때문이다.예를 들어, 다음 식을 평가한 결과가 5인지 [26]6인지 명확하지 않습니다.

(허락하다((이름. '+))   (허락하다((+*))     (평가하다 (목록.이름. 2 3)))) 

외부 환경에서 평가될 경우,name정의되어 있는 경우, 결과는 오퍼랜드의 합계입니다.기호 "+"가 절차 "*"의 값에 결합되어 있는 내부 환경에서 평가될 경우 결과는 두 피연산자의 곱이 됩니다.

R5RS는 환경을 반환하는 3가지 절차를 지정하고 절차를 제공함으로써 이 혼란을 해결합니다.evals-표현과 환경을 취하고 제공된 환경에서 식을 평가합니다. (R5RS sec. 6.5)[3] R6RS는 다음과 같은 절차를 제공하여 이를 확장합니다.environment이를 통해 프로그래머는 평가 환경으로 가져올 객체를 정확하게 지정할 수 있습니다.

이 식을 평가하기 위한 최신 체계(일반적으로 R5RS와 호환됨)에서는 함수를 정의해야 합니다.evaluate다음과 같이 표시됩니다.

(정의하다(평가하다 expr)    (평가하다expr (상호 작용 환경))) 

interaction-environment통역사의 글로벌 환경입니다.

부울식에서의 비부울값 처리

공통 리스프를 포함한 리스프의 대부분의 방언에서는 관례상 다음과 같은 값이 사용됩니다.NIL는 부울식으로 false 값을 평가합니다.체계에서 1991년 [2]IEEE 표준 이후 #f를 제외한 모든 값은 다음을 포함한다.NIL「(」로 표기되어 있는 스킴의 등가치를 부울식으로 참값으로 평가합니다.(R5RS sec. 6.3.1)[3]

여기서 true의 부울값을 나타내는 상수는T대부분의 Lisps에서, Scheme에서 그것은#t.

원시 데이터 유형의 불일치

체계에서 원시 데이터 유형은 분리됩니다.다음 중 하나의 술어만 Scheme 개체에 대해 참일 수 있습니다.boolean?,pair?,symbol?,number?,char?,string?,vector?,port?,procedure?. (R5RS초 3.2)[3]

반면, 숫자 데이터 유형 내에서는 숫자 값이 겹칩니다.예를 들어, 정수 값은 다음 값을 모두 만족시킵니다.integer?,rational?,real?,complex?그리고.number?(R5RSec 6.2)[3]

동등 술어

스킴은 3개의 다른 동등성 술어로 나타나는 임의의 객체 사이에 3가지 다른 유형의 동등성을 가진다. 즉, 동등성을 테스트하기 위한 관계 연산자,자,자,자,자,자,자,자,자,자,자.eq?,eqv?그리고.equal?:

  • eq?까지 평가하다.#f파라미터가 메모리 내의 동일한 데이터 객체를 나타내지 않는 한
  • eqv?일반적으로 와 같다eq?그러나 동일한 값을 나타내는 숫자가 다음과 같이 되도록 원시 객체(예: 문자 및 숫자)를 특별히 취급합니다.eqv?동일한 대상을 참조하지 않더라도
  • equal?는 리스트, 벡터, 문자열 등의 데이터 구조를 비교하여 일치 구조를 가지고 있는지 여부를 판단합니다.eqv?내용물.(R5RS 6.1항)[3]

형식 종속 동등성 연산도 체계에 있습니다.string=?그리고.string-ci=?2개의 스트링을 비교한다(후자는 대소문자를 구분하여 비교한다).char=?그리고.char-ci=?문자 비교=[3]수치를 비교합니다.

평.

R5RS 표준까지 Scheme의 표준 코멘트는 세미콜론이었고, 이는 Scheme의 나머지 행을 볼 수 없게 합니다.많은 구현이 코멘트를 1행 이상 확장할 수 있는 대체 규약을 지원하며, R6RS 표준에서는 그 중 2개를 허용합니다.즉, s-표현 전체를 코멘트로 변환(또는 「코멘트 아웃」)할 수 있습니다.#;(SRFI 62에[27] 도입) 및 여러 줄의 주석 또는 "블록 주석"은 다음 문장으로 둘러싸서 작성할 수 있습니다.# 그리고. #.

입력/출력

스킴의 입출력은 포트 데이터 타입에 근거하고 있습니다.R5RS sec 6.[3]6) R5RS는, 2개의 디폴트 포토를 정의해, 순서에 따라서 액세스 할 수 있습니다.current-input-port그리고.current-output-port표준 입력표준 출력의 Unix 개념에 대응합니다.대부분의 구현에서는current-error-port입력 및 표준 출력 리다이렉션은 다음과 같은 표준 절차에 의해 표준에서 지원됩니다.with-input-from-file그리고.with-output-to-file대부분의 구현에서는 유사한 리다이렉션 기능을 갖춘 문자열 포트가 제공되므로 SRFI [28]6에 기재된 절차를 사용하여 파일이 아닌 문자열 버퍼에서 많은 일반 입출력 작업을 수행할 수 있습니다.R6RS 규격은 훨씬 더 정교하고 성능이 뛰어난 포트 절차와 많은 새로운 유형의 포트를 규정하고 있습니다.

다음의 예는 엄격한 R5RS 체계에 기재되어 있다.

예 1: 출력이 (current-output-port)로 기본 설정되어 있는 경우:

(허락하다((헬로0 (람다() (표시'헬로 월드') (줄바꿈))))   (헬로0)) 

예 2: 1로서 옵션인 port 인수를 사용하여 프로시저를 출력하는 경우

(허락하다((헬로1 (람다(p) (표시'헬로 월드' p) (줄바꿈p))))   (헬로1 (전류 출력 포트))) 

예 3: 1로 표시되지만 출력은 새로 작성된 파일로 리다이렉트됩니다.

;; NB: 파일 출력은 R5RS의 옵션 절차입니다. (허락하다((헬로0 (람다() (표시'헬로 월드') (줄바꿈))))   (출력 대 파일"hellowoldoutput 파일" 헬로0)) 

예 4: 2로 명시적인 파일을 열고 포트를 닫으면 출력이 파일로 전송됩니다.

(허락하다((헬로1 (람다(p) (표시'헬로 월드' p) (줄바꿈p)))       (출력 포트 (오픈 출력 파일"hellowoldoutput 파일")))   (헬로1 출력 포트)   (출력 포트를 닫다출력 포트)) 

예 5: 2로서 출력 파일을 사용한 콜을 사용하여 출력을 파일로 보냅니다.

(허락하다((헬로1 (람다(p) (표시'헬로 월드' p) (줄바꿈p))))   (출력 파일에 의한 콜"hellowoldoutput 파일" 헬로1)) 

입력에 대해서도 유사한 절차가 제공됩니다.R5RS 스킴은 술어를 제공합니다.input-port?그리고.output-port?. 문자 입력 및 출력의 경우,write-char,read-char,peek-char그리고.char-ready?제공되고 있습니다.Scheme 식을 읽고 쓰기 위해 Scheme는 다음을 제공합니다.read그리고.write읽기 작업에서는 입력 포트가 파일 끝에 도달한 경우 반환되는 결과는 파일 끝 객체이며, 이는 술어를 사용하여 테스트할 수 있습니다.eof-object?.

표준과 더불어 SRFI 28은 일반적인 리스프와 유사한 기본 포맷 절차를 정의합니다.format이 함수의 이름을 [29]따서 함수로 지정됩니다.

표준 절차의 재정의

체계에서 절차는 변수에 구속됩니다.R5RS에서 언어 표준은 프로그램이 임베디드 프로시저의 가변 바인딩을 변경하여 효과적으로 재정의할 수 있도록 공식적으로 규정되어 있습니다.(R5RS "언어 변경")[3] 예를 들어 다음과 같이 확장할 수 있습니다.+문자열과 숫자를 재정의하여 받아들이려면 다음과 같이 하십시오.

(세트!+       (허락하다((오리지널+ +))         (람다args           (적용합니다.(한다면(또는(특수 절차입니까?args) (스트링?(args)))                      현악기                      오리지널+)                  args)))) (+1 2 3) ===> 6 (+"1" "2" "3") ===> "123" 

R6RS에서는 표준 바인딩을 포함한 모든 바인딩은 일부 라이브러리에 속하며 모든 내보내기 바인딩은 불변합니다. (R6RS sec 7.1)[5] 이 때문에 변환에 의한 표준 프로시저의 재정의는 금지됩니다.대신, 표준 절차라는 이름으로 다른 절차를 가져올 수 있으며, 이는 사실상 재정의와 유사합니다.

명명 및 명명 규칙

표준 스킴에서는, 데이터 타입을 다른 데이터 타입으로 변환하는 프로시저는, 이름에 문자열 「->」를 포함하고, 술어는 「?」로 끝납니다.또, 이미 할당된 데이터의 값을 변경하는 프로시저는 「!」로 끝납니다.스킴 프로그래머는 이러한 규칙을 따르는 경우가 많습니다.

Scheme 표준과 같은 공식 컨텍스트에서 "procedure"라는 단어는 람다 표현식 또는 원시 절차를 나타내기 위해 "function"보다 우선하여 사용됩니다.통상의 사용법에서는, 「절차」와 「기능」의 단어를 서로 바꾸어 사용합니다.절차 적용은 공식적으로는 조합이라고 부르기도 한다.

다른 Lisps와 마찬가지로 Scheme에서 "thunk"라는 용어는 인수 없는 절차를 가리키는 데 사용됩니다.'적절한 테일 재귀'라는 용어는 모든 스킴 구현의 속성을 나타냅니다.이러한 실장은 액티브 테일콜의 수가 한정되지 않도록 테일콜 최적화를 수행합니다.

R3RS 이후 표준 문서 제목인 "알고리즘 언어 체계에 관한 개정n 보고서"는 ALGOL 60 표준 문서 제목인 "알고리즘 언어 알골 60에 관한 개정 보고서"를 참조한 것이며,[30][31] R3RS의 요약 페이지는 ALGOL 60의 요약 페이지에 밀접하게 모델링되어 있다.

표준 양식 및 절차 검토

이 언어는 표준 R5RS(1998년)와 R6RS(2007년)에 공식적으로 정의되어 있다.이들은 표준 "양식"을 기술합니다. 키워드 및 부수되는 구문, 언어의 제어 구조를 제공하는 표준 절차 및 공통 태스크를 수행하는 표준 절차를 설명합니다.

표준 양식

다음 표에서는 Scheme의 표준 양식에 대해 설명합니다.일부 양식은 언어에서 단일 기능으로 쉽게 분류할 수 없기 때문에 두 개 이상의 행에 나타납니다.

이 표에서 "L"로 표시된 양식은 표준에서 파생된 "라이브러리" 양식으로 분류되며, 실제에서는 보다 기본적인 형태를 사용하는 매크로로 구현되는 경우가 많기 때문에 다른 언어보다 구현 작업이 훨씬 쉽습니다.

언어 R5RS 체계 표준 양식
목적
정의. 정의하다
바인딩 구성 람다, 실행(L), let(L), let*(L), letrec(L)
조건부 평가 if, condition (L), case (L) 및 (L) 또는 (L)
순차적 평가 시작(*)
반복 람다, 실행(L), 이름 있는 let(L)
구문 확장 define-syntax, letrec-syntax, 구문규칙(R5RS), 구문케이스(R6RS)
견적 따옴표", 따옴표 해제", 준따옴표("", 따옴표 해제)
과제 세트!
평가 지연 지연(L)

주의:begin는 R5RS에서 라이브러리 구문으로 정의되지만 스플라이싱 기능을 구현하려면 익스팬더가 이를 알아야 합니다.R6RS에서는 더 이상 라이브러리 구문이 아닙니다.

표준 절차

다음 두 표는 R5RS 체계에서 표준 절차를 설명한다.R6RS는 훨씬 광범위하며 이러한 유형의 요약은 실용적이지 않을 것이다.

일부 절차는 언어에서 단일 기능으로 쉽게 분류할 수 없기 때문에 여러 행에 표시됩니다.

언어 R5RS 스킴의 표준 절차
목적 절차들
건설 벡터, make-signed, make-string, 목록
동등 술어 eq?, eqv?, equal?, string=?, string-ci=?, char=?, char-ci=?
유형 변환 벡터->목록, 목록->문자열, 숫자->문자열, 기호->문자열, 문자->문자열, 문자->문자열, 정수->문자열, 문자열->문자열
숫자 별도 표 참조
줄들 string?, make-string, string-length, string-ref, string-set!, string=?, string-ci=?, string?string-ci <?, string <=? string-ci <=?, string>?string - ci > ? , string - ci > = ? , substring , string - ci > string - > list , list - > string - > string - copy , string - fill !
성격. char?, char=?, char-ci?, char?, char?, char?, char?, char?=?, char-ci>=?, char?, char-ci>=?, char-ci>?, char-ci?, char-pace?, char-ch-ci?, char-ch-ch-ci> 정수 char-ci>
벡터 make-length, 벡터, 벡터?, 벡터 길이, 벡터-ref, 벡터 세트!, 벡터-> 리스트, 리스트-> 벡터, 벡터 채우기!
기호 symbol-> string, string-> symbol, 심볼?
쌍과 리스트 pair?, cons, car, cdr!, set-cdr!, null?, list?, list?, list, length, append, reverse, list-ref, memq. memv. memb. member, assq, assv, assoc, list, assoc, list, list, list, list, list-> list, string, string, string, string-> list
ID 술어 부울?, 페어?, 심볼?, 숫자?, 문자?, 문자열?, 벡터?, 포트?, 프로시저?
속행 call-with-current-continuation(call/cc), 값, 값 포함 콜, 다이내믹 윈드
환경 eval, scheme-report-environment, null-environment, 인터랙션-environment(옵션)
입력/출력 디스플레이, 줄바꿈, 읽기, 쓰기, 읽기-char, 쓰기-char, peek-char, char-ready?, eof-object?open-input-file, open-output-file, close-input-port, input-port?, output-port?, current-input-port, current-output-port, call-with-input-file, call-with-input-file, call-file, call-with-with-with-output-file, with-file, with-file, with-put-file(옵션, output-
시스템 인터페이스 load(옵션), transcript-on(옵션), transcript-off(옵션)
평가 지연 힘.
기능 프로그래밍 절차?, 신청, 지도 작성, 각각
부란스 부울?것은 아니다.

이름에 "-ci"를 포함하는 문자열 및 문자 프로시저는 대소문자를 구분하지 않고 인수를 비교합니다.대소문자와 소문자의 버전이 동일한 것으로 간주됩니다.

언어 R5RS 스킴의 표준 수치 절차
목적 절차들
기본 연산자 +, -, *, /, 복근, 몫, 나머지, modulo, gcd, lcm, expt, sqrt
유리수 분자, 분모, 유리? 합리화
근사치 바닥, 천장, 잘라내기, 원형
정확성 부정확->정확->정확->정확->정확?정확?정확하지?
불평등 <, <=, >, >=, =
기타 술어 0? 음? 양? 홀수? 짝수?
최대 및 최소 최대, 최소
삼각법 sin, cos, tan, asin, acos, atan
지수 exp, 로그
복소수 make-sular, make-polar, real-part, imagine-part, migrature, angle, complex?
입출력 number -> string, string -> number
형식 술어 정수? 유리? 실수? 복소수? 숫자?

3개 이상의 인수가 필요한 - 및 /의 구현은 정의되지만 R5RS에서는 선택 사항으로 남아 있습니다.

구현에 대한 스킴 요구

Scheme의 미니멀리즘으로 인해 많은 일반적인 절차와 구문 형식이 표준으로 정의되지 않습니다.핵심 언어를 작게 유지하되 확장의 표준화를 용이하게 하기 위해 Scheme 커뮤니티에는 확장 제안의 면밀한 논의를 통해 확장 라이브러리를 정의하는 "SRFI(Scheme Request for Implementation)" 프로세스가 있습니다.이를 통해 코드 이식성이 향상됩니다.대부분의 SRFI는 전체 또는 대부분의 스킴 구현에서 지원됩니다.

다양한 구현에서 상당히 광범위한 지원을 제공하는 SRFI는 다음과 같습니다.[32]

  • 0: 기능 기반 조건부 확장 구성
  • 1: 리스트 라이브러리
  • 4: 균일한 수치 벡터 데이터 유형
  • 6: 기본 문자열 포트
  • 8: 수신, 여러 값에 바인딩
  • 9: 레코드 유형의 정의
  • 13: 문자열 라이브러리
  • 14: 문자 집합 라이브러리
  • 16: 가변 특성 절차의 구문
  • 17: 일반 세트!
  • 18: 멀티스레딩 지원
  • 19: 시간 데이터 유형 및 절차
  • 25: 다차원 어레이 프리미티브
  • 26: 카레링 없이 파라미터를 전문화하기 위한 표기법
  • 27: 랜덤 비트 소스
  • 28: 기본 형식 문자열
  • 29: 현지화
  • 30: 네스트된 여러 줄의 코멘트
  • 31: 재귀 평가를 위한 특수 양식
  • 37: args-fold: 프로그램 인수 프로세서
  • 39: 파라미터 오브젝트
  • 41: 스트림
  • 42: 열성적인 이해
  • 43: 벡터 라이브러리
  • 45: 반복적인 지연 알고리즘을 표현하기 위한 기본 요소
  • 60: 정수(비트)
  • 61: 보다 일반적인 조건 조항
  • 66: 옥텟 벡터
  • 67: 절차 비교

실장

우아하고 미니멀리즘적인 디자인으로 Scheme는 언어 디자이너, 취미 생활자, 교육자에게 인기 있는 타겟이 되었습니다.또한 표준 인터프리터의 작은 크기 때문에 임베디드 시스템이나 스크립트 작성에도 매우 적합합니다.그 결과,[33] 실장 마다 큰 차이가 있어, 어느 실장으로부터 다른 실장까지 프로그램을 이동시키는 것은 매우 어려운 일이며, 표준 언어의 사이즈가 작다는 것은, 매우 복잡한 편리한 프로그램을 표준적인 포터블 스킴으로 작성하는 것은 거의 [13]불가능하다는 것을 의미합니다.R6RS 표준은 프로그래머에 대한 매력을 확대하기 위해 훨씬 더 광범위한 언어를 명시하고 있습니다.

거의 모든 구현에서 개발 및 디버깅을 위한 기존의 Lisp 스타일의 읽기 평가 인쇄 루프가 제공됩니다.또한 많은 경우 Scheme 프로그램을 실행 가능한 바이너리로 컴파일합니다.다른 언어로 작성된 프로그램에 Scheme 코드를 삽입하는 지원도 일반적입니다. Scheme 구현의 상대적 단순성으로 인해 C와 같은 언어로 개발된 더 큰 시스템에 스크립팅 기능을 추가하는 것이 일반적이기 때문입니다.Gambit, ChickenBigloo Scheme 인터프리터는 Scheme를 C로 컴파일하여 임베딩을 특히 쉽게 합니다.또한 Bigloo의 컴파일러는 JVM 바이트 코드를 생성하도록 구성할 수 있으며, 를 위한 실험적인 바이트 코드 생성 기능도 갖추고 있습니다.네트워크

일부 구현에서는 추가 기능을 지원합니다.예를 들어 KawaJScheme은 Java 클래스와의 통합을 제공하며 Scheme to C 컴파일러는 종종 실제 C 코드를 Scheme 소스에 삽입할 수 있도록 C로 작성된 외부 라이브러리를 쉽게 사용할 수 있도록 합니다.또 다른 예로는 Pvts가 있는데, 이는 Scheme 학습을 지원하기 위한 시각적 도구 세트를 제공합니다.

사용.

스킴은 많은 학교에서[34] 폭넓게 사용되고 있습니다.특히, 많은 컴퓨터 사이언스 입문 과정에서는, 스킴을 교과서의 구조와 해석(SICP)[35]과 함께 사용하고 있습니다.지난 12년간 PLT는 ProgramByDesign(이전의 TeachScheme!) 프로젝트를 실시해 왔습니다.이 프로젝트에서는 600명에 가까운 고등학교 교사와 수천명의 고등학생이 기본적인 스킴 프로그래밍에 노출되어 있습니다.MIT의 오래된 입문 프로그래밍 클래스 6.001은 [36]Scheme에서 가르쳤지만, 6.001은 보다 현대적인 코스로 대체되었지만, SICP는 [37]MIT에서 계속 가르칩니다. 마찬가지로 UC Berkeley, CS 61A의 입문 클래스도 2011년까지 스킴에서 완전히 가르쳤으며, 동적 범위를 나타내기 위해 로고에 사소한 변화를 주지 않았습니다.오늘날, MIT와 같이, 버클리대학은 강의요강을 Python 3에서 주로 가르치는 보다 현대적인 버전으로 대체했지만, 현재의 강의요강은 여전히 오래된 커리큘럼에 기초하고 있고 수업의 일부는 [38]여전히 Scheme에서 가르치고 있다.

현재 노스이스턴 대학에 재학 중인 마티아스 펠라이센의 교과서 프로그램 설계법은 일부 고등교육기관에서 컴퓨터 과학 입문 과정으로 사용되고 있다.Northistn University와 Worcester Polytechnical Institute는 각각 [39][40]컴퓨터 과학의 기초(CS2500)와 프로그램 설계 입문(CS1101) 입문 과정에서만 Scheme를 사용하고 있습니다.Rose-Hulman은 고급 프로그래밍 언어 개념 [41]코스에서 Scheme를 사용합니다.Brandeis University의 핵심 코스인 컴퓨터 프로그램의 구조와 해석(COSI121b)도 이론 컴퓨터 과학자인 Harry Mairson에 [42]의해 Scheme에서만 학습됩니다.인디애나 대학의 입문 수업인 C211은 전적으로 스킴으로 가르친다.코스 자체 페이스 버전 CS 61AS는 계속해서 [43]스킴을 사용합니다.예일 대학과 그리넬 대학의 컴퓨터 과학 입문 과정도 [44]Scheme에서 가르칩니다.Northistn University의 컴퓨터 공학 대학원생을 위한 필수 과정인 Programming Design [45]Paradigms도 Scheme를 광범위하게 사용하고 있습니다.미네소타 대학의-트윈 시티, CSCI 1901년, 전 소개 컴퓨터 과학 과정은 또한 그 주요한 언어는 자바 프로그래밍 언어에 학생들을 활용한 코스가 뒤에 오는데, 반면 기능[46] 하지만, MIT의 사례를, 그 부서는Python-based CSCI 1133,[47]과 1901년 교체 방안을 사용했다.알 prog3학기 코스 CSCI 2041에서 [48]자세히 다룹니다.소프트웨어 업계에서는 아시아 최대의 소프트웨어 컨설팅 회사인 Tata Consultancy Services가 대학 [citation needed]졸업생을 위한 한 달간의 트레이닝 프로그램에 Scheme를 사용하고 있습니다.

스킴은 다음에도 사용되었습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Common LISP: The Language, 2nd Ed., Guy L. Steel Jr.디지털 프레스, 1981년. ISBN978-1-55558-041-4. "Common Lisp는 Lisp의 새로운 방언으로, MacLisp의 후속이며, ZetaLisp의 영향을 받고 있으며, 어느 정도 Scheme와 InterLisp의 영향을 받았습니다."
  2. ^ a b 1178-1990 (Reaff 2008)스킴 프로그래밍 언어의 IEEE 표준.IEEE 부품 번호 STDPD14209는 2008년 3월 26일 IEEE-SA Standards Board Standards Review Committee(RevCom; IEEE-SA 표준 위원회 표준 검토 위원회) 회의에서 만장일치로 재확인되었습니다(회의록에 항목 6.3 참조).메모: 이 문서는 IEEE에서만 구입할 수 있으며 작성 시점(2009년)에는 온라인에서는 이용할 수 없습니다.
  3. ^ a b c d e f g h i j k l m n o p q Richard Kelsey; William Clinger; Jonathan Rees; et al. (August 1998). "Revised5 Report on the Algorithmic Language Scheme". Higher-Order and Symbolic Computation. 11 (1): 7–105. doi:10.1023/A:1010051815785. S2CID 14069423. Retrieved 2012-08-09.
  4. ^ a b "R7RS final available" (PDF). 2013-07-06.
  5. ^ a b c d Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton; et al. (August 2007). "Revised6 Report on the Algorithmic Language Scheme (R6RS)". Scheme Steering Committee. Retrieved 2011-09-13.
  6. ^ a b c d Sussman, Gerald Jay; Steele, Guy L. (1 December 1998). "The First Report on Scheme Revisited". Higher-Order and Symbolic Computation. 11 (4): 399–404. doi:10.1023/A:1010079421970. S2CID 7704398.
  7. ^ "R6RS Implementations". r6rs.org. Retrieved 2017-11-24.
  8. ^ Abdulaziz Ghuloum (2007-10-27). "R6RS Libraries and syntax-case system (psyntax)". Ikarus Scheme. Retrieved 2009-10-20.
  9. ^ Keep, Andrew W.; Dybvig, R. Kent (November 2014). "A run-time representation of scheme record types". Journal of Functional Programming. 24 (6): 675–716. doi:10.1017/S0956796814000203. S2CID 40001845.
  10. ^ "Revised^6 Report on the Algorithmic Language Scheme, Appendix E: language changes". Scheme Steering Committee. 2007-09-26. Retrieved 2009-10-20.
  11. ^ "R6RS Electorate". Scheme Steering Committee. 2007. Retrieved 2012-08-09.
  12. ^ Marc Feeley (compilation) (2007-10-26). "Implementors' intentions concerning R6RS". Scheme Steering Committee, r6rs-discuss mailing list. Retrieved 2012-08-09.
  13. ^ a b Will Clinger, Marc Feeley, Chris Hanson, Jonathan Rees and Olin Shivers (2009-08-20). "Position Statement (draft)". Scheme Steering Committee. Retrieved 2012-08-09.{{cite web}}: CS1 maint: 여러 이름: 작성자 목록(링크)
  14. ^ "R7RS 9th draft available" (PDF). 2013-04-15.
  15. ^ Will Clinger (2013-05-10). "extension of voting period". Scheme Language Steering Committee, scheme-reports mailing list. Archived from the original on 2013-07-21. Retrieved 2013-07-07.
  16. ^ Scheme 48의 실장은 Richard Kelsey와 Jonathan Rees가 48시간(1986년 8월 6일~7일)에 작성했기 때문에 그렇게 이름 붙여졌습니다.참조
  17. ^ a b Gerald Jay Sussman & Guy Lewis Steele Jr. (December 1975). "Scheme: An Interpreter for Extended Lambda Calculus" (PDF). AI Memos. MIT AI Lab. AIM-349. hdl:1721.1/5794. Retrieved 23 December 2021.
  18. ^ Joel Moses (June 1970), The Function of FUNCTION in LISP, or Why the FUNARG Problem Should Be Called the Environment Problem, hdl:1721.1/5854, AI Memo 199, A useful metaphor for the difference between FUNCTION and QUOTE in LISP is to think of QUOTE as a porous or an open covering of the function since free variables escape to the current environment. FUNCTION acts as a closed or nonporous covering (hence the term "closure" used by Landin). Thus we talk of "open" Lambda expressions (functions in LISP are usually Lambda expressions) and "closed" Lambda expressions. [...] My interest in the environment problem began while Landin, who had a deep understanding of the problem, visited MIT during 1966-67. I then realized the correspondence between the FUNARG lists which are the results of the evaluation of "closed" Lambda expressions in LISP and ISWIM's Lambda Closures.
  19. ^ van Tonder, André (1 January 2004). "A Lambda Calculus for Quantum Computation". SIAM Journal on Computing. 33 (5): 1109–1135. arXiv:quant-ph/0307150. doi:10.1137/S0097539703432165. S2CID 613571.
  20. ^ Niehren, J.; Schwinghammer, J.; Smolka, G. (November 2006). "A concurrent lambda calculus with futures" (PDF). Theoretical Computer Science. 364 (3): 338–356. doi:10.1016/j.tcs.2006.08.016.
  21. ^ Gerald Jay Sussman & Guy Lewis Steele Jr. (March 1976). "Lambda: The Ultimate Imperative". AI Memos. MIT AI Lab. AIM-353. Archived from the original (postscript or PDF) on 2016-05-10. Retrieved 2012-08-09.
  22. ^ Gabriel, Richard P.; Pitman, Kent (1988). "Technical Issues of Separation in Function Cells and Value Cells". Lisp and Symbolic Computation. Vol. 1, no. 1 (published June 1988). pp. 81–101. doi:10.1007/BF01806178. Retrieved 2012-08-09.
  23. ^ a b Philip L. Bewig (2008-01-24). "SRFI 41: Streams". The SRFI Editors, schemers.org. Retrieved 2012-08-09.
  24. ^ William Clinger and Jonathan Rees, ed. (1991). "Revised4 Report on the Algorithmic Language Scheme". ACM Lisp Pointers. 4 (3): 1–55. Retrieved 2012-08-09.
  25. ^ Flatt, Matthew (2016). "Binding as sets of scopes". Proceedings of the 43rd Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages. pp. 705–717. doi:10.1145/2837614.2837620. ISBN 978-1-4503-3549-2. S2CID 15401805.
  26. ^ Jonathan Rees, The Scheme of Things 1992년 6월 미팅은 Lisp Points, V(4)에서 Wayback Machine(postscript)에서 2011-07-16을 아카이브했습니다.2012-08-09 취득
  27. ^ Taylor Campbell (2005-07-21). "SRFI 62: S-expression comments". The SRFI Editors, schemers.org. Retrieved 2012-08-09.
  28. ^ William D Clinger (1999-07-01). "SRFI 6: Basic String Ports". The SRFI Editors, schemers.org. Retrieved 2012-08-09.
  29. ^ Scott G. Miller (2002-06-25). "SRFI 28: Basic Format Strings". The SRFI Editors, schemers.org. Retrieved 2012-08-09.
  30. ^ J.W. Backus; F.L. Bauer; J.Green; C. Katz; J. McCarthy P. Naur; et al. (January–April 1960). "Revised Report on the Algorithmic Language Algol 60". Numerische Mathematik, Communications of the ACM, and Journal of the British Computer Society. Retrieved 2012-08-09.
  31. ^ Jonathan Rees; William Clinger, eds. (December 1986). "Revised(3) Report on the Algorithmic Language Scheme (Dedicated to the Memory of ALGOL 60)". ACM SIGPLAN Notices. 21 (12): 37–79. CiteSeerX 10.1.1.29.3015. doi:10.1145/15042.15043. hdl:1721.1/6424. S2CID 43884422. Retrieved 2012-08-09.
  32. ^ "Scheme Systems Supporting SRFIs". The SRFI Editors, schemers.org. 2009-08-30. Retrieved 2012-08-09.
  33. ^ 75개의 기존 구현 방식을 다음에 나타냅니다.
  34. ^ Ed Martin (2009-07-20). "List of Scheme-using schools". Schemers Inc. Retrieved 2009-10-20.
  35. ^ "List of SICP-using schools". MIT Press. 1999-01-26. Retrieved 2009-10-20.
  36. ^ Eric Grimson (Spring 2005). "6.001 Structure and Interpretation of Computer Programs". MIT Open Courseware. Retrieved 2009-10-20.
  37. ^ Alex Vandiver; Nelson Elhage; et al. (January 2009). "6.184 - Zombies drink caffeinated 6.001". MIT CSAIL. Retrieved 2009-10-20.
  38. ^ John DeNero (Fall 2019). "Computer Science 61A, Berkeley". Department of Electrical Engineering and Computer Sciences, Berkeley. Retrieved 2019-12-17.
  39. ^ CS 2500: 북동부 대학 컴퓨터 사이언스 I의 기초
  40. ^ CS 1101: 프로그램 설계 입문 (A05) : Worcester Polytechnical Institute, 코스 소프트웨어
  41. ^ "CSSE 304: Programming Language Concepts". Rose-Hulman Institute of Technology.
  42. ^ "Spring 2021 CS121b Syllabus" (PDF). Brandeis University.
  43. ^ "Home". berkeley-cs61as.github.io.
  44. ^ Dana Angluin (Fall 2009). "Introduction to Computer Science (CPSC 201)". The Zoo, Yale University Computer Science Department. Retrieved 2009-10-20.
  45. ^ "Programming Design Paradigms CSG107 Course Readings". Northeastern University College of Computer and Information Science. Fall 2009. Retrieved 2012-08-09.
  46. ^ 2010년 봄, 미네소타 대학 컴퓨터 과학부 웨이백 머신에 2010-06-19를 아카이브 했습니다(2010-01-30 액세스).
  47. ^ CSCI 필수 수업 과정 설명기타 정보 미네소타 대학 컴퓨터과학과 웨이백 머신에 보관(2019-10-25 접근)
  48. ^ CSCI 2041 - 미네소타 대학 CSE 교육과정위원회 신설(2019-10-25 접근)
  49. ^ Robin Cover (2002-02-25). "DSSSL - Document Style Semantics and Specification Language. ISO/IEC 10179:1996". Cover Pages. Retrieved 2012-08-09.
  50. ^ "오늘날 GIMP에 부가된 주요 스크립트 언어는 Scheme입니다."송신원
  51. ^ Todd Graham Lewis; David Zoll; Julian Missig (2002). "GNOME FAQ from Internet Archive". The Gnome Team, gnome.org. Archived from the original on 2000-05-22. Retrieved 2012-08-09.
  52. ^ "guile-gnome". Free Software Foundation. Retrieved 2012-08-09.
  53. ^ Laurence Brevard (2006-11-09). "Synopsys MAP-inSM Program Update: EDA Interoperability Developers' Forum" (PDF). Synopsis Inc. Retrieved 2012-08-09.
  54. ^ Kawai, Shiro (October 2002). "Gluing Things Together - Scheme in the Real-time CG Content Production". Proceedings of the First International Lisp Conference, San Francisco: 342–348. Retrieved 2012-08-09.
  55. ^ Bill Magnuson; Hal Abelson & Mark Friedman (2009-08-11). "Under the Hood of App Inventor for Android". Google Inc, Official Google Research blog. Retrieved 2012-08-09.

추가 정보

외부 링크