HaskellWorkshop #8 and Kanasan.js(code reading) #3

Posted by okkez Sun, 03 Feb 2008 09:38:00 GMT

ふつける読書会の#8prototype.js のコードリーディングに参加してきた。

ふつける読書会

ふつけるの読書会。

LazyLines という wiki clone の実装の説明の前半部分を読んだ。

Haskell は結構忘れてたけど意外とさっくり読めた。

Haskell で何か作りたい。

次回は 2/22 (Fri) 夜の予定。

Kanasan.js

初参加なの上に javascript はさっぱりなので大人しくしているつもりだったのに内容がないことを結構発言してたような気がする。邪魔してたのでなければ良いのだけど。

コードリーディングは1300行目辺りから。Ajax系のクラスの辺り。 と Element を操作する系のところ。insert の途中まで。

内容については誰かが詳しくレポートしてくれるだろうから、コード読むときに準備しとくとよいものを書いておく。

  • vim (viewで起動させてreadonlyで読むといい)
    • emacs だと色分けがあまり上手くいかない。
  • prototype.js のリファレンスマニュアル
    • windows は chm が配布されてるのでそれを。
    • *nix 系な人は pdf か web で。
  • 実験用の html ファイル (後述)と firebug

気になったこと、というか誰か作ってほしいもの。

  • javascript 用の [ec]tags コマンド
  • コードからリファレンスを引ける prototype.js 用の emacs マイナーモード

次回も可能であれば参加する予定。

実験用のファイル

以下を適当な名前で prototype.js と同じディレクトリに保存する。

で、 web ブラウザからアクセスする。 firefox の場合は firebug で色々試すことが出来る。

# 今日、コードリーディング中にでっちあげたので改良の余地はあるはず

<html> <head> <script src="prototype-1.6.0.2.js" type="text/javascript"></script> <title>ex prottype.js</title> </head> <body> <p>hello</p> <p id="world">world</p> </body> </html>

Posted in |

Integer to RomanNumeral in Haskell 2

Posted by okkez Wed, 06 Jun 2007 12:16:00 GMT

ちょっとだけ改善してみたのでまた公開しておく。

コマンドライン引数を一つ受け取って10進数をローマ数字に変換してくれる。

使い方

$ runghc convert.hs 10 #=> X $ runghc convert.hs 999 #=> DCCCCLXXXXVIIII
convert.hs
import System import Numeric main = do cs <- getArgs let [(n,_)] = readDec $ head cs putStrLn $ i2r n old_roman_unit :: Int -> Char old_roman_unit n | n == 1000 = 'M' | n == 500 = 'D' | n == 100 = 'C' | n == 50 = 'L' | n == 10 = 'X' | n == 5 = 'V' | n == 1 = 'I' | otherwise = 'Q' i2r :: Int -> String i2r n = i2r2 n [1000, 500, 100, 50, 10, 5, 1] i2r2 :: Int -> [Int] -> String i2r2 _ [] = [] i2r2 n (u:us) = replicate (n `div` u) (old_roman_unit u) ++ i2r2 (n `mod` u) us

Posted in |

Integer to RomanNumeral in Haskell

Posted by okkez Tue, 05 Jun 2007 16:47:00 GMT

意味があるかどうかわからないけど、なんとなく書いてみた。

戦略は Erlang の場合と同じ。なんとなく Erlang の時よりすっきりしている気がしなくもない。

convert.hs
main = putStrLn $ unlines $ map i2r [1..4999] old_roman_unit :: Int -> Char old_roman_unit n | n == 1000 = 'M' | n == 500 = 'D' | n == 100 = 'C' | n == 50 = 'L' | n == 10 = 'X' | n == 5 = 'V' | n == 1 = 'I' | otherwise = 'Q' -- 本当は例外?を投げたい気がする i2r :: Int -> String i2r n = i2r2 n [1000, 500, 100, 50, 10, 5, 1] [] i2r2 :: Int -> [Int] -> String -> String i2r2 _ [] str = str i2r2 n (u:us) str = i2r2 (n `mod` u) us (str ++ replicate (n `div` u) (old_roman_unit u))

最後の行がちょっと微妙な気がする。誰か Haskell っぽく書くとこうなるってのを教えてくれるとうれしい。

今度逆も書いてみる。

Posted in | コメントはありません |

99 bottles of beer

Posted by okkez Mon, 28 May 2007 15:07:00 GMT

なんとなく思い立って Haskell で書いてみた。 FizzBuzz と余り変わらない感じですね。

99 bottles of beer
main = putStr $ unlines [sing x | x <- reverse [1..1000]] sing :: Int -> String sing n = unlines [ (show n) ++ bottle n ++ " of beer on the wall" ,(show n) ++ bottle n ++ " of beer" ,"Take one down and pass it around" ,(show $ n - 1) ++ (bottle $ n - 1) ++ " of beer on the wall"] bottle :: Int -> String bottle n | n == 1 = " Bottle" | otherwise = " Bottles"

Posted in |

FizzBuzz

Posted by okkez Sat, 26 May 2007 02:03:00 GMT
Haskell
import System main = putStr $ unlines [fb(x) | x <- [1..100]] fb n | n `mod` 15 == 0 = "FizzBuzz" | n `mod` 5 == 0 = "Buzz" | n `mod` 3 == 0 = "Fizz" | otherwise = show n
Erlang
-module(fizzbuzz). -export([fizzbuzz/0,fb/1]). fizzbuzz() -> [ fb(X) || X <- lists:seq(1,100)]. fb(N) when N rem 15 =:= 0 -> "FizzBuzz"; fb(N) when N rem 5 =:= 0 -> "Buzz"; fb(N) when N rem 3 =:= 0 -> "Fizz"; fb(N) -> N.

Erlang の方の動かし方。(インストールは略)

  • erl シェルを起動
1> c(fizzbuzz.erl). %=> コンパイル {ok,fizzbuzz} 2> fizzbuzz:fizzbuzz. %=> 関数呼び出しの括弧は必要 ** 1: illegal expression ** 3> fizzbuzz:fizzbuzz(). [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz", 16, 17, "Fizz", 19, "Buzz", "Fizz", 22, 23, "Fizz", "Buzz", 26, "Fizz", 28, 29|...] %=> リストの出力は省略される 4>

Posted in | コメントはありません |

Haskell勉強会 #4

Posted by okkez Sat, 19 May 2007 13:59:00 GMT

行ってきました。

前回参加しなったので、すみっこで前回の範囲のコードをこっそり書いてました。 map のあたりの書き方がよくわからなかったので、時間を作ってもう一回確認しておこうと思います。

あとは、関数の定義の読み方を思い出すのに時間がかかってしまったのが惜しいところです。

# 同じような内容のことを mixi の日記にも書いたのでこれはブログの練習。

Posted in | コメントはありません |