Maraigue風。

Maraigue(H. Hiro)のブログ

[プログラミング][Python] 簡易文法チェッカー

2008年04月23日 18時27分36秒 | プログラミング
事の発端は、Twitterでのこの発言。



maraigue: PerlやRubyはruby -e "script"でスクリプト実行できるけど、Pythonはshとかと同じでpython -c "script"なのね。
http://twitter.com/maraigue/statuses/794964644

gan2: @maraigue Perl や Ruby の -c は Python では何になってるのか気になる
http://twitter.com/gan2/statuses/794965707



PerlやRubyでは、コマンドラインで「ruby -c myscript.rb」のように入力することで、スクリプトの文法のチェックのみを行うことができる。

ところがPythonでは、そのような機能はpythonインタプリタには無いようなのである(文法チェック用の外部ツールは存在する)。

そこで簡易的な文法チェックスクリプトを作ってみた。
以下のシェルスクリプトを適当な名前のファイル(例えば pysyntax)に保存し、実行権限を与える。(※全角の円記号は半角に直して下さい)

#!/bin/sh
( echo "import sys¥nsys.exit()"; cat $1 ) | python -

その上で、シェル上で

$ ./pysyntax myscript.py

のように入力すると、文法に問題がなければ何も表示されず、文法に問題があればそのエラーが表示される。
なお、引数に与えるスクリプトがカレントディレクトリにない場合、ひょっとしたら上手くいかないかもしれません。


仕組みはいたって簡単で、引数に与えたファイルの先頭に

import sys
sys.exit()

の2行を付け加えたうえで、pythonインタプリタに実行させているのである。sys.exit()以下は実行はされないが、スクリプトの解析の対象にはなるため、そこで文法エラーがあればpythonインタプリタがエラーメッセージを出してくれる、という仕組みである。

[C][C++][スイーツ(笑)][これはひどい]C/C++のポインタの解説

2008年03月31日 15時19分23秒 | プログラミング
男は沖林だった。連れていかれてポインタ変数宣言された。「キャーやめて!」値代入をキメた。
「int *n」!「*n = 5」!プロセスは死んだ。セグフォ(笑)
C/C++のポインタの機能--参照渡しのような処理 - ZDNet Japan


いや、1~2行目の書き出しを書きたかっただけなのですがw


まあこの筆者、まずはCで連結リストでも書いてみるべきかと思います。
というかZDNetもなぜこのような記事を通してしまったのかのかという気がします。CやC++でポインタを使うアルゴリズムを書いたことがある人なら、すぐ気づくような気がしますが…。

CとしてもRubyとしても使えるプログラム

2008年03月14日 19時36分54秒 | プログラミング
どこかの誰かが「CとしてもRubyとしても使えるプログラム」を書いていたのですが、誰が書いた記事なのか完全に失念。del.icio.usにも何故か保存していなかった。

悔しいのでまずは自分で書いてみた。「//;」が結構ミソ。

#include <stdio.h>
#define def int
#define end
#define BRACE {
//; BRACE = nil
def main(void)
//; h = lambda{
BRACE
printf("Hello World!!n");
}
//; h.call
end
//; main(nil)

[3/17追記]もっと簡単に書けることに気づく。
#include <stdio.h>
#define def int
#define BRACE {
#define end }
//; BRACE = nil

def main(void)
BRACE
printf("Hello World!!\n");
end

//; main(nil)

Rubyでマルチセット(多重集合)

2008年02月09日 22時35分57秒 | プログラミング
Rubyでマルチセット(多重集合)を扱うライブラリがどうやらない模様なので、自分で書いてみました。
http://f52.aaa.livedoor.jp/~maraigue/multiset/
http://maraigue.hhiro.net/multiset/

普通「集合」といえば、「1つの集合に同一の要素は1つまでしか含まれない」とするのですが、場合によっては同一の要素を複数格納した方が便利な場合もあります。これをデータ構造として表現したのがマルチセットなのです。

どの程度需要があるかは分かりませんが、よろしければご利用下さい。ちなみにBSDライセンスです。

【追記】(2012.9.1)
リンク切れを修正しました。

WindowsでTwitter4Rが動かない

2008年02月06日 23時00分35秒 | プログラミング
Twitterでいろんなことをするプログラムを書こうとRubyのTwitter用ライブラリ「Twitter4R」を入れてみたのだが、Windowsでこのコードを動かそうとすると、json/common.rbの中でSegmentation faultが発生する。

require('rubygems')
require('twitter')

client = Twitter::Client.new # ここは成功する
client.timeline_for(:friend, :id => 'maraigue') do |status|
  puts status.user.screen_name, status.text
end


状況は以下の通り。
* Windows Vista Home Basic
* Ruby 1.8.6
* json(1.1.0 mswin32)、twitter4r(0.3.0)はrubygemsでインストールした

しかもLinux(Ubuntu 7.1.0, jsonはソースからインストール)で動くと来たから解決策が思いつかない。

jsonのバイナリのバグのような気がするが、Windowsでソースからインストールしようにも、VC6がないのでインストールできない。

どうしましょう?


[2008/02/07追記]
解決しました。お騒がせしてすみません。

●JSONは手動でインストールする場合、バイナリでなくpure_ruby実装でもインストールできる
●gemでインストールする場合でもJSONのpure_ruby実装をインストールできるが、その場合についてはバイナリのJSONと別物とみなされ、(gemでインストールした)Twitter4Rを動かすことはできない

以上のことから、解決策は至って単純、Twitter4RもJSONも手動でインストールするというものでした。本当にすみません。