From 713c619db852253edb7e61aff35a9bc30b98d579 Mon Sep 17 00:00:00 2001 From: Hash Date: Mon, 15 Oct 2012 01:38:42 +0900 Subject: [PATCH] q4.5 -- extended cond => --- q4.4.scm | 2 +- q4.5.scm | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 q4.5.scm diff --git a/q4.4.scm b/q4.4.scm index ff552e1..a0af0ed 100644 --- a/q4.4.scm +++ b/q4.4.scm @@ -44,7 +44,7 @@ ;;... ) -;; コレの親玉であるexpand-clauses は何やってるのか. clause = "節". +;; コレの親玉であるexpand-clauses はcondの評価にのみ使われている. clause = "節". ;; ここでは生true/falseではなくevalされる表現として'true/'falseを返してる. (define (expand-and-clauses clauses) (if (null? clauses) diff --git a/q4.5.scm b/q4.5.scm new file mode 100644 index 0000000..739e97c --- /dev/null +++ b/q4.5.scm @@ -0,0 +1,28 @@ +;; 裏condを実装せよ. +;; ( => ) +;; が真の値に評価されると>が評価される. + +;; 例 +(cond ((assoc 'b '((a 1) (b 2))) => cadr) + (else #f)) + +;; expand-clausesはcondの評価にのみ使われている. +;; clausesには, (cond のみが除かれた条件と式のペアリストがずらずらと渡ってくる. +;; expand-clauses内, make-ifに渡す引数を変えるため, cond-actionsを調整/拡張する. + +;; 元 +;(define (cond-actions clause) (cdr clause)) + +;; => 形式かどうかを判定する +(define (extended-cond? clause) + (if (cond-else-clause? clause) + #f + (eq? (cadr clause) '=>))) + +;; => 形式の時は順序をいじって返せばよい +(define (cond-actions clause) + (if (extended-cond? clause) + (list (caddr clause) (car clause)) + (cdr clause))) + +