Exercise 1.15
************************************************************
1. (duple n x)
(define duple
  (lambda (n x)
    (if (= n 0) '()
	(cons x (duple (- n 1) x)))))
(display (duple 2 3))
(newline)
(display (duple 4 '(ho ho)))
(newline)
(display (duple 0 '(blah)))
(newline)
************************************************************
2. (invert lst)
(define invert
  (lambda (lst)
    (if (null? lst) '()
	(cons (list (cadar lst) (caar lst)) (invert (cdr lst))))))
(display (invert '((a 1) (a 2) (b 1) (b 2))))
(newline)

;; another solution

(define invert
  (lambda (lst)
    (map reverse lst)))
(display (invert '((a 1) (a 2) (b 1) (b 2))))
(newline)

************************************************************
3. (filter-in pred lst)
(define filter-in
  (lambda (pred lst)
    (if (null? lst) '()
	(if (pred (car lst)) (cons (car lst) (filter-in pred (cdr lst)))
	    (filter-in pred (cdr lst))))))
(display (filter-in number? '(a 2 (1 3) b 7)))
(newline)
(display (filter-in symbol? '(a (b c) 17 foo)))
(newline)

************************************************************
4. (every? pred lst)
(define every?
  (lambda (pred lst)
    (if (null? lst) #t
	(if (pred (car lst)) (every? pred (cdr lst))
	    #f))))
(display (every? number? '(a b c 3 e)))
(newline)
(display (every? number? '(1 2 3 5 4)))
(newline)

************************************************************
5. (exists? pred lst)
(define exists?
  (lambda (pred lst)
    (if (null? lst) #f
	(if (pred (car lst)) #t
	    (exists? pred (cdr lst))))))
(display (exists? number? '(a b c 3 e)))
(newline)
(display (exists? number? '(a b c d e)))
(newline)

************************************************************
6. (vector-index pred v)
(define vector-index
  (lambda (pred v)
    (let loop ((i 0))
      (if (> i (vector-length v)) #f
	  (if (pred (vector-ref v i)) i
	      (loop (+ i 1)))))))
(display (vector-index (lambda (x) (eqv? x 'c)) '#(a b c d)))
(newline)

************************************************************
7. (list-set lst n x)
(define list-set
  (lambda (lst n x)
    (if (= n 0) (cons x (cdr lst))
	(cons (car lst) (list-set (cdr lst) (- n 1) x)))))
(display (list-set '(a b c d) 2 '(1 2)))
(newline)
(display (list-ref (list-set '(a b c d) 3 '(1 5 10)) 3))
(newline)

************************************************************
8. (product los1 los2)
(define product-aux
  (lambda (o lst)
    (if (null? lst) '()
	(cons (list o (car lst)) (product-aux o (cdr lst))))))
(define product
  (lambda (los1 los2)
    (if (null? los1) '()
	(append (product-aux (car los1) los2)
		(product (cdr los1) los2)))))
(display (product-aux 'a '(1 2 3)))
(newline)
(display (product '(a b c) '(x y)))
(newline)


;; another solution

(define product
  (lambda (los1 los2)
    (if (null? los1) '()
	(if (null? los2) '()
	    (cons (list (car los1) (car los2))
		  (append (product (list (car los1)) (cdr los2))
			  (product (cdr los1) los2)))))))
(display (product '(a b c) '(x y)))
(newline)

************************************************************
9. (down lst)
(define down
  (lambda (lst)
    (if (null? lst) '()
	(cons (list (car lst)) (down (cdr lst))))))
(display (down '(1 2 3)))
(newline)
(display (down '((a) (fine) (idea))))
(newline)
(display (down '(a (more (complicated)) object)))
(newline)

************************************************************
10. (vector-append-list v lst)
(define vector-append-list
  (lambda (v lst)
    (list->vector (append (vector->list v) lst))))
(display (vector-append-list '#(1 2 3) '(4 5)))
(newline)


;; stupid solution
(define vector-append-list
  (lambda (v lst)
    (if (null? lst)
	v
	(begin
	  (define v2 (make-vector (+ 1 (vector-length v))))
	  (let loop ((i (vector-length v)))
	    (if (>= i 0)
		(begin
		  (vector-set! v2 i (vector-ref v i))
		  (- i 1)
		  )
	    

************************************************************
