이 페이지를 마치면 괄호 안의 첫 항목을 찾아 뒤따르는 조각과 구분하고, 그 식이 보통 호출인지 특수 형식인지 가려낼 수 있습니다.
미리 알아야 할 것은 없습니다. 프로그램을 한 번도 써 본 적 없는 분과, 많이 써 봤지만 괄호에서 튕겨 나온 분 모두를 위한 페이지입니다.
기본 생김새 하나를 계속 씁니다
대부분의 언어는 문법이 큽니다. 함수 호출이 있고, 우선순위를 가진 연산자가 있고, 문장이 있고, 블록이 있으며, 각각 외워야 할 생김새가 따로 있습니다.
이 언어는 기본 생김새 하나를 계속 씁니다.
(할일 입력1 입력2 ...)보통 호출에서는 괄호 안 첫 항목이 어떤 프로시저를 부를지 알려 줍니다. 그 뒤에 나오는 조각들은 인자로 전달됩니다. 처음 만나는 식 대부분은 이 규칙으로 읽을 수 있습니다.
(+ 2 3)소리 내어 "2와 3을 더하라"라고 읽어 보세요. 결과값은 5가 됩니다. 여기서 더하기 기호는 두 숫자 사이에 놓인 특별한 연산자가 아니라, 첫 번째 항목이자 호출되는 프로시저입니다.
define, if, quote, lambda 같은 몇 가지는 같은 괄호 생김새를 쓰지만 프로시저를 호출하지 않는 특수 형식입니다. 이러한 특수 형식에서는 첫 항목이 형식의 이름이고, 남은 조각들은 그 형식이 계산 방법을 정하는 문법입니다.
중첩도 같은 규칙이 안에서 한 번 더 도는 것
안쪽 식이 먼저 계산되고, 그 값이 자기 자리를 대신합니다.
(+ 10 (* 2 3))안쪽에서 바깥쪽으로 읽어 보세요. 2와 3을 곱해 6이 되고, 그다음 10과 6을 더해 16이 됩니다.
처음에는 괄호가 무거워 보이다가 나중에 가볍게 느껴지는 이유가 이것입니다. 외워야 할 우선순위가 없고, 곱셈이 덧셈보다 먼저인지 따질 필요도 없습니다. 괄호의 생김새가 매번 순서를 명확하게 말해 줍니다.
이제 읽을 수 있는 것
아래 식을 보고, 각 이름이 무슨 일을 하는지 몰라도 무엇이 무엇에 적용되는지 말해 보세요.
(define (price-with-fee price fee)
(+ price fee))가장 바깥의 define은 프로시저 호출이 아니라 특수 형식입니다. 첫 조각인 (price-with-fee price fee)는 정의할 이름과 그 프로시저가 받을 이름들입니다. 두 번째 조각은 본문입니다. 본문인 (+ price fee)는 보통 호출이므로 두 값을 더합니다.
define의 세부 규칙을 모두 배우기 전에도 정의를 의미 있는 조각으로 나누어 읽어 낸 것입니다. 작은 생김새를 반복해서 쓰는 보상이 바로 이것입니다.
직접 해 보기
아래 식을 읽고 실행하기 전에 계산 값을 예상해 보세요.
(+ 1 (* 2 (+ 3 4)))정답 보기
15입니다. 가장 안쪽 식부터 3과 4를 더해 7, 2와 7을 곱해 14, 1을 더해 15가 됩니다. 괄호가 계산 순서를 알려 주므로 연산자 우선순위는 전혀 생각할 필요가 없었습니다.
다음으로 넘어갈 준비가 된 시점
처음 보는 식을 마주하더라도 괄호 쌍마다 첫 항목을 짚으며 무엇이 무엇에 적용되는지 말할 수 있으면 됩니다. 이름의 뜻을 모르는 상태에서도 말할 수 있어야 합니다.
세부 조각을 깊이 배우기 전에 이 생김새를 먼저 실행해 보는 첫 프로그램으로 이어가세요.