{ 2014.6.19 }

ファイル・ディレクトリ名コレクション

    はてなブックマーク - ファイル・ディレクトリ名コレクション
    このエントリーをはてなブックマークに追加

    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で一緒に働いてみたいという方はこちら
    フォームからご応募くださいませ。

    それでは。

    Comments are closed.