summaryrefslogtreecommitdiffstats
path: root/net/ricketyspace/sicp/one/fifteen.scm
diff options
context:
space:
mode:
authorrsiddharth <s@ricketyspace.net>2017-01-14 21:44:28 +0000
committerrsiddharth <s@ricketyspace.net>2017-01-14 21:44:28 +0000
commit19ed602c1ba7dc2b933274f50085c9c4f0f1105c (patch)
tree5f4ddb70cb61cf509d6a74bbfa4ccde0c9227fc5 /net/ricketyspace/sicp/one/fifteen.scm
parent8d6bb0aee4679f874ddfb6f7edd8945852cb9c99 (diff)
one -> net/ricketyspace/sicp
Diffstat (limited to 'net/ricketyspace/sicp/one/fifteen.scm')
-rw-r--r--net/ricketyspace/sicp/one/fifteen.scm31
1 files changed, 31 insertions, 0 deletions
diff --git a/net/ricketyspace/sicp/one/fifteen.scm b/net/ricketyspace/sicp/one/fifteen.scm
new file mode 100644
index 0000000..a61fa8f
--- /dev/null
+++ b/net/ricketyspace/sicp/one/fifteen.scm
@@ -0,0 +1,31 @@
+;;;; Under Creative Commons Attribution-ShareAlike 4.0
+;;;; International. See
+;;;; <https://creativecommons.org/licenses/by-sa/4.0/>.
+
+(define-module (net ricketyspace sicp 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 3.0)))))
+ (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)
+;; $25 = "(p (sine 4.05 (p (sine 1.3499999999999999 (p (sine 0.44999999999999996 (p (sine 0.15 (p (sine 0.049999999999999996))))))))))"