え? こんなことある?
と今感動してゐるので 忘れないうちに 書いておかうと思つた
今まで エディタのやうなものを制作しやうとして ゴチャゴチャやってきた經驗はあつた
基本的にjavascriptでやってゐたのだが 例へば
行が左端に達したら スクロールする といふ処理を書くのに 色々試行錯誤した記憶がある
イメージをコピーして ずらした位置にペーストするやうなことをやってゐた
今回 Haskellで エディタのやうなものを制作してゐるのだが
なんと このスクロール処理が 単にパラメータを引いたりしただけで實現できてしまつた
具體的には
makePicOsds :: [[Int]] -> [Float] -> State -> [Picture] makePicOsds numList line st = let txOsds = map (\ls -> map ((!!) (osds st)) (map abs ls)) numList in concat $ zipWith (\txos ln -> zipWith (\(Just t) (x,y) -> translate (startX-shiftX*x) (startY-shiftY*y) $ scale fScale fScale $ t) txos [(a,b)|a<-[ln..],b<-[0..(_by st)]]) txOsds line
上のコードを
makePicOsds :: [[Int]] -> [Float] -> State -> [Picture] makePicOsds numList line st = let txOsds = map (\ls -> map ((!!) (osds st)) (map abs ls)) numList in concat $ zipWith (\txos ln -> zipWith (\(Just t) (x,y) -> translate (startX-shiftX*x) (startY-shiftY*y) $ scale fScale fScale $ t) txos [(a,b)|a<-[(ln-_sx st)..],b<-[0..(_by st)]]) txOsds line
このやうにしただけだ
變はつたのは 一番下の行の ln のところが (ln-_sx st) になっただけである
スクロールするぶんだけ 表示行の初期位置をずらした といふだけで
スクロールが實現できてしまつた
もちろん Haskellでなくても 同じやうなアルゴリズムを用ひてゐれば
同様にできるのだらう
しかし このやうなことが出來ることに氣付かせてくれたのは 私にとつては
確實にHaskellである
もちろん カーソルの移動によるスクロール値の變化や
文章挿入時の処理に若干變更をしてゐるが ほとんど上のやうなレベルである
少なくとも 切つたり貼つたりといふ 新しい函數を作ることは 全くしなかつた
さう! javascriptでは 必ず スクロール処理の函數を書いてゐたものだ
断言したい
Haskell は 私にとつて 偉大な 師匠である!!