Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pol_Grem_-_ANSI_Common_Lisp_High_tech_-_2012.pdf
Скачиваний:
28
Добавлен:
12.03.2016
Размер:
4.85 Mб
Скачать

Итоги главы

109

(defun num->date (n)

(multiple-value-bind (y left) (num-year n) (multiple-value-bind (m d) (num-month left y)

(values d m y))))

(defun num-year

(n)

(if (< n 0)

 

 

(do* ((y (-

yzero 1) (- y 1))

 

(d (-

(year-days y)) (- d (year-days y))))

 

((<=

d

n) (values y (- n d))))

(do* ((y yzero (+ y 1))

 

(prev

0 d)

 

(d (year-days y) (+ d (year-days y))))

 

((> d n) (values y (- n prev))))))

(defun num-month (n y)

(if (leap? y)

 

 

(cond

((=

n

59) (values 2 29))

 

((>

n

59) (nmon (- n 1)))

 

(t

 

(nmon n)))

(nmon

n)))

 

 

(defun nmon

(n)

 

 

(let ((m (position n month :test #’<)))

(values

m (+ 1 (- n (svref month (- m 1)))))))

(defun date+ (d

m

y n)

(num->date (+

(date->num d m y) n)))

Рис. 5.2. Опера­ции­ с дата­ми:­ преоб­ра­зо­ва­ние­ целых­ чисел­ в даты­

Итоги главы

1.В Common Lisp есть три основ­ных­ конст­рук­ции­ для блоков:­ progn, block с возмож­но­стью­ немед­лен­­ного­ выхо­да­ (return) и tagbody, внутри­ кото­рой­ рабо­та­ет­ goto. Многие­ встроен­ные­ опера­то­ры­ исполь­зу­ют­ неяв­ные­ блоки­.

2.Созда­ние­ ново­го­ лекси­че­ско­го­ контек­ста­ экви­ва­лент­но­ вызо­ву­ функ­ ции.

3.В Common Lisp есть набор­ услов­ных­ опера­то­ров,­ приспо­соб­лен­­ных для различ­ных­ ситуа­ций­. Все они могут­ быть опре­де­ле­ны­ с помо­­ щью if.

4.В Common Lisp есть так­же разно­об­раз­ные­ итера­ци­он­ные­ опера­то­ры­.

5.Выра­же­ния­ могут­ возвра­щать­ несколь­ко­ значе­ний­.

6.Вычис­ле­ния­ могут­ быть прерва­ны,­ а также­ могут­ быть защи­ще­ны­ от послед­ст­вий­ таких­ преры­­ваний­.

110

Глава 5. Управление

Упражнения

1.Запи­ши­те­ следую­щие­ выра­же­ния­ без исполь­зо­ва­ния­ let или let*, а также­ без вычис­ле­ния­ одно­го­ и того­ же выра­же­ния­ дваж­ды:­

(a)(let ((x (car y))) (cons x x))

(b)(let* ((w (car x))

(y (+ w z))) (cons w y))

2.Пере­пи­ши­те­ функцию­ mystery (стр. 46) с исполь­зо­ва­ни­ем­ cond.

3.Опре­де­ли­те­ функцию,­ возвра­щаю­щую­ квадрат­ своего­ аргу­мен­та,­ лишь когда­ аргу­мент ­– поло­жи­тель­ное­ число,­ меньшее­ или равное­ пяти­.

4.Пере­пи­ши­те­ month-num (рис. 5.1), исполь­зуя­ case вместо­ svref.

5.Опре­де­ли­те­ функцию­ (рекур­сив­ную­ и итера­тив­ную­ версии)­ от объ­ екта­ x и векто­ра­ v, возвра­щаю­щую­ список­ объек­тов,­ следую­щих­ не­ посред­ст­вен­­но перед­ x в v:

>(precedes #\a "abracadabra") (#\c #\d #\r)

6.Опре­де­ли­те­ функцию­ (итера­тив­но­ и рекур­сив­но),­ прини­маю­щую­ объ­ ект и список­ и возвра­щаю­щую­ новый­ список,­ в кото­ром­ задан­ный­ элемент­ нахо­дит­ся­ между­ каждой­ парой­ элемен­тов­ исход­но­го­ списка:­

>(intersperse ’- ’(a b c d))

(A - B - C - D)

7.Опре­де­ли­те­ функцию,­ прини­маю­щую­ список­ чисел­ и возвра­щаю­­ щую исти­ну,­ если­ разни­ца­ между­ каждой­ после­дую­щей­ их парой­ равна­ 1. Исполь­зуй­те:­

(a)рекур­сию­

(b)do

(c)mapc и return

8.Опре­де­ли­те­ одиноч­ную­ рекур­сив­ную­ функцию,­ кото­рая­ возвра­ща­ет­ два значе­ния ­– макси­маль­ный­ и мини­маль­ный­ элемен­ты­ векто­ра­.

9.Програм­ма­ на рис. 3.12 продол­жа­ет­ поиск­ после­ нахо­ж­де­ния­ перво­­ го подхо­дя­ще­го­ пути­ в очере­ди­. Для больших­ сетей­ это может­ стать пробле­мой­.

(a)Исполь­зуя­ catch и throw, изме­ни­те­ програм­му­ таким­ обра­зом,­ чтобы­ она возвра­ща­ла­ первый­ найден­ный­ путь сразу­ же после­ того,­ как он найден­.

(b)Пере­пи­ши­те­ програм­му,­ чтобы­ она дела­ла­ то же самое­ без ис­ пользо­ва­ния­ catch и throw.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]