わどぅー

記事については、中間出力の場合も多いので間違ってたらごめんなさい。twitter は waddlaw です。どうぞよろしく。

sublime text と F#

輪講の本がProgramming Language ConceptsになったのでF#の環境を構築した。すげーめんどくさい・・・。

環境
 OS: Windows 7 32ビット
 エディタ: Sublime Text 2
 F# : 3.0

Visual Studio を使っても良かったんだけど、最近 Sbulime Text にはまってるので動くようにしたかった。結論としては軽いし便利で良い感じ。

準備

Sublime Text 2 の設定
1. 上部メニューから [View] – [Show Console] を選択し、下部に出現したコンソールに以下のコマンドを入力し、エディタを再起動

import urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp) if not os.path.exists(ipp) else None;open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())

2. Ctrl + Shift + p で「Command Palette」が開くので、そこにinstallと入力し、「F#」をインストール
3. Ctrl + Shift + p で「Command Palette」が開くので、そこにinstallと入力し、「SublimeREPL」をインストール
4. Visual Studioキーバインド (Ctrl + Alt + F) で呼び出せるように、上部メニューから[Preferences] - [Key bindings] -[User]を選択し

[
    {
        "keys": [
            "ctrl+alt+f"
        ],
        "args": {
            "id": "repl_f#",
            "file": "config/F/Main.sublime-menu"
        },
       "command": "run_existing_window_command"
    }
]

を貼り付ける。

例えば以下のようなコードを example.fs として保存する。

module Ex
open Operators

type expr = 
    | CstI of int
    | Var of string
    | Prim of string * expr * expr
    // Ex 1.1 (iv)
    | If of expr * expr * expr

let rec lookup env x =
    match env with
    | [] -> failwith (x + "not found")
    | (y, v)::r -> if x=y then v else lookup r x;;

// Ex1.1 (iii)
let rec eval e (env : (string * int) list) : int =
    match e with
    | CstI i -> i
    | Var x -> lookup env x
    // Ex 1.1 (iv)
    | If (e1, e2, e3) ->
      let i1 = eval e1 env
      let i2 = eval e2 env
      let i3 = eval e3 env
      if i1 = 1 then i2 else i3
    | Prim (ope, e1, e2) ->
      let i1 = eval e1 env
      let i2 = eval e2 env
      match ope with
        | "+" -> i1 + i2
        | "*" -> i1 * i2
        | "-" -> i1 - i2
        | "max" -> max i1 i2
        | "min" -> min i1 i2
        | "=="  -> if i1=i2 then 1 else 0
        | _     -> failwith "unknown primitive";;

let rec evalm (e : expr) : int =
    match e with
    | CstI i -> i
    | Prim ("+", e1, e2) -> evalm e1 + evalm e2
    | Prim ("*", e1, e2) -> evalm e1 * evalm e2
    | Prim ("-", e1, e2) ->
      let res = evalm e1 - evalm e2
      if res < 0 then 0 else res
    | Prim _ -> failwith "unknown primitive";;

let env = [("a", 3); ("c", 78); ("bef", 666); ("b", 111)];;
let emptyenv = [];;

let testi1 = Prim ("==", CstI 2, CstI 3);;
let testi2 = Prim ("==", CstI 2, CstI 2);;
let testi3 = Prim ("min", CstI 2, CstI -3);;
let testi4 = Prim ("max", CstI -5, CstI -2);;

一度、Ctrl+B でコンパイルする。Ctrl + Alt + F で REPL を呼び出し、

#load "example.fs";;

と入力する。そうすると、ファイルが読み込まれる。
実行の仕方は

open Ex;;
eval testi1 env;;

Ex.eval Ex.testi1 Ex.env;;

で良いはず。

これからお世話になる MSDN のリンクを貼って終わりです。

参考文献
 ・F# 3.0の開発環境を用意しよう! - (hatena (diary ’Nobuhisa))
 ・Sublime Text 2ってエディタがすごくイイ。Dreamweaverから乗り換えた時の初期設定とか使い方とかをメモ | Mnemoniqs Web Designer Blog
 ・Coding Journal | Using Sublime Text 2 as F# REPL