Fusic 中野です。
暑い中昼休みにゲームソフトを買いに行ったら、来週発売でした。
ちょっとした小ネタ。
弊社は主にRubyかPHPでプログラムを書くことが多い会社なので、今回はGo言語とHaskellについて
書いてみようかと思います。
Haskell製の自作ツールをGo言語で書き直していたのですが、あるディレクトリ配下のファイル一覧を
取得する処理を簡単に記述できたので、ちょっと比較をしてみようかと思います。
Go言語(MacOSX go1.3 darwin/amd64)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import ( "fmt" "os" "path/filepath" ) func main() { var result []string = make([]string, 0) // グローバルはいや! walk := func (p string, info os.FileInfo, _ error) error { if info.IsDir() { result = append(result, "Directory: " + p) } else { result = append(result, "File: " + p) } return nil } filepath.Walk(".", walk) fmt.Println(result) } |
Haskell(MacOSX ghc version 7.6.3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | module Main where import Control.Monad.Writer import Control.Monad.State import System.FilePath import System.Directory main :: IO () main = go "." >>= print where go p = execWriterT $ runStateT walk [p] -- go :: FilePath -> IO [FilePath] walk = do -- walk :: StateT [FilePath] (WriterT [FilePath] IO) () p <- get case p of (x:xs) -> do d <- lift . lift $ doesDirectoryExist x if d then do files <- lift . lift $ getDirectoryContents x put $ xs ++ [x </> f | f <- files, f /= "." && f /= ".." ] tell ["Directory: " ++ x] else do put xs tell ["File: " ++ x] walk _ -> return () |
たぶん、似たようなことをしているかと思います。
まとめ
今日はGo言語が1.3がリリースされました。もう、心がぴょんぴょんしてきます。
また、もっと簡単にかけるぜ!という方、もしくは、PHPやRubyなどに興味があり、
Fusicで一緒に働いてみたいという方はこちらの
フォームからご応募くださいませ。
それでは。