2015年1月23日金曜日

開発環境

計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の1(手続きによる抽象の構築)、1.1(プログラムの要素)、1.1.7(例: Newton法による平方根)、問題 1.6.を解いてみる。

その他参考書籍

問題 1.6.

問題のnew-if手続きを使うと被演算子を評価する必要があるので、部分式(sqrt-iter (improve guess x) x)の評価で循環、無限ループになる。

コード(BBEdit, Emacs)

sample6.scm

#!/usr/bin/env gosh
;; -*- coding: utf-8 -*-

(define square (lambda (x) (* x x)))

(define (improve guess x)
  (average guess (/ x guess)))

(define average (lambda (x y) (/ (+ x y) 2)))

(define (good-enough? guess x)
  (< (abs (- (square guess) x)) 0.001))

(define (new-if predicate then-clause else-clause)
  (cond (prediate then-clause)
        (else else)))

(define (sqrt-iter guess x)
  (new-if (good-enough? guess x)
          guess
          (sqrt-iter (improve guess x)
                     x)))

(print (sqrt-iter 1.0 2))

入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))

$ time ./sample6.scm
  C-c C-cgosh: "unhandled-signal-error": unhandled signal 2 (SIGINT)

real 0m5.547s
user 0m4.228s
sys 0m0.454s
$

0 コメント:

コメントを投稿