이전에 알아본 좋은 프로그래밍 언어가 갖추어야 할 목록
"제곱"을 어떻게 나타내는지 살펴보면서 배워보자.
수를 제곱하는 방법
'어떤 값을 제곱하려면, 같은 값을 두 번 곱한다.'
이런 생각을 컴퓨터에 옮겨보면 다음과 같다
;;; to square something, multiply it by itself.
(define (square x) (* x x))
sqaure라고 하는 이미 있던 다른 프로시저(define)를 하나로 묶어서 만든 compound procedure(묶음 프로시저)가 하나 생겼다.
- 정의에 따라 값을 두 번 곱하는 연산
- 곱할 값을 x라는 local name(갇힌 이름)으로 받아오는데, 자연어에서 대명사와 쓰임새가 비슷하다.
- 이 프로시저 정의를 계산한 결과로, 새로운 묶음 프로시저가 하나 생기고, 그 이름을 square라고 지었다.
프로시저를 정의하는 문법은 다음과 같다
(define ([name][formal parameters]) [body])
앞서 정의한 square를 사용하며 재귀를 활용한 compound procedure의 원리와 구조를 음미해보자.
;: (square 21)
;;; 441
;: (square (+ 2 5))
;;; 49
;: (square (square 3))
;;; 81
square를 만들 때 *라는 기본 프로시저를 썼듯이 square 또한 다른 프로시저를 정의할 때 쓸 수 있다.
;;; x² + y²
;; (+ (sqaure x) (square y))
이 식에 이름을 붙이면?
(define (sum-of-squares))
(+ (square x) (square y)
(sum-of-squares 3 4)
;;; 25
두 인자를 받아 제각기 제곱하여 더하는 프로시저 완성!
마찬가지로 sum-of-squares 또한 다른 프로시저를 정의할 때 쓸 수 있다.
(define f a)
(sum-of-squares (+ a 1) ( * a 2)
(f 5)
;;; 136 (6² + 10²)
묶음 프로시저든 기본 프로시저든 쓰는 방법은 같다.
앞에서 sum-of-squares 프로시저의 정의만 놓고 보면,
그 몸 속에서 square라는 프로시저가 +나 *처럼 실행기에 처음부터 들어 있던 것인지, 아니면 새로 만든 것인지 구별하지 못한다.