タグ : Gauche

[Scheme/Gauche] 結果を捨てる?

タイトルそのまま

timeで時間を計るときとか、「関数を実行するだけで、返り値は表示したくない」みたいなことが結構ある。#自分だけ?

timeで再起関数、たとえば1000の階乗を求める(factorial 1000)の計算時間を計るときとか、普通に
(time (factorial 1000))
とかするとtimeの出力結果が、(factorial 1000)結果に流されてしまう。 #emacsのscheme-modeです。

で、Scheme歴1ヶ月の自分にはまわりに聞ける人もいなく、「結果をすてるメジャーな方法」みたいにググッてもHITしないので、ちょっと考えてみた。

色々考えられる

局所変数に閉じ込める

最初に思いついたのがこれ。

;;捨て局所変数
(time (let ((ignored-result (factorial 10000)))))

構文(の副産物?)を使う

;;結果を捨てる構文を仕様(begin,cond,for-each...)
(begin (factorial 10000) #f)
(cond (#t (factorial 10000)  #f))
(for-each factorial '(10000))

for-eachとかだと、for-eachの返り値#<undef>が返される。
(display “hoge”)とかすると、
gosh> hoge#<undef>
ちょっとイラっとくるけど、この#<undef>って何だ?と思って調べてみた。

GaucheクックブックさんによるとGaucheにおける未定義値の代表値とのこと。#<undef>は#fとも#tとも異なる。

(if (display "#<undef> is not false?: ") "yes" "no")
(if (equal? (display "#<undef> equal #t?: ") #t) "yes" "no")

/dev/null

:-)

;;UNIX的なアレ;-)
(display (factorial 10000) (open-output-file "/dev/null"))

結論

色々考えたけど、メジャー(or trivial)な方法は? #わからん。
とりあえず、beginを利用するのがスマートなのかな。好きな値を返すようにできるし。

 
Better Tag Cloud