「プログラミングGauche」読書メモ(1)

6.2 リストの基本操作

gosh> '(1 . (2 . (3 . (4 . (5 . ())))))
(1 2 3 4 5)

(1 . (2 . (3 . (4 . (5 . ()))))) と (1 2 3 4 5) は同等で、通常はドットをなるべく使わない表記をしている。
で、初心忘るべからずというか、この逆の関数を作ってみた。

(define (q-string x)
  (if (string? x)
    (string-append "\"" x "\"")
    (x->string x)))

(define (p-list ls)
  (if (null? ls)
    "()"
    (if (pair? ls)
      (string-append
         "(" (q-string (car ls)) " . " (p-list (cdr ls)) ")")
      (q-string ls))))


(print (p-list '(1 2 3 4 5))) 
;;=> (1 . (2 . (3 . (4 . (5 . ())))))

(print (p-list '(1 "abc" 3 4 . 5))) 
;;=> (1 . ("abc" . (3 . (4 . 5))))

(print (p-list '(1)))
;;=> (1 . ())
(print (p-list '(1 . ())))
;;=> (1 . ())
(print (p-list '(() . 1)))
;;=> (() . 1)
(print (p-list '(1 . 2)))
;;=> (1 . 2)