(Hat tip to Ethan Chen who found an error in a prior solution; it has been fixed here.)
(define PI 3.14159265357989)
(define (accumulate op id term a next b)
(cond ((> a b) id)
(else (op (term a) (accumulate op id term (next a) next b)))))
(define (fact n)
(cond ((< n 2) 1)
(else (* n (fact (- n 1))))))
Note the use of sign to make a term positive or negative.
(define (sine-term theta n)
(let ((sign (if (even? n) - +)))
(sign (/ (expt theta (- (* 2 n) 1))
(fact (- (* 2 n) 1))))))
A natural question is, how do we call sine-term, which takes two inputs, when we are dealing with accumulate, whose term parameter takes only one? The answer is that one of the two inputs to sine-term is x, which has scope in the sine function. So we can use a lambda to read in the values of a in accumulate and call sine-term with x and the lambda's input (in this case, n).
Since we need 200 terms, we pass 200 into b in accumulate.
(define (sine theta)
(accumulate +
0
(lambda (n) (sine-term theta n))
1
(lambda (n) (+ n 1))
200))