tapは便利かも

Ruby1.9に搭載されたtapが便利そうなので、Schemeに移植してみた。

ところでtapって何よ

副作用専門メソッド。

入力 -> tap -> 出力
         V
       副作用

要するに、Linuxコマンドで言う所のtee。デバッグに便利かも。

Schemeに移植

簡単。

(define (tap f x) (f x) x)

ワンライナでオケ。

使ってみる

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で。