Schemeでprintfみたいな。

Schemeでprintfみたいな処理がしたい。と思って調べたら(format)でいける。

format

覚えることは簡単。

(format "~a is ~a\n" "hoge" 10)
;"hoge is 10\n"

~aでそのまま表示。後ろに任意の引数を付ける。

感覚的にprintfみたいな感じで使える。

しかし、MzSchemeのformatでは「文字列を返す」だけなので、displayを重ねる。

(display (format "~a is ~a\n" "hoge" 10))
;hoge is 10

文字でも、数字でも~aでいける。

test-from-a-to-bを改造。

素人くさいSICP「独」書会のtest-from-a-to-bを改造する。

(define (test f a b)
  (define (iter i)
    (cond ((<= i b)
           (display (format "[~a] ~a\n" i (f i)))
           (iter (+ i 1)))))
  (iter a))

テスト。

(test (lambda (x) (* x x)) 1 5)
;[1] 1
;[2] 4
;[3] 9
;[4] 16
;[5] 25

printf風に表示出来ました。

追記

YasuyukiMiuraさんにツッコミを頂きました。

MzSchemeとGaucheでは動作が違うようです。

Gaucheだと、

(format #t "~a is ~a\n" "hoge" 10)

と、#tを付けると、printfみたいな感じにできます。

MzSchemeの場合、#tを付けるとエラーになってしまう。

ボクノスではMzSchemeとGaucheで両対応できるように、

(display (format "~a is ~a\n" "hoge" 10))

でいきたいと思います。

マニュアルへのリンク

Gaucheの方が充実してますね。