HaskellっぽいAltJSなPureScriptの環境作る
HaskellっぽいAltJSでPureScriptというのがあるそうなので興味本位で使ってみる。完全なHaskellのサブセットではなく、JavaScriptとの親和性を意識してるっぽい印象。
Haskellとの違いは以下に記載されてる↓
Differences from Haskell · purescript/purescript Wiki · GitHub
設計として意図的な差分なのか、実装としてまだできていないだけなのか区別されてないですが。
Hello world出すだけだったら簡単だけど、ライブラリをimportしようと思うとちゃんとビルド周りをちゃんと構築しないといけなくて自分用のメモ。環境はMac OS X(10.10)でGHC7.8.3でpurescript 0.6.2です。
まだJavaScriptのエコシステムに不慣れなのでディレクトリ構成とかビルド周りこのへんのチュートリアルが参考にしてます↓
Read PureScript by Example | Leanpub
PureScript自体はHaskellで書かれているのでHaskell Platformがなければ入れてください。このへん↓
Download Haskell Platform
あとcabalは最新にしておいてください。
$ cabal install Cabal cabal-install
Haskell環境使えるようになったらcabalでpurescriptをインストールする。
$ cabal update $ cabal install purescript
purescriptの周辺ライブラリはpurescriptで書かれてbowerで管理されてて、jsへのコンパイルとかはgruntを使うのでgruntとbowerを入れる。
$ npm install -g grunt-cli bower
以下のコードをsrc/test.pursとして保存する。
module Test where import Debug.Trace import Math diagonal w h = sqrt (w * w + h * h) main = print (diagonal 3 4)
以下のビルド用の定義をGruntfile.jsとして保存する。
module.exports = function(grunt) { "use strict"; grunt.initConfig({ srcFiles: ["src/**/*.purs", "bower_components/**/src/**/*.purs"], psc: { options: { main: "Test", modules: ["Test"] }, all: { src: ["<%=srcFiles%>"], dest: "dist/Main.js" } } }); grunt.loadNpmTasks("grunt-purescript"); grunt.registerTask("default", ["psc:all"]); };
gruntのpurescript用のプラグインを入れる
$ npm install grunt grunt-purescript@0.5.1
npmのプロジェクトを作る。
$ npm init
いろいろ聞かれるがとりあえず使えればよいのでデフォルトでEnter連打。
{ "name": "psbook", "version": "0.0.0", "description": "", "main": "Gruntfile.js", "dependencies": { "grunt": "^0.4.5", "grunt-purescript": "^0.5.1" }, "devDependencies": { "grunt-purescript": "0.5.1" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" }
これでnpm installすれば依存するビルドツールがインストールできるようなる。
$ npm install
コードが依存するライブラリはbowerでインストールする。
$ bower install purescript-math#0.1.0
依存関係定義にするのにbowerの定義ファイル作る
$ bower init
いろいろ聞かれるがとりあえず使えればよいのでデフォルトでEnter連打。
bower.jsonに以下のように依存するライブラリを記載する。
{ "name": "psbook", "version": "0.0.0", "authors": [ "minamijoyo <minamijoyo@gmail.com>" ], "license": "MIT", "ignore": [ "**/.*", "node_modules", "bower_components", "test", "tests" ], "dependencies": { "purescript-math": "0.1.0" } }
これでbower updateすれば依存関係がインストールできるようになる。
$ bower update
準備完了。gruntコマンドでビルドする。
$ grunt
main実行するのは、
$ node dist/Main.js 5
というのでコード書ける環境がやっとできた。