エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

環境変数の値を得る

テンポラリファイルを作るのに、テンポラリフォルダの値を得る必要に迫られて。
忘れないうちにメモメモ。

import System.Environment

get_env :: [String] -> String -> IO String
get_env [] d = return d
get_env (s:ss) d = catch ( getEnv s ) ( \ _ -> get_env ss d )

-- test
main = get_env ["TEMP", "TMP"] "." >>= print

C++だとこんな感じ。メモメモ。

#include <cstdlib>

/// @param vars 環境変数名の配列(末尾には0を格納すること)
/// @param d    デフォルトの値
/// @return 環境変数の値(該当する環境編すがない場合はデフォルトの値)
const char* get_env(const char* vars[], const char* d)
{
    while(*vars != 0)
    {
        const char* result = std::getenv(*vars);
        if(result != 0)
        {
            return result;
        }
        ++vars;
    }
    return d;
}

// test

#include <iostream>

int main(int, char* [])
{
    const char* vars[] = { "TEMP", "TMP", 0 };

    std::cout << get_env(vars, ".") << std::endl;

    return 0;
}

書いてから思いついた。Haskellと同じように再帰で挑戦。効率悪いけど。

const char* get_env2(const char* vars[], const char* d)
{
    if(*vars == 0)
    {
        return d;
    }
    else if(const char* result = std::getenv(*vars))
    {
        return result;
    }
    else
    {
        return get_env2(vars + 1, d);
    }
}