ログ日記

作業ログと日記とメモ

Hasteを試したログ

GHCJSの重さが気になっていたところで、こんな記事を見かけた。
qiita.com


Hasteが良さそうなので試してみる。


Hasteのプロジェクトの作り方は stack new した後に
stackoverflow.com
該当箇所をここの設定に書き換える。

% stack exec haste-boot

...


Installed haste-prim-0.5.4.2
Warning: The package list for 'hackage.haskell.org' does not exist. Run 'cabal
update' to download it.
Resolving dependencies...
haste-cabal.bin: Could not resolve dependencies:
trying: time-1.5.0.1 (user goal)
next goal: deepseq (dependency of time-1.5.0.1)
Dependency tree exhaustively searched.

エラーになった。

再度トライ。

% stack exec haste-boot -- --local

Downloading haste-cabal from GitHub
Downloading Google Closure compiler...
`include' is not a directory

エラー。

% mkdir include
% stack exec haste-boot -- --local
Downloading haste-cabal from GitHub
Downloading Google Closure compiler...
utils/unlit: changeWorkingDirectory: does not exist (No such file or directory)

エラーが素っ気ないのでよく分からないけど、--localでhasteのソースを探しているのか…。

https://github.com/valderman/haste-compiler/issues/395
この辺を見ると解決しているような気がする。

stack.yaml を変更してもう一度トライ。

extra-deps:
- haste-compiler-0.5.5.1
- ghc-simple-0.3
- shellmate-0.2.3
- HTTP-4000.2.23
stack build
stack install haste-compiler
stack exec haste-boot

同じエラーになった。




どうにもならないのでソースから入れる。
github.com

git clone https://github.com/valderman/haste-compiler.git
cd haste-compiler

stack build
stack install
stack exec haste-boot

何の問題もなく入った。



バージョンが0.6.0.0になっていたので、stack.yamlのバージョンを変えたら入るんだろうか。

resolver: lts-6.14
extra-deps:
- haste-compiler-0.6.0.0
- ghc-simple-0.3
- shellmate-0.3.4.2
- shellmate-extras-0.3.4.1
- http-conduit-2.2.4
- http-client-0.5.14
- http-client-tls-0.3.5.3
- tagged-0.8.6


stackoverflow.com
うーん、stack build --copy-compiler-tool haste-compiler は何か違うっぽい。





取り敢えずここまでのソースから入れたあとの設定を最初からやる。

stack new haste-project
cd haste-project

compilerは使わないのでhaste-libだけ書く。
.cabal

  build-depends:
      base >=4.7 && <5
    , haste-lib


stack.yaml

resolver: lts-6.14

packages:
- .

extra-deps:
- haste-lib-0.6.0.0
- binary-0.7.6.1
- containers-0.5.6.3
- haste-prim-0.6.0.0
- time-1.5.0.1

これでstack build出来るし、import Hasteできた。


GHCのバージョンが古くてinteroが動かなくなったので intero.el を修正する。

(defun intero-copy-compiler-tool-auto-install (source-buffer targets buffer)
  "Automatically install Intero appropriately for BUFFER.
Use the given TARGETS, SOURCE-BUFFER and STACK-YAML."
  (let ((ghc-version (intero-ghc-version-raw)))
    (insert
     (format "

Installing intero-%s for GHC %s ...

" intero-package-version ghc-version))
    (redisplay)
    (cl-case
        (let ((default-directory (make-temp-file "intero" t)))
          (intero-call-stack
           nil (current-buffer) t nil "build"
           "--copy-compiler-tool"
           (concat "intero-" intero-package-version)
           "--flag" "haskeline:-terminfo"
           "--resolver" (concat "ghc-" ghc-version)
           ;; "haskeline-0.7.5.0"
           "haskeline-0.7.4.0"
           "ghc-paths-0.1.0.9" "mtl-2.2.2" "network-2.7.0.0" "random-1.1" "syb-0.7"))
      (0
       (message "Installed successfully! Starting Intero in a moment ...")
       (bury-buffer buffer)
       (switch-to-buffer source-buffer)
       (intero-start-process-in-buffer buffer targets source-buffer))

haskeline のバージョンを下げる。
intero自体のバージョンはdefcustomで変更できるようになってるんだけど、この依存ライブラリは固定なので直接編集するしかない。
編集したらbytecompileして起動確認。



初期のファイルを

module Lib
    ( someFunc
    ) where

import Haste

someFunc :: IO ()
-- someFunc = putStrLn "someFunc"
someFunc = writeLog $ toJSString "someFunc"

console.log出力に変えてコンパイル

#!/bin/bash

TARGET=compiled.js

set -eux

mkdir -p build

hastec -O2 -fglasgow-exts \
      --opt-minify --opt-minify-flag='--jscomp_off=checkVars' \
      -o build/compiled.js \
      --outdir=build \
      app/*.hs src/*.hs

24KBになった。
自分でclosure compilerを実行したときより誤差程度軽い。

最初のURLの比較のように3KBには遠い。
バージョンが上がって機能が増えて重くなったんだろうか。


とりあえず一旦ここまで。