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

46

Глава 2. Добро пожаловать в Лисп

13.Основ­ной­ пара­диг­мой­ Лиспа­ явля­ет­ся­ функцио­наль­ное­ програм­ми­­ рова­ние,­ то есть напи­са­ние­ кода­ без побоч­ных­ эффек­тов­.

14.Основ­ной­ итера­ци­он­ный­ опера­тор­ – do.

15.Функции­ явля­ют­ся­ обычны­ми­ объек­та­ми­ в Лиспе­. Они могут­ запи­­ сывать­ся­ в виде­ лямбда­-выра­же­ний,­ а также­ исполь­зо­вать­ся­ как ар­ гумен­ты­ для других­ функций­.

16.В Лиспе­ значе­ния­ имеют­ типы,­ а пере­мен­ные ­– нет.

Упражнения

1.Опиши­те,­ что проис­хо­дит­ при вычис­ле­нии­ следую­щих­ выра­же­ний:­

(a)(+ (- 5 1) (+ 3 7))

(b)(list 1 (+ 2 3))

(c)(if (listp 1) (+ 1 2) (+ 3 4))

(d)(list (and (listp 3) t) (+ 1 2))

2.Составь­те­ с помо­щью­ cons три различ­ных­ выра­же­ния,­ создаю­щие­ список­ (a b c).

3.С помо­щью­ car и cdr опре­де­ли­те­ функцию,­ возвра­щаю­щую­ чет­вер­ тый элемент­ списка­.

4.Опре­де­ли­те­ функцию,­ прини­маю­щую­ два аргу­мен­та­ и возвра­щаю­­ щую наиболь­ший­.

5.Что дела­ют­ следую­щие­ функции?­

(a)(defun enigma (x)

(and (not (null x)) (or (null (car x))

(enigma (cdr x)))))

(b)(defun mystery (x y) (if (null y)

nil

(if (eql (car y) x) 0

(let ((z (mystery x (cdr y)))) (and z (+ z 1))))))

6.Что может­ стоять­ на месте­ x в следую­щих­ выра­же­ни­ях?­

(a)> (car (x (cdr ’(a (b c) d))))

B

(b)> (x 13 (/ 1 0)) 13

(c)> (x #’list 1 nil)

(1)

Упражнения

47

7.Опре­де­ли­те­ функцию,­ прове­ряю­щую,­ явля­ет­ся­ ли списком­ хотя­ бы один элемент­ списка­. Пользуй­тесь­ только­ теми­ опера­то­ра­ми,­ кото­­ рые были­ упомя­ну­ты­ в этой главе­.

8.Предло­жи­те­ итера­тив­ное­ и рекур­сив­ное­ опре­де­ле­ние­ функции,­ ко­ торая:­

(a)печа­та­ет­ коли­че­ст­во­ точек,­ кото­рое­ равно­ задан­но­му­ поло­жи­­ тельно­му­ цело­му­ числу;­

(b)возвра­ща­ет­ коли­че­ст­во­ симво­лов­ a в задан­ном­ списке­.

9.Ваш това­рищ­ пыта­ет­ся­ напи­сать­ функцию,­ ко­торая­ сумми­ру­ет­ все значе­ния­ элемен­тов­ списка,­ кроме­ nil. Он напи­сал­ две версии­ такой­ функции,­ но ни одна­ из них не рабо­та­ет­. Объяс­ни­те,­ что не так в каж­ дой из них, и предло­жи­те­ коррект­ную­ версию:­

(a)(defun summit (lst)

(remove nil lst) (apply #’+ lst))

(b) (defun summit (lst) (let ((x (car lst)))

(if (null x)

(summit (cdr lst))

(+ x (summit (cdr lst))))))

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