開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Scheme (プログラミング言語)
- Gauche (処理系)
計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の2(データによる抽象の構築)、2.1(データ抽象入門)、2.1.2(抽象の壁)、問題 2.3を解いてみる。
その他参考書籍
- Instructor's Manual to Accompany Structure & Interpretation of Computer Programs
- プログラミングGauche (Kahuaプロジェクト (著), 川合 史朗 (監修), オライリージャパン)
問題 2.3
コード(BBEdit, Emacs)
sample.scm
#!/usr/bin/env gosh ;; -*- coding: utf-8 -*- ;; これまでに書いた手続き (load "./procedures.scm") ;; 平面上の長方形の表現 ;; 2点の長方形 ;; 構成子 (define (make-rectangle bottom-left top-right) (cons bottom-left top-right)) ;; 選択子 (define (bottom-left-rectangle rec) (car rec)) (define (top-right-rectangle rec) (cdr rec)) (define (width-rectangle rec) (abs (- (x-point (bottom-left-rectangle rec)) (x-point (top-right-rectangle rec))))) (define (height-rectangle rec) (abs (- (y-point (bottom-left-rectangle rec)) (y-point (top-right-rectangle rec))))) ;; 抽象の壁-------------------------------------------------------------------- (define (perimeter-rectangle rec) (* 2 (+ (width-rectangle rec) (height-rectangle rec)))) (define (area-rectangle rec) (* (width-rectangle rec) (height-rectangle rec))) ;; テスト (define rec (make-rectangle (make-point 0 0) (make-point 5 10))) (print "周囲の長さ:" (perimeter-rectangle rec)) (print "面積:" (area-rectangle rec))
入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))
gosh> (load "./sample") 周囲の長さ:30 面積:50 #t gosh>
sample.scm
#!/usr/bin/env gosh ;; -*- coding: utf-8 -*- ;; これまでに書いた手続き (load "./procedures.scm") ;; 2つの線分の長方形 (define (make-rectangle bottom-seg left-seg) (cons bottom-seg left-seg)) (define (bottom-seg-rectangle rec) (car rec)) (define (left-seg-rectangle rec) (cdr rec)) (define (width-rectangle rec) (let ((seg (bottom-seg-rectangle rec))) (abs (- (x-point (start-segment seg)) (x-point (end-segment seg)))))) (define (height-rectangle rec) (let ((seg (left-seg-rectangle rec))) (abs (- (y-point (start-segment seg)) (y-point (end-segment seg)))))) ;; 以降は前の長方形の表現と変わらず ;; 抽象の壁-------------------------------------------------------------------- (define (perimeter-rectangle rec) (* 2 (+ (width-rectangle rec) (height-rectangle rec)))) (define (area-rectangle rec) (* (width-rectangle rec) (height-rectangle rec))) ;; テスト (define rec (make-rectangle (make-segment (make-point 0 0) (make-point 5 0)) (make-segment (make-point 0 0) (make-point 0 10)))) (print "周囲の長さ:" (perimeter-rectangle rec)) (print "面積:" (area-rectangle rec))
入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))
gosh> (load "./sample") 周囲の長さ:30 面積:50 #t gosh>
0 コメント:
コメントを投稿