다른 많은 언어와 마찬가지로 Common Lisp에서도 숫자는 몇 가지 타입으로 나뉘어요. 그중 가장 기본적인 두 가지는 다음과 같아요.
다른 많은 언어와 마찬가지로 Common Lisp에도 정수가 있어요.
정수는 소수점이 없는 온전한 수예요 (예: -6, 0, 25, 1234 등).
Common Lisp은 정수의 크기에 아무런 제한을 두지 않아요. 정수는 얼마든지 커질 수 있어요 (음수라면 얼마든지 작아질 수도 있어요).
일반적으로 온전한 수만 다룬다면 정수를 사용하는 게 좋아요. 정수는 실수처럼 여러 번 계산하면서 정밀도를 잃는 문제가 없기 때문이에요.
다른 많은 언어와 마찬가지로 Common Lisp에도 실수가 있어요.
실수는 소수점을 포함하는 분수나 온전한 수예요 (예: 3.14, -1.7, 99.99, 2048.0).
Common Lisp은 대부분의 연산에 표준 산술 연산자를 사용하지만, 더 익숙한 "중위 표기법" 대신 "전위 표기법"을 사용한다는 점에서는 조금 독특해요.
그림으로 보면 더 명확해요:
;; Infix-notation (non-lisp languages)
1 + 2 + 3 + 4 + 5 ; => 15
;; Prefix-notation (lisp languages)
(+ 1 2 3 4 5) ; => 15
전위 표기법은 2 + 2 같은 연산을 조금 낯선 (+ 2 2) 형태로 바꾸긴 하지만, 한 번에 여러 숫자를 다루기가 훨씬 쉬워요.
Common Lisp에는 일반적인 함수가 모두 있어요. 덧셈, 뺄셈, 곱셈, 나눗셈을 위한 +, -, *, /가 바로 그것이에요.
나눗셈을 할 때 나머지를 알고 싶을 수 있는데, 그럴 때는 숫자와 제수를 인자로 받는 mod (modulo의 줄임말) 함수를 사용해요:
(mod 4 2) ; => 0
(mod 2 4) ; => 2
(mod 10 3) ; => 1
마지막으로, = (같음), /= (같지 않음), >= (크거나 같음) 같은 함수로 서로 다른 숫자를 비교하면 유용할 때가 있어요.
이 비교가 참이면 ((= 1 1)처럼) T를 반환하고, 거짓이면 ((> 0 1)처럼) NIL을 반환해요.
Lisp 외계인 릴리는 요리를 아주 좋아해요. 친구들과 피자 파티를 열고 싶은데, 재료를 최대한 알차게 쓰려면 시작하기 전에 재료가 각각 얼마나 필요한지 정확히 알고 싶어 해요.
이를 위해 릴리는 계획의 일부를 자동화할 프로그램을 대충 만들어 두었지만, 완성하는 데 도움이 필요해요. 릴리가 완벽한 비율의 피자 파티를 열 수 있도록 도와줄래요?
무엇보다도, 모든 훌륭한 피자는 맛있는 반죽에서 시작해요!
릴리는 가장자리 반죽이 두툼한, 얇고 바삭한 피자를 좋아해요. 가운데에 필요한 반죽은 항상 200g이고, 가장자리 20cm마다 반죽 45g이 필요해요.
다행히 릴리는 피자 개수(n)와 지름(d)으로 반죽의 그램 수(g)를 구하는 식을 계산해 두었어요:
g = n * (((45 * pi * d) / 20) + 200)
릴리에게는 이런 함수가 필요해요:
예를 들어, 지름 30cm 피자 4판을 만들려면:
(dough-calculator 4 30) ; => 1648
릴리는 소스를 바를 때 아주 꼼꼼하지만, 피자 크기는 일정하지 않을 수 있어요.
지름(d)을 알아내기 위해, 바른 소스의 양(s)을 변수로 한 다음 식을 사용해요:
d = square-root of ((40 * s) / (3 * pi))
릴리에게는 바른 소스의 밀리리터당 피자 지름(d)을 계산하는 함수가 필요해요.
예를 들어, 릴리가 소스 250ml를 사용했다면:
(size-from-sauce 250) ; => 32.57
릴리의 행성에서는 모든 치즈가 완벽한 정육면체로 나오고, 크기별로 팔려요. (뭘 기대했어요? 여긴 외계 행성이니까요...)
다시 한번, 릴리는 한 변의 길이가 l인 치즈 정육면체로 만들 수 있는, 지름 d인 피자의 개수(n)를 구하는 식을 계산했어요:
n = (2 * (l^3)) / (3* pi * (d^2))
이런 함수를 만들어 봐요:
예를 들어, 25x25x25cm 치즈 정육면체와 지름 30cm 피자가 주어졌다면:
(pizzas-per-cube 25 30) ; => 3
마지막으로, 릴리는 피자 한 판을 8조각으로 나눠서 친구들에게 똑같이 나눠 주고 싶어 해요.
이런 함수를 만들어 봐요:
T를, 그렇지 않으면 NIL을 반환해요.예를 들어:
;; For splitting 3 pizzas between 4 friends
(fair-share-p 3 4) ; => T
;; For splitting 2 pizzas between 3 friends
(fair-share-p 2 3) ; => NIL
Exercism에 가입하고 Common Lisp 트랙을 개념 27개연습 문제 92개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.