すこし頭が痛い
今 なんとか Haskellコードをベースにして ブラウザ上に サーバーから読み込んだテキストを表示させることに成功した
まう 無理だらう と 何度思つたことか
GHCJSを入れやうとして 少なくとも 10パターンくらゐの試みは すべて 失敗に終はつた
web上で このGHCJSを扱つたページがいくつかあったが 本當に どうやつて インストールしてゐるのだらうか
さすがに 根負けした といふか 今のところは GHCJSが より一般的になつて 誰でもインストールできるやうになるのを待つしかない と思つてゐる
Hasteは ほとんど更新もされてゐないやうで gitリポジトリのReadMeは 3年前のものだ
それでも Haste自體 windowsに簡單インストールでき
GHC7.10.2を用意しさへすれば (これも かなり古いバージョンに戻ることになるのだが) hastecコマンドが機能する
コードは次のやうになつた
{-# LANGUAGE OverloadedStrings #-}
import Haste
import Haste.Graphics.Canvas
import Haste.Foreign
textfile :: String
textfile = "kotonoha.txt"
startX :: Double
startX = 400
startY :: Double
startY = 100
main :: IO ()
main = do
Just can <- getCanvasById "canvas"
tx <- readFromFile textfile
view can tx
view :: Canvas -> String -> IO ()
view can tx = do
render can $ do
lineWidth 2.0 $ do
color (RGB 255 255 255) $ stroke $ rect (0,0) (450,700)
mapM_ (color (RGBA 255 255 255 0.8) . font "24px oshide") $ letterList tx
return ()
letterList :: String -> [Picture ()]
letterList ts = do
zipWith text (zip [a*b | a <- [startX,(startX-40)..], b <- take 14 (repeat 1)]
(map (+startY) $ cycle [30,60..(30*14)])) (map (\c -> c : []) ts)
readFromFile :: String -> IO String
readFromFile = ffi "(function(fname){var text=null; var ajax=new XMLHttpRequest(); /*@if(1) ajax.onreadystatechange @else@*/ ajax.onload /*@end@*/ = function(){ (ajax.readyState==4)&&(ajax.status==200)&&(text=ajax.responseText);}; ajax.open('GET',fname,false); ajax.send(null); return text;})"
ajaxを使はず コードの中にテキストを埋め込んでしまへば
readFromFileは必要ない
それはそれで 文章の縦書き化が このHasteで實現できたときは 結構感動したのだが
やはりajaxは難解だつた
結局 Haste.Ajax モジュールの使用はあきらめ (使ひ方がまるで分からない)
javascriptのコードを埋め込むために Haste.Foreign モジュールを利用した
しかしまた そのjavasciptコードがうまく動かず 失敗續きで まうやめやう と思つてゐた時に 単純なスペルミスが發覺し 何とか 期待してゐた動作まで辿りつくことができた
Elmでなく Haskellにどうしてもこだはりたい理由が 上の letterList 函數にある
たったこれだけの記述で 文字列から一文字づつ取り出して 座標を與へ 縦書きのためのリストを生成するのである
Haskell初心者の私に このやうなコードを書かせてくれる Haskellといふ言語の魔力に どうやら 取りつかれてしまつたらしい
くり返しを何回にするか決めて 變數を使ひ 決まつた數だけくり返す
のではなく
無限のリストをつくり その中から必要なだけ取り出す
のである
とにかく スタートラインに立つてゐるやうな氣分になつてゐる
この方面に詳しい人から見れば 全くバカげたことかもしれないが
これが學びに繋がることは確實である
また 行けるところまで 行かうとおもふ