なんか大学のプログラミングの授業の最中なんですけど

「入力された各行の先頭の単語を抜き出す」のScheme版を書いてみた。each-line-head-word procedureがそれ。stringを渡すとstringのlistが戻ってくる。Schemeだと多値が返せるらしいんだが、まだVery little schemerな自分にはよくわからない。

(define (split-string spliter string)
  (let ((ls (string->list string)))
    (let loop((ret '()) (curret '()) (ls ls))
      (if (null? ls)
	  (reverse (cons (list->string (reverse curret)) ret))
	  (let ((curchar (car ls)) (rest (cdr ls)))
	    (if (if (char? spliter) (eq? spliter curchar) (spliter curchar))
		(if (null? curret)
		    (loop ret '() rest)
		    (loop (cons (list->string (reverse curret)) ret) '() rest))
		(loop ret (cons curchar curret) rest)))))))

(define (head ls) (if (pair? ls) (car ls) #f))

(define (each-line-head-word str)
  (map head
       (map (lambda (string)
	      (split-string
	       (lambda (x) (char-whitespace? x))
	       string))
	    (split-string #?newline
			  str))))