LAMBDA, DEFINE, LET

대입문이 없는데 값에 이름은 어떻게 붙일까?

화면을 누르면 다음 장으로 넘어갑니다

LAMBDA

이름 없는 함수를 그 자리에서 만듭니다

2편의 람다 식을 Scheme에서는 LAMBDA로 적습니다. (LAMBDA (x) (* x x))는 받은 값을 제곱하는 함수입니다. 뒤에 7을 적어 적용하면 x 자리에 7이 들어가 49가 됩니다.

이때 x를 결속 변수(bound variable)라고 합니다. 매개변수는 (a b x)처럼 여럿이어도 됩니다.

DEFINE ①

이름을 값에 묶습니다

DEFINE은 이름을 식의 값에 묶습니다. 첫째 자리의 이름은 평가하지 않고, 둘째 자리의 식을 평가해 그 값을 이름에 묶습니다. 이 이름은 변수가 아닙니다. 한 번 묶으면 바꿀 수 없는 이름, 곧 4강에서 본 명명 상수(이름 붙인 상수)와 같습니다.

'묶는다'는 4강에서 본 바인딩(이름과 값을 잇는 것)입니다. 6.283186은 2 × 3.141593입니다.

DEFINE ②

함수에도 이름을 붙입니다

같은 DEFINE으로 함수에 이름을 붙입니다. (DEFINE (square x) (* x x))는 이름 square를 람다 식에 묶습니다. LAMBDA라는 말은 적지 않아도 들어 있는 것으로 봅니다.

(square 5)는 교재의 사용 예입니다.

LET

잠깐 쓸 이름은 LET으로 묶습니다

4강에서 본 let 구조(이름을 잠깐 묶어 쓰는 구조)입니다. 앞에서 이름 alpha를 7에 묶고, 뒤의 식에서 그 이름을 씁니다. Scheme의 LET은 람다 식을 값에 적용하는 것을 줄여 쓴 표기입니다.

alpha는 LET 안에서만 보입니다.

IF

갈래도 식으로 나눕니다

선택은 IF로 합니다. 조건이 참이면 둘째 식의 값이, 거짓이면 셋째 식의 값이 IF 전체의 값이 됩니다. 6강의 조건식(조건에 따라 두 값 가운데 하나가 되는 식)처럼 값을 냅니다.

count와 sum의 값, 그리고 거짓일 때의 0은 설명을 위해 넣은 예시입니다.

COND

갈래가 여럿이면 위에서부터 맞춰 봅니다

COND는 조건을 위에서부터 차례로 보고, 처음으로 참인 줄의 값을 돌려줍니다. 윤년 판별 함수 leap?는 400의 배수면 참, 100의 배수면 거짓, 그 밖에는 4의 배수인지로 정합니다.

MODULO는 나머지, ZERO?는 0인지 묻는 함수입니다. #T는 참, #F는 거짓. 연도 셋은 예시입니다.

다음 편

갈래를 나눌 줄 알면, 반복문 없이 리스트를 훑을 수 있습니다

5편반복문 없이 리스트를 끝까지 볼 수 있을까? 14강 목록