값, 이름, 프로시저

값과 이름과 호출을 구분하고, define과 let과 lambda로 재사용할 프로시저를 만듭니다.

프로시저를 정의하고 값에 이름을 붙인 뒤, 겹친 호출의 결과를 예상해 봅니다. let으로 한 계산 안에서만 쓸 이름도 만듭니다.

첫 프로그램을 먼저 읽으세요. 각 예제는 플레이그라운드에서 따로 실행하세요. 아래 결과는 플레이그라운드가 최상위 식의 값을 자동으로 표시한 것입니다.

너비 예제는 재단 너비 20cm에 양쪽 도련의 합 3cm를 더해 23cm를 구합니다.

값을 직접 쓰기

LISPEX
42
#t
"Lispex"
#\L
'ready

플레이그라운드는 다음 다섯 값을 표시합니다.

42
#t
"Lispex"
#\L
ready

차례로 수, 불리언, 문자열, 문자, 심볼입니다. 불리언은 참이나 거짓을 나타내는 값이며 #t와 #f로 씁니다. #\L은 문자 L 하나이고, "Lispex"는 문자열입니다.

심볼은 ready처럼 코드에서 이름으로 쓸 수 있는 값입니다. ready라고 쓰면 리스펙스는 그 이름에 연결된 값을 찾습니다. 'ready라고 쓰면 심볼 자체를 반환합니다. 앞의 작은따옴표가 심볼을 데이터로 남깁니다.

겹친 호출 따라가기

LISPEX
(+ 10 (* 2 3))

결과

출력
16

리스펙스는 +를 찾고 10을 평가한 다음 (* 2 3)을 왼쪽부터 계산합니다. 안쪽 호출은 6을 반환합니다. 바깥 호출은 10과 6을 더합니다.

보통 호출은 인자들을 평가한 뒤 프로시저를 호출합니다. define, lambda, let, if 같은 형식에는 각각 평가 규칙이 있습니다. 이 규칙들은 이름을 쓸 수 있는 곳도 정합니다.

값에 이름 붙이기

LISPEX
(define 도련 3)
(+ 20 도련)

결과

출력
23

여기서 define은 값 3에 도련라는 이름을 붙입니다. 파일의 뒤쪽 식에서 이 이름을 쓸 수 있습니다. 최상위에서 같은 이름을 다시 define하면 기존 이름의 값을 갱신합니다.

정의 자체는 표시할 값을 만들지 않습니다. 플레이그라운드는 덧셈의 결과인 23을 표시합니다.

한 계산 안에서만 이름 쓰기

LISPEX
(let ((여백 7))
  (* 여백 2))

결과

출력
14

let은 본문인 (* 여백 2) 안에서 7을 여백라는 이름으로 사용하게 합니다. 이 지역 이름은 해당 본문 안에서만 쓸 수 있습니다. 프로그램에서 이름을 쓸 수 있는 부분을 그 이름의 유효 범위라고 합니다.

다시 쓰는 프로시저 만들기

LISPEX
(define (도련-포함-너비 재단-너비 도련)
  (+ 재단-너비 도련))

(도련-포함-너비 20 3)

결과

출력
23

이 코드는 입력 이름이 재단-너비와 도련인 프로시저를 정의합니다. 호출할 때 두 이름에 값 20과 3을 전달합니다. 본문은 두 값을 더합니다.

같은 정의를 lambda로도 쓸 수 있습니다.

LISPEX
(define 도련-포함-너비
  (lambda (재단-너비 도련)
    (+ 재단-너비 도련)))

lambda가 프로시저 값을 만들고, define이 그 값에 도련-포함-너비라는 이름을 붙입니다. 이 정의만 실행하면 표시되는 값은 없습니다. 이 프로시저에는 인자가 두 개 필요합니다. 하나나 세 개를 전달하면 실행 오류가 납니다.

조각을 합치기

LISPEX
(define (도련-포함-너비 재단-너비 도련)
  (+ 재단-너비 도련))

(list (도련-포함-너비 20 3)
      (let ((여백 7))
        (* 여백 2)))

결과

출력
(23 14)

list는 전달받은 인자로 리스트를 만듭니다. 리스펙스는 첫 인자의 값 23을 구하고, 다음 인자의 값 14를 구합니다. list는 이 두 값을 받아 (23 14)를 반환합니다.

연습

입력에 3을 곱하는 triple 프로시저를 정의해 보세요. list 안에서 두 번 호출해 (12 21)을 만드세요.

답 하나 보기
LISPEX
(define (triple n)
  (* n 3))

(list (triple 4) (triple 7))

결과는 (12 21)입니다.

이제 겹친 호출의 순서와 여백를 쓸 수 있는 곳을 짚어 보세요. 코드가 곧 데이터에서 호출과 인용한 리스트를 비교합니다.