; string data type

(define (take n xs)
  (let loop ((n n) (xs xs) (ys '()))
    (if (or (zero? n) (null? xs))
        (reverse ys)
        (loop (- n 1) (cdr xs)
              (cons (car xs) ys)))))

(define (drop n xs)
  (let loop ((n n) (xs xs))
    (if (or (zero? n) (null? xs)) xs
      (loop (- n 1) (cdr xs)))))

(define string->str string->list)
(define str->string list->string)
(define s (string->str "Programming Praxis"))
(display s) (newline)
(display (str->string s)) (newline)

(define str-length length)
(define str-ref list-ref)
(define str-substring (case-lambda
  ((s start) (str-substring s start (+ (str-length s))))
  ((s start past) (take (- past start) (drop start s)))))
(display (str-length s)) (newline)
(display (str-ref s 8)) (newline)
(display (str-substring s 8)) (newline)
(display (str-substring s 8 13)) (newline)

(define str-concat append)
(display (str-concat
  (string->str "Programming")
  (string->str " ")
  (string->str "Praxis")))