SVX日記
2013-02-22(Fri) 初めてHaskeる
ふと、Rubyをカジり始めた日付を調べてみた。2003年3月18日とあった。ほぼ10年キッカリ。ずっと、Rubyメインで使ってきたことになる。フムン。別に節目というわけでもないが、新たな言語をカジってみるのも頭の体操には悪くない。かなり、変わった概念の言語らしいし。
しかし、言語を始めるのは、敷居が高い。インストールから始まって、何をやるにもリファレンスと首っ引き、かつ、果てしないトライアンドエラーの繰り返し。自分なりの「口ぐせ」がそろってくるまでがツラい。Ruby の時も結構ツラかったのだが、果たして、最近の脳力でノッて行けるのだろうか。
なにはともあれ、まずはインストール。環境は、Fedora18だ。ググりまくりつつ、Linux版の処理系が存在することを確認する。コンパイラとインタプリタが両方あるのか。ならば、まずはインタプリタの方がいいだろうな。
# yum install hugs98
$ hugs
__ __ __ __ ____ ___ _________________________________________
|| || || || || || ||__ Hugs 98: Based on the Haskell 98 standard
||___|| ||__|| ||__|| __|| Copyright (c) 1994-2005
||---|| ___|| World Wide Web: http://haskell.org/hugs
|| || Bugs: http://hackage.haskell.org/trac/hugs
|| || Version: September 2006 _________________________________________
Haskell 98 mode: Restart with command line option -98 to enable extensions
Type :? for help
Hugs> 1 + 2
3
Hugs> :quit
[Leaving Hugs]
$ vi hello.hs
$ cat hello.hs
#!/usr/bin/runhugs
main = putStr "hello, world\n"
$ chmod 755 hello.hs
$ ./hello.hs
hello, world
$ cat hello.hs
#!/usr/bin/runhugs
main = print "hello, world\n"
$ ./hello.hs
"hello, world\n"
$ cat func1.hs
#!/usr/bin/runhugs
ave3 :: Float -> Float -> Float -> Float
ave3 a b c = (a + b + c) / 3
main = print (ave3 8 10 5)
$ ./func1.hs
7.666667
$ cat func2.hs
#!/usr/bin/runhugs
cat3 :: String -> String -> String -> String
cat3 a b c = a ++ " " ++ b ++ " " ++ c ++ "."
main = print (cat3 "She" "sees" "sea")
$ ./func2.hs
"She sees sea."
# yum install hugs98-hgl
# yum install hugs98-demos.x86_64
$ cat dcurve.hs
#!/usr/bin/runhugs
import System
import Graphics.HGL
-- /usr/lib64/hugs/packages/HGL/Graphics/HGL/Internals/Types.hs
-- type Point = (Int,Int)
rad :: Int -> Float
rad d = (2 * pi * (fromIntegral d) / 360)
vnext :: Point -> Int -> Float -> Point
vnext (x, y) r l = (x + round (cos (rad r) * l), y + round (sin (rad r) * l))
ccurve :: Int -> Point -> Int -> Float -> Graphic
ccurve 0 (x, y) r l = line (x, y) (vnext (x, y) r l)
ccurve d (x, y) r l = overGraphics [
ccurve (d - 1) (x, y) (r - 45) (l / 2 * sqrt 2),
ccurve (d - 1) (vnext (x, y) (r - 45) (l / 2 * sqrt 2)) (r + 45) (l / 2 * sqrt 2) ]
dcurve :: Int -> Point -> Int -> Float -> Int -> Graphic
dcurve 0 (x, y) r l w = line (x, y) (vnext (x, y) r l)
dcurve d (x, y) r l w = overGraphics [
dcurve (d - 1) (x, y) (r - w) (l / 2 * sqrt 2) 45,
dcurve (d - 1) (vnext (x, y) (r - w) (l / 2 * sqrt 2)) (r + w) (l / 2 * sqrt 2) (-45) ]
main :: IO ()
main = runGraphics $ do
args <- getArgs
-- w <- openWindow "C Curve Window" (800, 600)
-- drawInWindow w (ccurve (read (head args)) (250, 350) 0 300)
w <- openWindow "Dragon Curve Window" (800, 600)
drawInWindow w (dcurve (read (head args)) (250, 350) 0 300 45)
getKey w
closeWindow w
$ ./dcurve.hs 15