Thu, 03 Aug 2006

Bookmark

(メモ)可変個数の引数を持つマクロを定義する時には、「##」をつけておくと引数なしの 時にも対処できていいよっていう話:

#define eprintf(format, args...)  fprintf (stderr, format , ## args)
gccの拡張機能

Sat, 28 Jan 2006

Cのワンライナー

C言語のワンライナー"C(らーじしー)"をpythonで実装してみた。

この"C"はすっごい便利で、ちょっとした関数動作をテストしたいときにこれまでは わざわざファイルの名前を考えて、エディタを起動して、コマンドラインでコンパイル オプション指定してとかやってたのをコマンドラインで指定してやるだけで実行 できてしまう!

> C -e "int i; for(i=0;i<3;i++)printf(\"hoge - %d\n\",i)"
hoge - 0
hoge - 1
hoge - 2

一体どうやって実現してるんだろうと思ってversion 0.03のPerl版のソースを見てみた。 Perlほとんど知らないのでぱっとみるだけだと良くわからなかったので、Pythonに 置き換えてみた。

わかってみると予想以上に単純で(失礼)、一言で言うなら、

  • コマンドラインから入力されたCの実行文をファイルに落とす
  • コンパイルする
  • できた実行ファイルを実行する

ただそれだけだ。でも便利だし、Kazuhoさんも書いているようにネタを真剣に やるってのが格好いいからいいのです。

なので、エラー処理とかはまぁもひとつですがPython版も結構真剣に作ってみました。 pyC です。最初、Cのpython版なのでCpyにしようかと思ったけどなんだか コピーコマンドみたいなのでpyCにしてみました。

Perl使いじゃないのでPerl関連の本で持ってるのは、むかーしWalWikiをいじりたかった ときに買った本Perl/CGIの本くらいです。当時は知らなかったけど弾さんの本でした。

達人に学ぶPerl/CGI道場

ASIN: 4844317423


で、その本を引っ張り出してきて、 "@"がつくと配列なんだーとか、 配列の前に "\"がついてるけどなんだ?とか"@_"って突然出てきたけどなんだろう?とか、 そんなレベルから見始めたのでちょっと時間掛かったけど一応同じような動作を するようになりました。

で、もひとつ良くわからないのがこれ。"=~"と"tr"の組み合わせで個数を数えるもの らしいので、多分includesとsrc_textの行数を数えてるものだと思ったけどあってる かな?で、さらにそれに6を足してるんだけどこれは一体なんだろう? コードの総行数か?っていうのとその下にあるpragmaがなんのために入れてるのかが よくわからなかった。くらいかな。弾さんみたいに誰か添削とかしてくれないかな。

my $at = (($includes . $src_text) =~ tr/\n/\n/) + 6;
@line_pragma = ("# 1 \"$file\" 1",
                "# $at \"$src_file\" 2");

ということで、一応動くようになったので公開してみます。 ライセンスとかまずいようでしたら指摘していただけるとありがたいです。

あー楽しかった。


perl知らないなら、version 0.04のC言語版見たらいいじゃんっていう話もありますが 仕事以外でC言語を見たくなかったという理由なのは内緒です。


2006/01/30追記

ライセンス表記を修正しました。