2011-11-01から1ヶ月間の記事一覧

emacs lisp にも clojure の ->> が欲しいよね

試しに書いてみたんだけど、これはいいかも... (require 'cl) (defmacro my:-> (&rest exprs) (when exprs (reduce '(lambda (acc expr) (if (listp expr) (cons (car expr) (cons acc (cdr expr))) (list expr acc))) exprs))) (defmacro my:->> (&rest exp…

mutable変数はクロージャに閉包できない

F#

クロージャでかっこよく*1フィボナッチするよ! let makeFiboClosure (a, b) = let mutable t = (a, b) fun () -> let x,y = t in t <- (y, x+y); x makeFiboClosure は、クロージャを作る関数です。評価するとレキシカル変数なタプル t を更新しながら数列…

Mono用 fsharp-mode 補助スクリプト

F#アセンブリを任意のパスに配置して開発できるように補助的な elisp を書きました。A Helper of fsharp-mode (v0.3) for Mono中途半端な感じですが、F# 学習用には使えるんじゃないかと思います。 やってることは 環境変数 MONO_PATH の設定と、実行プログ…

UbuntuとEmacsでF#

意外と簡単に環境つくれました。Ubuntu は 10.04 LTS です。 ♯Monoインストール Ubuntu の apt で入れました。というか入れてありました。version は 2.10.5 なので F# 入れるには十分新しいようです。 ♯make ツール autoreconf をしたら libtoolize が無い…

F# で ProjectEuler18

F#

List メインで解こうと決めてやってみたけど無理してるのが見え見え。Seq にしてやった方がよかったかも? 筋のいいプログラマーなら文字列からのパースをもっと安全なコードにするんでしょうかね。Project Euler 18 解答 (gist) リファクタリング(2011/11/…

関数の型註釈

F#

関数定義の時に型を明示しなくても推論で型を決めてくれるけど、明示したいこともある。 例えば、** 演算子は float 型専用なので他の型では使えない。 let pow x y = x ** y pow "2" "10" //=> error FS0001: This expression was expected to have type fl…

習作:数字混じり文字列ソートをF#で

F#

まだ文法とか半分くらいしか学んでないけど、リスト操作を憶えたので今の知識でどんな風になるか腕試し。 元ネタはどう書く?.org 「数字混じり文字列ソート」 open System let takeNums cs = let rec loop cs n = match cs with | [] -> (n, []) | c::cs wh…

not-empty には ? が付かない

理由は単純。評価結果が 真/偽じゃないから。 (empty? []) ;=> true (empty? [1 2]) ;=> false (not-empty []) ;=> nil (not-empty [1 2]) ;=> [1 2] not-empty の実装を見ると (defn not-empty "If coll is empty, returns nil, else coll" {:added "1.0"} …

左から適用される合成関数

F# の >> がClojureにも欲いですね。 Clojure では関数合成は comp を使いますが、comp で作った合成関数は、右から順に適用されます。 F#の e >> f >> g >> h が、Clojure では (comp h g f e) と書かなければなりません。でも、ソースコード読むときはなる…

「数字混じりソート」さらに改

昨日のコードを更に改造。 (use '[clojure.contrib.str-utils :only (re-partition)] '[clojure.contrib.core :only (-?>)]) (defn apply-flip [f a b] (f b a)) (defn parse [s] (->> (re-partition #"\d+" s) (apply-flip concat [nil nil]) (partition 2)…