Использование 'ash' в LISP для выполнения двоичного поиска?

Итак, сейчас я читаю "Land of Lisp", и Lisp оказывается совсем не таким, как другие языки программирования, которые я видел.

Так вот, в книге приводится код, который мы должны ввести в CLISP REPL:

(defparameter *small* 1)
(defparameter *big* 100)

(defun guess-my-number ()
    (ash (+ *small* *big*) -1))

(defun smaller ()
    (setf *big* (1- (guess-my-number)))
    (guess-my-number))

(defun bigger ()
    (setf *small* (1+ (guess-my-number)))
    (guess-my-number))

Итак, основная цель - создать игру по угадыванию чисел, в которой пользователь/игрок выбирает число, а компьютер пытается его угадать. Он выполняет "двоичный поиск", чтобы найти число игрока, заставляя игрока сообщать, больше или меньше угаданного компьютером числа, чем число игрока.

Я немного запутался в функции ash. Насколько я понимаю, она жизненно важна для двоичного поиска, но я не совсем понимаю, почему. В книге несколько объясняется, что она делает, но это немного запутывает.

Что делает функция ash? Почему ей передаются параметры *small*, добавленные к *big* и -1? Как это работает? Какую цель он преследует при бинарном поиске?

5
задан Joshua Taylor 17 February 2015 в 17:53
поделиться