summaryrefslogblamecommitdiffstats
path: root/one/fifteen.scm
blob: 1b2ac246073d42641fb6bda16394d5f5d60ca941 (plain) (tree)






























                                                                                                                        
;;;; Under Creative Commons Attribution-ShareAlike 4.0
;;;; International. See
;;;; <https://creativecommons.org/licenses/by-sa/4.0/>.

(define-module (one fifteen)
  #:use-module (ice-9 regex)
  #:export (sine))

(define (sine angle)
  (let ((out ""))
    (define (log angle)
      (set! out (string-append out " (p (sine "
                               (number->string angle))))
    (define (close-parens s)
      (string-trim (string-append
                    s (fold-matches "\\([p,s]" s ""
                                    (lambda (match prev)
                                      (string-append prev ")"))))))
    (define (cube x) (* x x x))
    (define (p x) (- (* 3 x) (* 4 (cube x))))
    (define (s angle)
      (if (not (> (abs angle) 0.1))
          angle
          (begin
            (log angle)
            (p (s (/ angle 3.0))))))
    (s angle)
    (close-parens out)))
;;
;; (sine 12.15)
;; $24 = "(p (sine 12.15 (p (sine 4.05 (p (sine 1.3499999999999999 (p (sine 0.44999999999999996 (p (sine 0.15))))))))))"