R6RS Scheme: 프로시저

R6RS Scheme: 프로시저

Scheme의 프로시저(procedure) 개념을 설명해요. 정의로 프로시저를 만드는 방법, 프로시저를 객체로 다루는 방법, 그리고 lambda 표현식을 다뤄요.

출처: 문서

본문

정의는 프로시저를 정의하는 데에도 사용될 수 있어요:

(define (f x)
  (+ x 42))
(f 23)  ⇒ 65

프로시저는 약간 단순화하면, 객체들에 대한 표현식의 추상화(abstraction)예요. 이 예에서 첫 번째 정의는 f라 불리는 프로시저를 정의해요. (f x 주위의 괄호에 주목하세요 — 이것은 프로시저 정의라는 것을 나타내요.) 표현식

(f
 23)

은 프로시저 호출인데, 대략 "x가 23에 바인딩된 상태에서 (+ x 42)(프로시저의 본문)를 평가하라"는 뜻이에요.

프로시저는 객체이므로 다른 프로시저에 전달될 수 있어요:

(define (f x)
  (+ x 42))
(define (g p x)
  (p x))
(g f 23)  ⇒ 65

이 예에서 g의 본문은 pf에, x가 23에 바인딩된 상태로 평가되며, 이는 (f 23)과 동등하고, 65로 평가돼요.

사실 Scheme의 많은 사전 정의된 연산들은 문법이 아니라 값이 프로시저인 변수들로 제공돼요. 예를 들어 + 연산은 많은 다른 언어에서 특별한 문법 처리를 받지만, Scheme에서는 숫자 객체를 더하는 프로시저에 바인딩된 그냥 보통의 식별자예요. *와 많은 다른 것들도 마찬가지예요:

(define (h op x y)
  (op x y))
(h + 23 42)  ⇒ 65
(h * 23 42)  ⇒ 966

프로시저 정의만이 프로시저를 만드는 유일한 방법은 아니에요. lambda 표현식은 이름을 지정할 필요 없이 새 프로시저를 객체로 만들어요:

((lambda (x) (+ x 42)) 23)  ⇒ 65

이 예의 전체 표현식은 프로시저 호출이에요. (lambda (x) (+ x 42))는 단일 숫자 객체를 받아 42를 더하는 프로시저로 평가돼요.

더 알아보기 (Learn more)

출처: Procedures - R6RS