Haste でいけるのか

すこし頭が痛い

今 なんとか Haskellコードをベースにして ブラウザ上に サーバーから読み込んだテキストを表示させることに成功した

まう 無理だらう と 何度思つたことか

GHCJSを入れやうとして 少なくとも 10パターンくらゐの試みは すべて 失敗に終はつた

qiita.com

web上で このGHCJSを扱つたページがいくつかあったが 本當に どうやつて インストールしてゐるのだらうか

github.com

さすがに 根負けした といふか  今のところは GHCJSが より一般的になつて 誰でもインストールできるやうになるのを待つしかない と思つてゐる

Hasteは ほとんど更新もされてゐないやうで gitリポジトリのReadMeは 3年前のものだ

github.com

それでも Haste自體 windowsに簡單インストールでき

GHC7.10.2を用意しさへすれば (これも かなり古いバージョンに戻ることになるのだが) hastecコマンドが機能する

 

コードは次のやうになつた

github.com

{-# 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といふ言語の魔力に どうやら 取りつかれてしまつたらしい

くり返しを何回にするか決めて 變數を使ひ 決まつた數だけくり返す

のではなく

無限のリストをつくり その中から必要なだけ取り出す

のである

 

とにかく スタートラインに立つてゐるやうな氣分になつてゐる

この方面に詳しい人から見れば 全くバカげたことかもしれないが

これが學びに繋がることは確實である

また 行けるところまで 行かうとおもふ