私は 2 日前に Lisp の勉強を始めました。Paul Graham の ANSI Common List を読んでいて、言語構造が非常に興味深い方法で公開されています。初心者にとっては理論的すぎず、浅すぎません (個人的に嫌いな Sierra-Bate の Head First Java のように)。簡単な一般的な言語の紹介の後、彼はリストについて話し始め、単純なリスト圧縮の例を挙げます。基本的に、el は n 回繰り返される要素とします。それらすべてを 1 つの (n el) リストに置き換えます。これを行うために、彼はコードの実装を提供しましたが、私は自分で実装しようとしましたが、明らかに機能しています。可能であれば、誰かが私のコードを分析して、その実装の重要なポイントを教えてくれることを望みます。これは、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)))