投稿者 okkez
2008-02-03 09:38:00 GMT
ふつける読書会の#8 と prototype.js のコードリーディングに参加してきた。
ふつける読書会
ふつけるの読書会。
LazyLines という wiki clone の実装の説明の前半部分を読んだ。
Haskell は結構忘れてたけど意外とさっくり読めた。
Haskell で何か作りたい。
次回は 2/22 (Fri) 夜の予定。
Kanasan.js
初参加なの上に javascript はさっぱりなので大人しくしているつもりだったのに内容がないことを結構発言してたような気がする。邪魔してたのでなければ良いのだけど。
コードリーディングは1300行目辺りから。Ajax系のクラスの辺り。
と Element を操作する系のところ。insert の途中まで。
内容については誰かが詳しくレポートしてくれるだろうから、コード読むときに準備しとくとよいものを書いておく。
- vim (viewで起動させてreadonlyで読むといい)
- prototype.js のリファレンスマニュアル
- windows は chm が配布されてるのでそれを。
- *nix 系な人は pdf か web で。
- 実験用の html ファイル (後述)と firebug
気になったこと、というか誰か作ってほしいもの。
- javascript 用の [ec]tags コマンド
- コードからリファレンスを引ける prototype.js 用の emacs マイナーモード
次回も可能であれば参加する予定。
続きを読む...
カテゴリ Programming | タグ 勉強会, Haskell, javascript
投稿者 okkez
2007-06-06 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
カテゴリ Programming | タグ Haskell
投稿者 okkez
2007-06-05 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 っぽく書くとこうなるってのを教えてくれるとうれしい。
今度逆も書いてみる。
カテゴリ Programming | タグ Haskell | コメントなし
投稿者 okkez
2007-05-28 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"
カテゴリ Programming | タグ Haskell
投稿者 okkez
2007-05-26 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>
カテゴリ Programming | タグ Erlang, Haskell | コメントなし
投稿者 okkez
2007-05-19 13:59:00 GMT
行ってきました。
前回参加しなったので、すみっこで前回の範囲のコードをこっそり書いてました。
map のあたりの書き方がよくわからなかったので、時間を作ってもう一回確認しておこうと思います。
あとは、関数の定義の読み方を思い出すのに時間がかかってしまったのが惜しいところです。
# 同じような内容のことを mixi の日記にも書いたのでこれはブログの練習。
カテゴリ Programming | タグ Haskell | コメントなし