갈루아의 반서재



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