2011-11-01から1ヶ月間の記事一覧
試しに書いてみたんだけど、これはいいかも... (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…
クロージャでかっこよく*1フィボナッチするよ! let makeFiboClosure (a, b) = let mutable t = (a, b) fun () -> let x,y = t in t <- (y, x+y); x makeFiboClosure は、クロージャを作る関数です。評価するとレキシカル変数なタプル t を更新しながら数列…
F#アセンブリを任意のパスに配置して開発できるように補助的な elisp を書きました。A Helper of fsharp-mode (v0.3) for Mono中途半端な感じですが、F# 学習用には使えるんじゃないかと思います。 やってることは 環境変数 MONO_PATH の設定と、実行プログ…
意外と簡単に環境つくれました。Ubuntu は 10.04 LTS です。 ♯Monoインストール Ubuntu の apt で入れました。というか入れてありました。version は 2.10.5 なので F# 入れるには十分新しいようです。 ♯make ツール autoreconf をしたら libtoolize が無い…
List メインで解こうと決めてやってみたけど無理してるのが見え見え。Seq にしてやった方がよかったかも? 筋のいいプログラマーなら文字列からのパースをもっと安全なコードにするんでしょうかね。Project Euler 18 解答 (gist) リファクタリング(2011/11/…
関数定義の時に型を明示しなくても推論で型を決めてくれるけど、明示したいこともある。 例えば、** 演算子は float 型専用なので他の型では使えない。 let pow x y = x ** y pow "2" "10" //=> error FS0001: This expression was expected to have type fl…
まだ文法とか半分くらいしか学んでないけど、リスト操作を憶えたので今の知識でどんな風になるか腕試し。 元ネタはどう書く?.org 「数字混じり文字列ソート」 open System let takeNums cs = let rec loop cs n = match cs with | [] -> (n, []) | c::cs wh…
理由は単純。評価結果が 真/偽じゃないから。 (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)…