summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--one/six.scm36
-rw-r--r--sicp.org11
2 files changed, 47 insertions, 0 deletions
diff --git a/one/six.scm b/one/six.scm
new file mode 100644
index 0000000..ab58664
--- /dev/null
+++ b/one/six.scm
@@ -0,0 +1,36 @@
+(define-module (one six)
+ #:export (sqrt-sicp sqrt-nif square good-enough? new-if improve))
+
+(define (square x)
+ (* x x))
+
+(define (good-enough? guess x)
+ (< (abs (- (square guess) x)) 0.001))
+
+(define (average x y)
+ (/ (+ x y) 2))
+
+(define (improve guess x)
+ (average guess (/ x guess)))
+
+(define (new-if predicate then-clause else-clause)
+ (cond (predicate then-clause)
+ (else else-clause)))
+
+(define (sqrt-iter guess x)
+ (if (good-enough? guess x)
+ guess
+ (sqrt-iter (improve guess x)
+ x)))
+
+(define (sqrt-iter-nif guess x)
+ (new-if (good-enough? guess x)
+ guess
+ (sqrt-iter-nif (improve guess x)
+ x)))
+
+(define (sqrt-sicp x)
+ (sqrt-iter 1.0 x))
+
+(define (sqrt-nif x)
+ (sqrt-iter-nif 1.0 x))
diff --git a/sicp.org b/sicp.org
index a349e51..0fa7a29 100644
--- a/sicp.org
+++ b/sicp.org
@@ -46,3 +46,14 @@ order*, the expression will be expanded to
#+END_SRC
and will evaluate to ~0~.
+*** 6
+ If I've understood it correctly, scheme uses applicative-order
+ evaluation, meaning, it evaluates the operands before appling the
+ procedure.
+
+ In the case when ~new-if~ used in the ~sqrt-iter~ procedure, the
+ operands/arguments for the ~new-if~ -- ~(good-enough? guess x)~,
+ ~guess~, ~(sqrt-iter (improve guess x) x)~ -- are evaluated. Due
+ to the last operand, which is a call to the ~sqrt-iter~ procedure,
+ we get into infinite loop of evaluating the ~sqrt-iter~ procedure
+ again and again.