(define (mylength list)
  (if (null? list)
      0
      (+ 1 (mylength (cdr list)))))

(define (square x) (* x x))

(define (mymap fun list)
  (if (null? list)
      '()
      (cons (fun (car list))
            (mymap fun (cdr list)))))

(define (map2 proc)
  (lambda (items)
    (if (null? items)
	'()
	(cons (proc (car items))
	      ((map2 proc) (cdr items))))))

(define map3
  (lambda (proc)
    (lambda (items)
      (if (null? items)
	  '()
	  (cons (proc (car items))
		((map3 proc) (cdr items)))))))