トップ «前の日記(2007-11-08) 最新 次の日記(2007-11-11)» 編集

Route 477



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)

ご参考までに。

本日のツッコミ(全2件) [ツッコミを入れる]
komuro(hogelog) (2007-11-09 22:41)

> 1人doukaku.org<br>これはやりながら思ってました。doukaku.orgを探ったら題意すら同じのありそうだなと。<br><br>Schemeのnamed letは選択肢にはありましたけど、なんか苦手意識で避けてしまいました。<br>他の指摘については、知らなかったようなことばかりで非常にありがたいです。特にGaucheのfile->stringと、(コメントでも教えてくれた方いましたが)RubyのARGFが。こういうのあると、ものぐさな自分はとても嬉しくなれます。

yhara (2007-11-12 02:51)

お役に立てたようで幸いです。<br>Gaucheは、実は便利なライブラリが山ほど添付されてるので、暇な時にでも眺めてみると面白いかも知れません。