計算機プログラムの構造と解釈[第2版]
(翔泳社)
ハロルド エイブルソン (著) ジュリー サスマン (著)
ジェラルド・ジェイ サスマン (著)
Harold Abelson (原著) Julie Sussman (原著)
Gerald Jay Sussman (原著) 和田 英一 (翻訳)
開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Scheme (プログラミング言語)
- Gauche (処理系)
計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の2(データによる抽象の構築)、2.5(汎用演算のシステム)、2.5.3(例: 記号代数)、多項式の算術演算、項リストの表現、記号代数における型の階層構造、問題 2.92.を解いてみる。
その他参考書籍
- Instructor's Manual to Accompany Structure & Interpretation of Computer Programs
- プログラミングGauche (Kahuaプロジェクト (著), 川合 史朗 (監修), オライリージャパン)
問題 2.92.
コード(BBEdit, Emacs)
sample.scm
#!/usr/bin/env gosh ;; -*- coding: utf-8 -*- (define (install-polynomial-package) ;; 内部手続き ;; ;; 変数に順序をつける x y z ;; 項の表現 ;; xy^2 ((1 2 0) 1) ;; 10 ((0 0 0) 10) ;; 構成子 (define (make-term orders coeff) (list orders coeff)) ;; 選択子 (define (orders term) (car term)) (define (coeff term) (cadr term)) (define (empty-termlist? term-list) (null? term-list)) (define (first-termlist term-list) (car term-list)) (define (rest-terms term-list) (cdr term-list)) (define (the-empty-termlist) '()) (define (>-orders orders1 orders2) (define (iter orders1 orders2) (if (null? orders1) #f (let ((o1 (car orders1)) (o2 (car orders2))) (cond ((> o1 o2) #t) ((< o1 o2) #f) (else (iter (cdr orders1) (cdr orders2))))))) (iter orders1 orders2)) (define (<-orders orders1 orders2) (define (iter orders1 orders2) (if (null? orders1) #f (let ((o1 (car orders1)) (o2 (car orders2))) (cond ((< o1 o2) #t) ((> o1 o2) #f) (else (iter (cdr orders1) (cdr orders2))))))) (iter orders1 orders2)) (define (=-orders orders1 orders2) (and (not (>-orders orders1 orders2)) (not (<-orders orders1 orders2)))) (define (adjoin-term term term-list) (if (=zero? (coeff term)) term-list (cons term term-list))) (define (add-terms L1 L2) (cond ((empty-termlist? L1) L2) ((empty-termlist? L2) L1) (else (let ((t1 (first-termlist L1)) (t2 (first-termlist L2))) (let ((orders1 (orders t1)) (orders2 (orders t2))) (cond ((>-orders orders1 orders2) (adjoin-term t1 (add-terms (rest-terms L1) L2))) ((<-orders orders1 orders2) (adjoin-term t2 (adjoin-term L1 (rest-terms L2)))) (else (adjoin-term (make-term orders1 (add (coeff orders1) (coeff orders2))) (add-terms (rest-terms L1) (rest-terms L2)))))))))) (define (add-orders orders1 orders2) (if (null? orders1) '() (cons (+ (car orders1) (car orders2)) (add-orders (cdr orders1) (cdr orders2))))) (define (mul-term-by-all-terms t1 L) (if (empty-termlist? L) (the-empty-termlist) (let ((t2 (first-termlist L))) (adjoin-term (make-term (add-orders (orders t1) (orders t2)) (mul (coeff t1) (coeff t2))) (mul-term-by-all-terms t1 (rest-terms L)))))) (define (mul-terms L1 L2) (if (empty-termlist? L1) (the-empty-termlist) (add-terms (mul-term-by-all-terms (first-termlist L1) L2) (mul-term-by-all-terms (rest-terms L1) L2)))) (define (make-poly variables term-list) (cons variables term-list)) (define (variables p) (car p)) (define (term-list p) (cdr p)) (define (variable? x) (symbol? x)) (define (same-variable? x y) (and (variable? x) (variable? y) (eq? x y))) (define (same-variables? variables1 variables2) (cond ((and (null? variables1) (null? variables2)) #t) ((and (not (null? variables1)) (null? variables2)) #f) ((and (null? variables1) (not (null? variables2))) #f) (else (and (same-variable? (car variables1) (car variables2)) (same-variables? (cdr variables1) (cdr variables2)))))) (define (add-poly p1 p2) (if (same-variables? (variables p1) (variables p2)) (make-poly variables (add-terms (term-list p1) (term-list p2))) (error "Poly not in same variables -- ADD-POLY" (list p1 p2)))) (define (mul-poly p1 p2) (if (same-variables? (variables p1) (variables p2)) (make-poly variables (mul-terms (term-list p1) (term-list p2))) (error "Poly not in same var -- MUL-POLY" (list p1 p2)))) (define (mul-poly p1 p2) (make-poly variables (mul-terms (term-list p1) (term-list p2)))) ;; システムの他の部分とのインターフェース (define (tag p) (attach-tag 'polynomial p)) (put 'add '(polynomial polynomial) (lambda (p1 p2) (tag (add-poly p1 p2)))) (put 'mul '(polynomial polynomial) (lambda (p1 p2) (tag (mul-poly p1 p2)))) (put 'make 'polynomial (lambda (vars terms) (tag (make-poly vars terms)))) 'done) (define (make-polynomial vars terms) ((get 'make 'polynomial) vars terms))
入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))
$ ./sample.scm $
0 コメント:
コメントを投稿