Введение в программирование на Лиспе

         

Примеры программ с циклами


(defun first-a (la) ;; самый левый атом (setq x la) (loop (setq x (car x)) ; левый элемент структуры (cond ((atom x)(return x)) ) ; явный выход из цикла при обнаружении атома ) )

(print (first-a '(((123) 46) 5) ))

Пример 11.3. Выбор самого левого атома из произвольной структуры данных (html, txt)

(defun len-do (ld) ;; длина списка (do ((x ld (cdr x)); на каждом шаге переход к хвосту списка (N 0 (1+ N))) ; подсчет числа шагов ((null x) N)) ; выход из цикла при пустом списке )

(print (len-do '(1 2 3 4 5)))

Пример 11.4. Вычисление длины списка (html, txt)

(defun list-pa (lp) (setq rl nil) (dolist (el lp rl) ; параметры перебора и результат (setq rl (cons (cons el el) rl)) ))

(print (list-pa '(a b c d))) ; = ((A . A)(B . B)(C . C)(D . D))

Пример 11.5.

(html, txt)

(defun ind-n (ln n) (setq bl ln) (setq ind nil) (dotimes (i n ind) (setq ind (cons (- n i) (cons (car bl ) ind ))) (setq bl (cdr bl)) )) (print (ind-n '(a b c d e f g) 4)) ; = D

Пример 11.6. Индексный выбор элемента из списка (html, txt)

Таблица 11.1. Clisp: Функции, моделирующие императивный стиль

(Go Атом )Безусловный переход на оператор, помеченный Атомом
(Prog Атомы-или-Формы …)Вычисляет последовательность форм в императивном стиле
(Prog1 Форма …)Вычисляет формы, формальный результат – значение первой из них.
(Prog2 Форма …)Вычисляет формы, формальный результат – значение второй из них.
(Progn Форма …)Вычисляет формы, формальный результат – значение последней из них.
(Return Форма )Результат и завершение формы Prog
(Do (var ...) ( expr rez ...) expr ...)Цикл с последовательным заданием параметров и выходом по заданному условию
(Do* (var ...) ( expr rez ...) expr ...)Цикл с параллельным заданием параметров и выходом по заданному условию
(Dolist (var list [rez] ) expr ...) Цикл перебора значений параметра из списка
(Dotimes (var number [rez] ) expr ...)Цикл, работающий заданное число раз
(Loop expr ...)Цикл работающий до внутреннего Return



Содержание раздела