テンポラリファイルを作るのに、テンポラリフォルダの値を得る必要に迫られて。
忘れないうちにメモメモ。
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); } }