2007-11-09
■ [prog] Re:いろんな言語で簡単なプログラムを書いてみるテスト(1)
こういう練習って面白いですよね。1人doukaku.orgというか。
Rubyのcatメソッドは、File#openを使うと(ファイルの閉じ忘れを防げるので)良いかもしれません。
def cat(name) File.open(name, "r"){|file| while(c=file.getc) putc c end } end
ちなみに全体を読み出すだけなら File.read を使うのが便利です。
def cat(name) print File.read("name") end
さらに題意を考えると、実はARGFを使うのが一番短くなりますw
print ARGF.read
Scheme版は letrec の代わりに named let(名前付きのlet)を使うとより簡潔に書けます。 また、リストの全ての要素に対して繰り返すような処理は for-each を使うのが簡単です。 (あとcondをifとbeginで置き換えてみましたが、これは好き好きかなぁ。)
(define (cat input) (let loop ((c (read-char input))) (if (eof-object? c) 0 (begin (write-char c) (loop (read-char input)))))) (define (main args) (for-each (lambda (arg) (call-with-input-file arg cat)) (cdr args)) 0)
ちなみに、処理系をGaucheに限れば、file->stringを使うのが最も簡単です。
(use file.util) (define (cat name) (display (file->string name))) (define (main args) (for-each cat (cdr args)) 0)
ご参考までに。
> 1人doukaku.org<br>これはやりながら思ってました。doukaku.orgを探ったら題意すら同じのありそうだなと。<br><br>Schemeのnamed letは選択肢にはありましたけど、なんか苦手意識で避けてしまいました。<br>他の指摘については、知らなかったようなことばかりで非常にありがたいです。特にGaucheのfile->stringと、(コメントでも教えてくれた方いましたが)RubyのARGFが。こういうのあると、ものぐさな自分はとても嬉しくなれます。
お役に立てたようで幸いです。<br>Gaucheは、実は便利なライブラリが山ほど添付されてるので、暇な時にでも眺めてみると面白いかも知れません。