2009-06-08

A Tale of Two Cats

每学一门语言首先想做的是用它写一个类UNIX下cat命令的东西,简单但至少涉及命令行处理和文件I/O。

Scheme版本:

(define (cat . arg)
(let ((port (if (null? arg)
(current-input-port)
(car arg))))
(let loop ((c (read-char port)))
(if (not (eof-object? c))
(begin
(display c)
(loop (read-char port)))))))

(define (main args)
(if (null? (cdr args))
(cat)
(for-each (lambda (port) (cat port) (close-input-port port))
(map open-input-file (cdr args)))))


Haskell版本:

import System.Environment

cat :: String -> IO ()
cat fn = do
contents <- readFile fn
putStr contents

main = do args <- getArgs
if null args then interact id else mapM_ cat args


学了Haskell之后才知道Python里面的缩进、List Comprehension等似乎是从Haskell学来的。上面两个cat功能一样,区别是Haskell cat比较懒一点,那是因为Haskell是惰性求值的。勤快一点的版本只需要bytestring重新实现cat函数:

import qualified Data.ByteString.Lazy as B

cat :: String -> IO ()
cat fn = do
bs <- B.readFile fn
B.putStr bs

标签: ,

0 Comments:

发表评论

<< Home