gaucheにnilがない。( '() で代用)
(define (make-center-width c w)
(make-interval (- c w) (+ c w)))
(define (center i)
(/ (+ (lower-bound i) (upper-bound i)) 2))
(define (width i)
(/ (- (upper-bound i) (lower-bound i)) 2))
(define (upper-bound i) (cdr i))
(define (lower-bound i) (car i))
(define (make-interval l u) (cons l u))
(define (mul-interval x y)
(define (condition z do1 do2 do3)
(cond ((and (< (lower-bound z) 0) (< (upper-bound z) 0)) do1)
((< (lower-bound z) 0) do2)
(else do3)))
(let ((p1 (* (lower-bound x) (lower-bound y)))
(p2 (* (lower-bound x) (upper-bound y)))
(p3 (* (upper-bound x) (lower-bound y)))
(p4 (* (upper-bound x) (upper-bound y))))
(condition x
(condition y
(make-interval p4 p1)
(make-interval p2 p1)
(make-interval p2 p3))
(condition y
(make-interval p3 p1)
(make-interval (min p2 p3) (max p1 p4))
(make-interval p2 p4))
(condition y
(make-interval p3 p2)
(make-interval p3 p4)
(make-interval p1 p4)))))
(define (div-interval x y)
(mul-interval x
(make-interval (/ 1.0 (upper-bound y))
(/ 1.0 (lower-bound y)))))
(define (add-interval x y)
(make-interval (+ (lower-bound x) (lower-bound y))
(+ (upper-bound x) (upper-bound y))))
(define (make-center-persent c percent)
(let ((pe (/ percent 100.0)))
(if (> c 0)
(cons (* c (- 1.0 pe)) (* c (+ 1.0 pe)))
(cons (* c (+ 1.0 pe)) (* c (- 1.0 pe))))))
(define (percent interval)
(abs (* 100.0 (/ (- (cdr interval ) (car interval))
(+ (cdr interval ) (car interval))))))
(define (percent2 interval)
(* (/ (width interval) (center interval)) 100.0))
(define (make-center-persent2 c per)
(make-center-width c (* c (/ per 100.0))))
(define (part1 r1 r2)
(div-interval (mul-interval r1 r2)
(add-interval r1 r2)))
(define (part2 r1 r2)
(let ((one (make-interval 1 1)))
(div-interval one
(add-interval (div-interval one r1)
(div-interval one r2)))))
(define (check-same r1 r2)
(let ((p1 (part1 r1 r2))
(p2 (part2 r1 r2)))
(if (and (= (car p1) (car p2))
(= (cdr p1) (cdr p2)))
"same"
"different")))
(define mcp make-center-persent2)
(define (check ac aw bc bw)
(define orig (/ (* ac bc) (+ ac bc)))
(let ((p1 (part1 (mcp ac aw) (mcp bc bw)))
(p2 (part2 (mcp ac aw) (mcp bc bw))))
(define (diff-orig car-or-cdr p)
(abs (- orig (car-or-cdr p))))
(define (test car-or-cdr)
(if (< (diff-orig car-or-cdr p1) (diff-orig car-or-cdr p2))
"part1"
"part2"))
(display (test car))
(newline)
(display (test cdr))))
(cons 1 (cons 2 (cons 3 (cons 4 'nil))))
(define one-through-four (list 1 2 3 4))
(define (list-ref items n)
(if (= n 0)
(car items)
(list-ref (cdr items) (- n 1))))
(define (length items)
(if (null? items)
0
(+ 1 (length (cdr items)))))
(define (length2 items)
(define (length-iter a count)
(if (null? a)
count
(length-iter (cdr a) (+ count 1))))
(length-iter items 0))
(define (append list list2)
(if (null? list1)
list2
(cons (car list1) (append (cdr list1) (list2)))))
(define (lastpair lst)
(let ((next (cdr lst)))
(if (null? next)
lst
(lastpair next))))
(define (reverse lst)
(if (null? (cdr lst))
(car lst)
(cons (reverse (cdr lst)) (cons (car lst) '()))))
(define (reverse2 lst)
(define (iter lst tmps)
(if (null? lst)
tmps
(iter (cdr lst) (cons (car lst) tmps))))
(iter lst '()))
(define us-coins (list 50 25 10 5 1))
(define uk-coins (list 100 50 20 10 5 2 1 0.5))
(define (cc amount coin-values)
(cond ((= amount 0) 1)
((or (< amount 0) (no-more? coin-values)) 0)
(else
(+ (cc amount (except-first-denomination coin-values))
(cc (- amount (first-denomination coin-values)) coin-values)))))
(define (first-denomination coin-values)
(car coin-values))
(define (except-first-denomination coin-values)
(cdr coin-values))
(define (no-more? coin-values)
(null? coin-values))
(define (same-parity x . y)
(define (push? n)
(= (remainder (- n x) 2) 0))
(define (f lst)
(let ((this (car lst)))
(if (null? (cdr lst))
(if (push? this)
(cons this '())
'())
(if (push? this)
(cons this (f (cdr lst)))
(f (cdr lst))))))
(cons x (f y)))