PureScript ver. 0.7.0 以上での Hello, World!

PureScript 0.7.1.0 で Node でコンソールに Hello, World! するところまでできたのでそのまとめ。

実例による PureScript を読んで勉強していたんだけど、先月終わりのバージョンアップの関係でそのままでは動かなくって調べたんでまとめる。英語の本家の方のドキュメントもこれから対応させていくらしい。

コマンドは Windows コマンドプロンプトのを使っているので UNIX 系の人は適宜読み替えること。

環境構築

用意するものは、PureScript コンパイラー(psc)と Node(NPM も使う)と Bower。(好みによって Cabal も。)NPM と Bower (と Cabal)がどういう使い分けをされてるかは以下な感じ。

  • NPM
    • Bower のインストー
    • Grunt のインストール(自分はまだ使ってない)
    • 開発ツールの管理に使うっぽい
  • Bower
    • purescript-prelude のインストー
    • ライブラリーの管理はこっちでするっぽい
  • Cabal

psc のインストー

Homebrew なり Chocolatey なり NPM なり Cabal なり、直接バイナリーをインストールするなりする。詳しくはこちら

Cabal というか Stack が楽なので Stack でインストールする方法は次の通り。

Stack はここからバイナリーをダウンロード。stack setup して、stack install purescript すると Stackage にないファイルが必要だといわれるのでそれを設定ファイルに記述する。設定ファイルの場所は Windows なら %USERPROFILE%\AppData\Roaming\stack\global\stack.yaml。さっきのエラーにファイルの場所が書かれている。設定ファイルに追記するものもエラーに書かれているのでそれを下記のように追記する。

extra-deps:
    - aeson-better-errors-0.9.0
    - bower-json-0.7.0.0
    - boxes-0.1.4
    - pattern-arrows-0.0.2

で、もう1度 stack install purescript するとインストールされる。どこに実行ファイルが保存されたかが表示されるのでパスを通す。

Node と NPM のインストー

apt-get なり Homebrew なり Chocolatey なり直接インストーラーでインストールするなりする。

Bower のインストー

> npm install -g bower

Hello World プログラム

下記が 0.7.0 以降での Hello World プログラム。Main.purs で保存する。

module Main where

import Control.Monad.Eff.Console (log)

main = log "Hello, World!"

0.7.0 より前のは下記。

module Main where

import Debug.Trace

main = trace "Hello, World!"

0.7.0 での変更点から今回のプログラムに関係するものを取り出すと下記になる。移行ガイドもある。

  • Debug.Trace モジュールは Control.Monad.Eff.Console モジュールに置き換えられた
  • psc に標準ライブラリーがついてこなくなった

コンパイル

先のプログラムが依存するモジュールをインストールする。

> dir
Main.purs
> bower install purescript-console
> dir bower_components
purescript-console
purescript-eff
purescript-prelude

コンパイルする。

> psc --ffi 'bower_components\purescript-*\src\**\*.js' 'bower_components\purescript-*\src\**\*.purs' Main.purs
> dir output
Control.Monad.Eff
Control.Monad.Eff.Class
Control.Monad.Eff.Console
Control.Monad.Eff.Unsafe
Main
Prelude

実行

生成された output\Main\index.js ファイルを見ると main 関数をエクスポートするだけのプログラムになっているので、実行する Javascript を書く。ここでは main.js としておく。

require("Main").main();

Node で require するためのパスを指定して実行する。

> set NODE_PATH=%cd%\output
> node main.js
Hello, World!

参考