Я начал изучать Lisp 2 дня назад, и я читаю обычный список ANSI Пол Грэма, который очень интересен для языка. Это не слишком много теоретических для новичков, и не слишком мелко (как глава Сьерра-Бэйт First Java, которого лично я ненавижу). После краткого общего введения языка он начинает говорить списки ботов и поднимает пример простого сжатия списка. В принципе, пусть el - это элемент, который повторяется n раз. Вы заменяете все их одним (n el) списком. Для этого он дал реализацию кода, но я попытался сделать свое, что, по-видимому, работает. По возможности я хотел бы, чтобы кто-то анализировал мой код и показывал мне критические моменты его реализации, и я уверен, что их много, так как это мой первый контакт с Lisp. Спасибо всем!Практика Lisp
(defun compress (x)
"compress a list replacing repeated sequential values for (<n> <value>)"
(let ((lst '()) (fst t) (lt nil) (n 0))
(dolist (el x)
(if fst
(progn
(setq fst nil)
(setq lt el)
(setq n 1))
(progn
(if (equal el lt)
(setq n (+ n 1))
(progn
(setq lst (cons (if (= n 1)
lt
(list n lt))
lst))
(setq lt el)
(setq n 1)
)))))
(setq lst (cons (if (and (not (= n 0)) (= n 1))
lt
(list n lt))
lst))
(reverse lst)))
Вы также можете быть заинтересованы в Питере Сейбел-х [Практический общий Лисп] (http://www.gigamonkeys.com/book/). – molbdnilo
'(compress nil)' yields '((0 nil))', что кажется странным. –
@molbdnilo Я тоже использую эту литературу, это тоже хорошо. Но не нашел там pdf-версию, просто файлы Tex, которые немного запутаны, и я не смог ее скомпилировать. Если у вас есть идея, как это сделать, сообщите мне. –