どう書く?org 指定されたフォルダ以下のゴミ掃除 を commonlispで

どう書く.orgのお題をやってみる。
まずは「指定されたフォルダ以下のゴミ掃除」なんだけど、いきなりディレクトリの一覧のしかたがわからん。
調べる・・・。
directoryでとれるみたい。

・・・pathnameの使いかたがよくわからんぞ。
googleに聞いてみてもあんまり使い方書いてない。困った。

ディレクトリをあれこれするときはcl-fadを使うのが一般的?みたい。
しかしpathname使いにくいな。つかいにくいぞ。

結局fadは使わないことにした。でも中のロジックは参考にさせてもらった。
結構時間かかったなぁ。やっぱり文法よりもライブラリ(っていうのか?)の使いかた調べるのに時間がかかるね。
試行錯誤の後もそのまま載せておく。
こんな感じ。

;;指定されたフォルダ以下のゴミ掃除

(defun cleanup-dir (path)
  (let ((targets (get-directory-and-files (pathname path))))
    (if (null targets)
        nil
      (mapc #'(lambda (target)
              (let ((name (or (pathname-type target)
                      (pathname-name target))))
            (cond ((null name)
                   (print (concatenate 'string name " is dir")))
                  ((char= #\~ (char name (1- (length name))))
                   (print (concatenate 'string name " delete"))
                   (delete-file target)))))
        targets))))
        

(defun get-directory-and-files(path)
  (concatenate 'list 
           (directory (merge-pathnames path "*"))
           (directory (merge-pathnames path "*.*"))))
    
           
  
;;   (print (concatenate 'string "search delete files " path))
;;   (setf names (directory (concatenate 'string path "*")))
;;   (print names)
;;   (mapcar #'(lambda (target)
;;           (let ((name (or 
;;                (pathname-type target) 
;;                (pathname-name target))))
;;         (print (concatenate 'string "check file " name))
;;         (cond ((null name)
;;                (cleanup-dir (namestring target)))
;;               ((char= #\~ (char name (1- (length name))))
;;                (print (concatenate 'string "delete " name))
;;                (delete-file target)))))
;;           ;;(print target)
;;           ;;(print (pathname-type target))
;;           ;;(print (pathname-name target))
;; ;;           (let ((name (or (pathname-type target)
;; ;;                   (pathname-name target)))
;; ;;             (print name))))
;; ;;            (if (char= #\' (char target (1- (length target))))
;; ;;            (print p)))))
;;       names))