Permalink
Browse files

q4.5 -- extended cond =>

  • Loading branch information...
1 parent fab9a80 commit 713c619db852253edb7e61aff35a9bc30b98d579 @thash committed Oct 14, 2012
Showing with 29 additions and 1 deletion.
  1. +1 −1 q4.4.scm
  2. +28 −0 q4.5.scm
View
@@ -44,7 +44,7 @@
;;...
)
-;; コレの親玉であるexpand-clauses は何やってるのか. clause = "節".
+;; コレの親玉であるexpand-clauses はcondの評価にのみ使われている. clause = "節".
;; ここでは生true/falseではなくevalされる表現として'true/'falseを返してる.
(define (expand-and-clauses clauses)
(if (null? clauses)
View
@@ -0,0 +1,28 @@
+;; 裏condを実装せよ.
+;; (<test> => <recipient>)
+;; <test>が真の値に評価されると<recipient>>が評価される.
+
+;; 例
+(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)))
+
+

0 comments on commit 713c619

Please sign in to comment.