Общая информацияВ 1 семестре 2010-2011 учебного года на практических занятих по спецкурсу кафедры систем информатики «Парадигмы программирования» изучается язык LISP. В связи с большим количеством студентов в группе занимаемся по принципу «пришёл, сдал, ушёл» (либо приходим со своим ноутбуком, на котором установлен Common LISP). О занятиях, на которых будет рассказываться теория, я буду сообщать заранее. Условия: задачи 1, 2, 3, 4, 6, 8, 10 являются обязательными и получить зачёт, не сдав их,
невозможно. Оценка «удовлетворительно» ставится за 7, 8 или 9 сданных задач (включая все
обязательные). Оценка «хорошо» ставится за 10–12* сданных задач (включая все обязательные).
Оценка «отлично» ставится за
* Ранее было написано иначе (по историческим причинам): я решил разбить последнюю задачу на две, но не обновил главную страницу. Время и место: среда, 9:00, ауд. 309 с.к. НГУ. Преподаватель: Александр Геннадьевич Фенстер, fenster@fenster.name, +7 913 9053295. Рекомендуемая литература:
|
Таблица результатов
Гистограмма |
append1
, которая
объединяет два списка:> (append1 '(a b) '(c d))
(A B C D)
Функция с именем append
является
стандартной, поэтому ваша функция может называться append1
или
как-то иначе. То же самое верно для следующих заданий, в которых
имя функции содержит единицу.
reverse1
, которая
«переворачивает» список:> (reverse1 '(a b c))
(C B A)
> (atoms '((a b) c nil (d (e f g))))
(A B C NIL D E F G)
eql
, умеющий сравнивать два атома,
реализуйте предикат equal1
, сравнивающий два S-выражения.
Пример:> (equal1 '(1 3 5) '(1 3 5))
T
> (equal1 '(1 3 5) '(1 (3 5)))
NIL
> (permut '(1 2 3))
((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1))
> (sort1 '(1 5 2 4 3) '<)
(1 2 3 4 5)
> (setq arg '(a (b c) d))
ARG
> (find-in-list arg 'c)
#<FUNCTION :LAMBDA (L) .....>
> (funcall (find-in-list arg 'c) arg)
C
В Common LISP функции из заголовка называются, соответственно, mapcar
, reduce
и remove-if-not
.
При реализации следующих двух заданий старайтесь не использовать рекурсию, пользуясь для перебора элементов списка указанными в заголовке функциями.
(loop for i from 2 to N collect i)
.
> (primes 15)
(2 3 7 11 13)
funcall
: (funcall '+ 1 3)
равно четырём.
> (calc '(1 2 + 1 3 + *))
12
Теория по этой теме находится в отдельном файле.
> (setq gen1 (make-primes-generator))
GEN1
> (funcall gen1)
2
> (funcall gen1)
3
Распределение заданий приведено в таблице, формулировки задач находятся в отдельном файле.