たけ(tk)です。

[ruby-list:38712] のサンプル
================================================================
require "dl/import"

module Win32
  extend DL::Importable
  dlload "kernel32.dll"
  extern "void SetLastError(DWORD)"
  extern "DWORD GetLastError()"
end #/Win32

Win32.setLastError(1234)
p Win32.getLastError #=>0
================================================================

を見て違和感を感じたのですが、DL::Importable は元の名前が「GetLastError」
のときに「getLastError」という奇妙な名前に変換するようです。美しくないで
す。

なぜ、get_last_error というような名前に変換しないのでしょうか?

ApolloにはRuby流の名前に変換する関数があって、それで変換しています。

Rubyでも適切な名前に自動的に変換する関数を用意しておいたらどうでしょうか?

----

Apolloではこんな具合です。

----
require "phi"
p Phi.downcase("GetLastError") #=> "get_last_error"
----

実際の処理はPascalのソースで次のようになっています。

function LowerCase1(const S: string): string;
type
  TState = (Z, UU, UL, L);
var
  i:integer;
  sw:TState;
  c:char;
begin
  result := AnsiLowerCase(S);
  sw := Z;
  for i := length(S) downto 1 do begin
    c := S[i];
    if c in ['a'..'z'] then begin
      if (sw = UU) or (sw = UL) then begin
        insert('_', result, i+1);
      end;
      sw := L;
    end else if c in ['A'..'Z'] then begin
      if sw = UL then begin
        insert('_', result, i+1);
        sw := UU;
      end else if sw = L then begin
        sw := UL;
      end else begin
        sw := UU;
      end;
    end else begin
      sw := Z;
    end;
  end;
end;

take_tk = kumagai hidetake