左から削る。右から削る。

srfi-1/unfoldの使い方としておもしろいかなと思ったので紹介。

(use srfi-1)
(use gauche.experimental.lamb)

(define (truncarting-l xs)
  (unfold null? identity cdr xs))

(define (truncarting-r xs)
  (unfold null? reverse cdr (reverse xs)))

(truncarting-l '(a b c d)) ; => ((a b c d) (b c d) (c d) (d))
(truncarting-r '(a b c d)) ; => ((a b c d) (a b c) (a b) (a))

MakefileRakefileなどを親をたどりながら再帰的に探すときにつかえるかもしれない。

(define (path->candidates path)
  (map (^x (string-join x "/")) 
       (truncarting-r (string-split path  "/"))))

(path->candidates "/foo/bar/yee/yoo")
 ; => ("/foo/bar/yee/yoo" "/foo/bar/yee" "/foo/bar" "/foo" "")

こういう操作を実際に使おうとするとlazyな方が嬉しかったり。