tapは便利かも
Ruby1.9に搭載されたtapが便利そうなので、Schemeに移植してみた。
使ってみる
1から10までのリストを二乗する。
(define (p x) (display x) (newline)) (define (square x) (* x x))
結果がナカナカいい。
(map square (tap p (iota 10 1))) ; (1 2 3 4 5 6 7 8 9 10) ; (1 4 9 16 25 36 49 64 81 100)
途中にtapを挟んでおけば、任意の箇所にprintfデバッグを仕掛けられる。
set!しながら二乗。
(define a 'dummy) (* (tap (lambda (x) (set! a x)) 10) a) ; 100
aは後ろに無いと動作がオカシイ。
式の途中にset!を仕掛けるのは案外危険だと気づく。
tap改
どうせprintfデバッグしかしないんだから、
(define (p x) (display x) (newline) x) (map square (p (iota 10 1))) ; (1 2 3 4 5 6 7 8 9 10) ; (1 4 9 16 25 36 49 64 81 100)
pでいいよpで。