非真正リストを真正リストに変換する


Tags: R6RS, リスト

最後の cdr が '() でないリストを普通の(真正)リスト((proper) list)と区別して非真正リスト(improper list)と呼ぶ。

(import (rnrs))

(define (improper-list->proper-list xs)
  (let loop ((ys xs) (rs '()))
    (cond
     ((pair? ys)
      (loop (cdr ys) (cons (car ys) rs)))
     ((null? ys)
      (assertion-violation 'improper-list->proper-list
                           "improper list required, but got proper list"
                           xs))
     (else
      (reverse (cons ys rs))))))