From: adgjmptw / super-r.net Subject: [ruby-list:45080] Re: WindowsでMySQL/Rubyを使おうとするとmysql.so (LoadError) Date: Tue, 17 Jun 2008 19:53:50 +0900 > ↓なにこの構文。 > checking_for "#{func}() in #{LIBARG%lib}" do > until r = try_func(func, libs, &b) or paths.empty? > $LIBPATH = libpath | [paths.shift] > end > (略) > end checking_forは関数(トップレベルで定義されているメソッド)で、 引数が "#{func}() in #{LIBARG%lib}" です。 func, LIBARG%libの評価結果が文字列に埋め込まれます。 で、その関数にブロックを渡しています。 > try_link(<<"SRC", libs, &b) or try_link(<<"SRC", libs, &b) > #{COMMON_HEADERS} > #{headers} > /*top*/ > int main() { return 0; } > int t() { void ((*volatile p)()); p = (void ((*)()))#{func}; return 0; } > SRC ←1 > #{headers} > /*top*/ > int main() { return 0; } > int t() { #{func}(); return 0; } > SRC ←2 (snip) > try_link(<<"SRC", libs, &b) or try_link(<<"SRC", libs, &b) > って何だ? なぜ同じ式をorで繋ぐのだろう? たて続けになったヒアドキュメントです。 見た目が同じ式だが、同じ式ではないです。 ここで「SRC」が1、2のようにふたつあることに注意してほしい。 最初の<<"SRC"はこれ、 #{COMMON_HEADERS} #{headers} /*top*/ int main() { return 0; } int t() { void ((*volatile p)()); p = (void ((*)()))#{func}; return 0; } 次の<<"SRC"がこれ #{headers} /*top*/ int main() { return 0; } int t() { #{func}(); return 0; } で、ふたつの式をorでつないでいるのは、最初のtry_linkが偽を返したときのみ、 次のtry_linkを評価するという意味です。 最初のtry_linkが真を返したら、次のtry_linkは評価しません。 > 'cl' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイ > ルとして認識されていません。 > と出力される。 > > clはコマンドラインのコンパイラだったと思ったのでcl.exeを検索してPATHに追加。 > すると今度はmspdb70.dllが無いといわれるのでこれも検索してPATHに追加。 Debian GNU/Linuxとかならビルド時に必要なライブラリを こんなコマンド一発でインストールしてくれるのだが… 「sudo apt-get build-dep libmysql-ruby」 パッケージシステムがないのはつらいもの… 依存関係を満たすために手作業でいろいろインストールしていくのは、 自分なら発狂しそうです。 -- rubikitch Blog: http://d.hatena.ne.jp/rubikitch/ Site: http://www.rubyist.net/~rubikitch/