괄호 읽는 법

괄호는 어디에나 똑같이 적용되는 규칙 하나이고, 그 규칙이 보이는 순간 문법은 더 이상 장애물이 아닙니다.

결과: 괄호식의 첫 형식을 찾고 뒤따르는 조각과 구분하며, 보통 호출인지 특수 형식인지 알아볼 수 있습니다.

알아야 할 것: 없습니다. 프로그램을 한 번도 써 본 적 없는 분과, 많이 써 봤지만 괄호에서 튕겨 나온 분 모두를 위한 페이지입니다.

기본 생김새 하나를 계속 씁니다

대부분의 언어는 문법이 큽니다. 함수 호출이 있고, 우선순위를 가진 연산자가 있고, 문장이 있고, 블록이 있고, 각각 외워야 할 생김새가 따로 있습니다.

이 언어는 기본 생김새 하나를 계속 씁니다.

LISPEX
(할일 입력1 입력2 ...)

보통 호출에서는 괄호 안 첫 항목이 어떤 프로시저를 부를지 말합니다. 그 뒤는 전부 인자로 전달됩니다. 처음 만나는 식 대부분은 이 규칙으로 읽을 수 있습니다.

LISPEX
(+ 2 3)

소리 내어 "2와 3을 더하라"로 읽으세요. 값은 5입니다. 여기서 더하기 기호는 두 숫자 사이에 놓인 특별한 연산자가 아니라, 첫 번째 항목이자 호출할 프로시저입니다.

define, if, quote, lambda 같은 몇 가지는 같은 괄호 모양을 쓰지만 프로시저를 호출하지 않는 특수 형식입니다. 이때 첫 항목은 형식의 이름이고, 나머지는 그 형식이 계산 방법을 정하는 문법 조각입니다.

중첩도 같은 규칙이 안에서 한 번 더 도는 것

안쪽 식이 먼저 계산되고, 그 값이 자기 자리를 대신합니다.

LISPEX
(+ 10 (* 2 3))

안에서 밖으로 읽으세요. 2와 3을 곱해 6, 그다음 10과 6을 더해 16입니다.

괄호가 처음엔 무거워 보이다가 나중에 가벼워지는 이유가 이것입니다. 외울 우선순위가 없고, 곱셈이 덧셈보다 먼저인지 따질 일이 없습니다. 괄호의 생김새가 이미 순서를 말하고 있고, 언제나 애매함이 없습니다.

이제 읽을 수 있는 것

아래를 보고, 이 이름들이 무엇을 하는지 하나도 모르는 채로 무엇이 무엇에 적용되는지 말해 보세요.

LISPEX
(define (price-with-fee price fee)
  (+ price fee))

바깥의 define은 프로시저 호출이 아니라 특수 형식입니다. 첫 조각 (price-with-fee price fee)에는 정의할 이름과 그 프로시저가 받을 이름들이 들어 있습니다. 두 번째 조각은 본문입니다. 본문 (+ price fee)는 보통 호출이므로 두 값을 더합니다.

define의 세부 규칙을 배우기 전에도 정의를 뜻있는 조각으로 나눠 읽어 낸 겁니다. 작은 생김새를 반복해서 쓰는 보상이 이것입니다.

직접 해 보기

아래 식을 읽고 실행하기 전에 값을 예상해 보세요.

LISPEX
(+ 1 (* 2 (+ 3 4)))
정답 보기

15입니다. 가장 안쪽부터 3과 4를 더해 7, 2와 7을 곱해 14, 1을 더해 15. 연산자 우선순위는 추론에 한 번도 등장하지 않았습니다. 괄호가 순서를 말해 주었기 때문입니다.

다음으로 넘어갈 준비가 된 시점

처음 보는 식을 보고 괄호 쌍마다 첫 항목을 짚으며 무엇이 무엇에 적용되는지 말할 수 있으면 됩니다. 이름의 뜻을 몰라도 말할 수 있어야 합니다.

이 생김새를 먼저 실행해 보는 첫 프로그램으로 이어가세요.