2011-01-01から1年間の記事一覧

partial関数書いてみた

●partial関数 Common Lisp で *1 (defun partial (f &rest args) (lambda (&rest rest-args) (apply f (append args rest-args)))) (funcall (partial #'* 2) 10) ;=> 20 (funcall (partial #'list 1 2) 3 4 5) ;=> (1 2 3 4 5) 一応できてますね。左から順…

オーバーフローする flatten

エントリータイトル変更しました。 「オーバーフローしない」-->「オーバーフローする」 ●On Lisp の flatten はスタック溢れを起す (defun flatten-a (lis) (labels ((rec (x acc) (cond ((null x) acc) ((atom x) (cons x acc)) (t (rec (car x) (rec (cdr…

Clojureでもクリスマスツリーを飾りました

この記事はClojure Advent Calendar 2011の13日目の記事です。一日+α 遅れましたが。シーケンス(リスト)でクリスマスツリーが作れるらしいので作ってみました。 ●元ネタ vallog: クリスマスツリーを飾りました。Lispで。 パラメトロン計算機: クリスマス…

seq と LazyList

window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.paren…

F# の Project Euler 26 コードを改良した

昨日のエントリの続報です。 F#版改良コード 剰余シーケンス生成関数と、剰余の既出判定関数を一つにまとめました。パフォーマンスに悪影響を与えている疑惑がある 遅延シーケンス操作部分を無くすのが目的です。結果、桁違いに早くなりました。 前回 15 秒…

F# で Project Euler 26 を解いたら遅かった

問題はこれ : Problem 26 ● F# での解答 何故か遅い。うちの環境だと 15秒以上かかる。 ideone.com で試したらやはり同じくらいかかっているようで、タイムアウトでプロセスを kill されてた。 recurringLength に 再帰回数が大きくなるような引数*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)…

「数字混じり文字列ソートをClojureで」を改良してみた

一昨日のコードがどうも納得いかなかったので改良しました。 元ネタはどう書く?.org 「数字混じり文字列ソート」 ;; clojure 1.2.1 (use 'clojure.contrib.str-utils 'clojure.contrib.core) (defn apply-flip [f a b] (f b a)) (defn parse [s] (->> (re-p…

数字混じり文字列ソートをClojureで

面白そうな問題見付けたのでやってみた。 数字混じり文字列ソート ~ Rubyとの血みどろの闘い ~ 元は、どう書く.org のちょっと前のネタみたい。 (use 'clojure.contrib.str-utils) (defn apply-flip [f a b] (f b a)) (defn prepare [n xs] (->> xs (re-part…

無限シーケンスから組み合わせ生成

組み合わせ生成関数(無限シーケンス対応版)を作ってみました。 ;; Ver.1 (defn- combinations* [xs combs] (when-first [x xs] (let [new-combs (map (fn [c] (conj c x)), combs)] (lazy-cat new-combs (combinations* (rest xs) (concat combs new-combs…

続・エラトステネスの無限の篩

本題の前に、前回のコードを少し書き換えた*1ので、まずはそちらから。 ♯エラトステネスの無限の篩 Ver.1 アルゴリズム上の変更点は倍数リスト*2を「n を除く n の倍数」ではなく、「n^2 を初期値とする n の倍数」にしただけです。 (defn- diff-seq [s1 s2]…

エラトステネスの無限の篩

♯エラトステネスの篩とは 一般にエラトステネスの篩(ふるい)というと求める素数の上限を決めてそれ以下の整数(2以上)から素数の倍数を消すことで素数を篩い出すアルゴリズムです。詳細はwikipediaに分かり易く書かかれていますのでそちらをどうぞ。 こ…

Data.FiniteMap はもう無い

All About Monads (文字化け注意) の example4.hs が実行できない。 使われている Data.FiniteMap と、それ関連の関数が古いらしい。今は、Data.Map を使うらしい。 次のように修正したら動いた。 --- 24行目 - import Data.FiniteMap + import Data.Map ---…

プログラミングHaskellのunfoldを3言語で

プログラミングhaskell 7章の練習問題にある unfold について。 ※Haskell 標準関数 unfoldr の話ではないです。 ●まず haskellで 本で提示されてるコード unfold p h t x | p x = [] | otherwise = h x : unfold p h t (t x) わかりにくいので、パラメータの…

プログラミングHaskellの謎演算子

プログラミングhaskellを読んでいると、時々謎の演算子が現れて戸惑う。 前後の文脈等から察するとこんな感じでしょうか。できればコードそのままの記法をして欲しかった。 ∧ ⇒ && -- 論理積 ∨ ⇒ || -- 論理和 ‐の左端に下向きの鉤がついてる奴 ⇒ not -- 論…

サーバは vi で弄れと、誰が決めたんだ〜♪

GUI版Emacsには「Emacsの中でEmacsが起動できない」という弱点がある。リモートサーバのファイルを編集する場合、tramp を使うという方法もあるが、リモートの root 権限のファイルを弄るとかなると面倒臭い(不可能ではないらしいけど...)。 一番いいのは …

1000以下の回文素数で最大のものを示す

1000以下の回文素数で最大のものを示せ 示してみる。 (use '[clojure.contrib.lazy-seqs :only (primes)]) (defn palindromic-number? [n] (let [v (vec (str n))] (= v (reverse v)))) (defn last-palindromic-prime-number [limit] (->> primes (take-whil…

Pythonの分配束縛

◆タプルで分配束縛 x,y にまとめて値を代入するようなコードでは普通に使っていました。 (x,y) = (1,2) #あるいは x, y = 1, 2 でも、もっと複雑な構造でも、分配束縛できるのは知らなかった。 (a, (b, (c,)), d) = (1, (2, (3,)), 4) [a,b,c,d] #=> [1, 2, …

tree-seq と flatten

◆tree-seq をちゃんと理解したい 理解していなかったのでいろいろやってみた。 (defn tree-seq "Returns a lazy sequence of the nodes in a tree, via a depth-first walk. branch? must be a fn of one arg that returns true if passed a node that can h…

4引数で partition

一見単純だけど色々お世話になってる便利な関数 partition。4引数で呼び出せるのをしらなかった。 (def a [1 2 3 4 5 6 7 8 9 10 11]) ;; 2引数 (partition 4 a) ;=> ((1 2 3 4) (5 6 7 8)) ;; 3引数 (partition 4 3 a) ;=> ((1 2 3 4) (4 5 6 7) (7 8 9 1…

Clojureで連番リストの歯抜け取得

古い記事ですが、ちょっと面白い問題なのでやってみた。=> 連番リストの歯抜け ■(partition 2 1) って便利 (defn pick-toothless [coll] (->> coll (partition 2 1) (remove #(= -1 (apply - %))) (mapcat (fn [[a b]] (range (inc a) b)))))(pick-toothless…