(編集:TCOについてはまだ心配しません)
私は(ついに)Lispを学んでいます。リストをフラット化するために、独自の(ナイーブっぽい)関数を作成しようとしています。私はより単純なケースから始めて、それが機能しない場合はより複雑なケースを処理するためにそれを構築します。残念ながら、現在、無限ループが発生しており、その理由を完全に理解することはできません。
また、lispでのデバッグ方法の使い方もわからないので、その方向に向けていただければ幸いです。
(defun flattenizer (lst)
(if (listp (car lst))
(flattenizer (car lst))
(if (null lst)
nil
(cons (car lst) (flattenizer (cdr lst))))))
最終コード:
(defun flattenizer (lst)
(cond
((null lst) nil)
( (consp (car lst))
(nconc (flattenizer (car lst)) (flattenizer (cdr lst)) ))
(T (cons (car lst) (flattenizer (cdr lst))))))
テスト:
* (flattenizer '((1 2) (3 4)))
(1 2 3 4)
* (flattenizer '(1 (2 3) (4 5)))
(1 2 3 4 5)
* (flattenizer '((1 2) 3 (4 5) 6))
(1 2 3 4 5 6)
* (flattenizer '(1 2 3 4))
(1 2 3 4)