Defining the smaller and bigger Functions
smaller 함수와 bigger 함수를 작성해보자. 이 함수들은 guess-my-number 함수와 마찬가지로, defun 으로 정의되는 전역 함수이다.
1 2 3 4 5 6 7 8 | [7]> (defun smaller() (setf *big* (1- (guess-my-number))) (guess-my-number)) SMALLER [8]> (defun bigger() (setf *small* (1+ (guess-my-number))) (guess-my-number)) BIGGER | cs |
라인1에서 smaller 함수는 파라메터가 없기 때문에 smaller() 와 같이 괄호 안이 비어있다. 그리고나서 전역변수 *big* 의 값을 변경한다. 이 값은 최종 추측값보다 적어야하기 때문에, 그 값보다 1 이 적은 값으로 정했다. 2의 코드 중 (1- (guess-my-number)) 에서 가장 최근 추측값을 불러내서 그 값에서 1을 차감하는 1- 을 이용해 처리한다. 마지막으로 라인3에 (guess-my-number)을 놓음으로써 smaller 함수는 새로운 추측값을 보여준다. 이렇게되면 guess-my-number 는 새롭게 업데이트된 *big* 값을 쓰게되고, 다음 추측값을 계산한다. bigger 함수 또한 마찬가지 방식으로 기술된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [11]> (smaller) 25 [12]> (bigger) 37 [13]> (bigger) 43 [14]> (bigger) 46 [15]> (bigger) 48 [16]> (bigger) 49 [17]> (bigger) 49 | cs |
Defining the start-over Function
전역 변수를 초기화시켜주는 start-over 함수를 추가한다. start-over 함수는 *samll* 과 *big* 의 값을 초기화한다음 새로운 추측값을 내놓기 위해 (guess-my-number)를 호출한다.
1 2 3 4 5 | [21]> (defun start-over () (defparameter *small* 1) (defparameter *big* 100) (guess-my-number)) START-OVER | cs |
초기화시킨 후 91을 정답으로 생각하고 플레이해보면 다음과 같다. 컴퓨터는 50에서 시작을 하게 되고, 컴퓨터가 내놓은 값과 91을 비교하여 (bigger) 또는 (smaller) 을 실행시키다보면 다음과 같이 정답을 찾게 되는 것이다.
1 2 3 4 5 6 7 8 9 10 | [26]> (start-over) 50 [27]> (bigger) 75 [28]> (bigger) 88 [29]> (bigger) 94 [30]> (smaller) 91 | cs |