<   2008年 01月 ( 13 )   > この月の画像一覧
Perl で Church数をいじってみた
Church数をちゃんと理解できているかいまいち不安だったので、Perl でちょっといじってみた。

まず、SICP の問題2.6の、zero と add-1(ついでに one)を Perl に移植。

my $zero = sub {
my $f = shift;
sub { my $x = shift; $x }
};

my $one = sub {
my $f = shift;
sub { my $x = shift; $f->($x) };
};

sub add_1 {
my $n = shift;
return sub {
my $f = shift;
return sub {
my $x = shift;
$f->( $n->($f) ($x) )
};
};
}

my $two = add_1($one);

# 数値に戻してみる
print $zero->( sub { $_[0] + 1 } ) (0); #=> 0
print $one->( sub { $_[0] + 1 } ) (0); #=> 1
print $two->( sub { $_[0] + 1 } ) (0); #=> 2


add_1 をもとに、任意の2つの数の加算ができるように変形。
$m->($f) で m の数をつくって、その回数分 $n->($f) ($x) を繰り返してやる。

sub add {
my ( $n, $m ) = @_;
return sub {
my $f = shift;
return sub {
my $x = shift;
$m->($f) ( $n->($f) ($x) );
};
};
}

my $three = add( $one, $two );
my $five = add( $two, $three);

# 数値へ
print $three->( sub { $_[0] + 1 } ) (0); #=> 3
print $five->( sub { $_[0] + 1 } ) (0); #=> 5


加算が出来ると、乗算も割と楽。
$m の回数分 $n->($f) を繰り返してやって、それを $x に適用させる。
# 上の add と比べて、変わってるのは * の部分だけ。

sub multi {
my ( $n, $m ) = @_;
return sub {
my $f = shift;
return sub {
my $x = shift;
$m->( $n->($f) ) ($x); # *
};
};
}

my $six = multi( $two, $three );

# 数値へ
print $six->( sub { $_[0] + 1 } ) (0); #=> 6


この調子で Y-combinator にまで進もうと思ったけど、Perl だと遅延評価が必要とか、Z-combinator とか言われて、正直よく分からんかった。。。

とりあえず、lambda だけで無限ループ(再帰)するのは簡単だよね、というところまで。

# 無限ループ(再帰)
my $omega = sub {
my $f = shift;
$f->($f);
};
$omega->($omega);



一応、Y-combinator がちゃんと理解できるまで続く予定。


参考サイト:
404 Blog Not Found:TuringとChurchの狭間で
The Mellow Musings of Dr. T : Recursive lambda expressions
[PR]
by fkmn | 2008-01-30 23:55 | IT
gauche.night のチケットを買った
 最近、SICP を再開した影響で、ムラムラと Scheme 熱が高まってきたので、gauche.night にも行ってみる事にした。当日頃までには、SICP も終盤ぐらいまでには読み進めておきたいなぁ。

 あと、R6RS はおろか、R5RS も読んだ事がないので「あとで読む」。
[PR]
by fkmn | 2008-01-29 23:55 | 日記
Perl の reduce (List::Util) で配列を作る方法
SICP の2.2.3節あたりを読んでいたら、思いついたのでメモ。

いままで reduce で配列を作る方法がいまいち分かってなかったんだけど、以下のようにすればいい。

例えば、1から3までの数字について、元の数字とその数字を2乗した数の対の配列を作る場合はこう。

my @array = 1 .. 3;
my $array_ref = reduce { [ @{$a}, [ $b, $b**2 ] ] }[], @array;
print YAML::Dump($array_ref);

実行結果

---
-
- 1
- 1
-
- 2
- 4
-
- 3
- 9

初期値に空の配列リファレンスを入れておいてやるのが(個人的な)ポイント。

Perl の(というより List::Util の)reduce は初期値を設定できなくて使いづらいと思ってたんだけど、ただ単に、配列の先頭に初期値を突っ込んでやればいいだけだった。コロンブスの卵。


参考サイト:
畳み込み関数の比較 (fold / accumulate / inject / reduce) - blanket sky
[PR]
by fkmn | 2008-01-24 23:55 | IT
Scheme-mode で C-cC-l した時に自動でファイルを保存させるようにした
 Emacs の Scheme-mode で C-cC-l でファイルをロードする時に、ファイル(buffer)が編集中だと、いちいち保存の確認をされるのがウザかったので、そういう時は、自動でファイルを保存するようにしてみた。

 ということで、cmuscheme.el を以下のように変更。
# 僕の環境(Mac OSX の Carbon Emacs)では、
# /Applications/Emacs.app/Contents/Resources/share/emacs/22.0.97/lisp/
# に格納されていた。)

*** cmuscheme.el.orig 2008-01-24 00:03:32.000000000 +0900
--- cmuscheme.el 2008-01-24 00:25:24.000000000 +0900
***************
*** 436,446 ****
--- 436,453 ----
`scheme-compile-file' command. Used for determining the default
in the next one.")

+ (defcustom cmuscheme-always-save-buffer t
+ "*Non-nil means save the current buffer without asking before loading a file."
+ :type 'boolean
+ :group 'cmuscheme)
+
(defun scheme-load-file (file-name)
"Load a Scheme file FILE-NAME into the inferior Scheme process."
(interactive (comint-get-source "Load Scheme file: " scheme-prev-l/c-dir/file
scheme-source-modes t)) ; t because `load'
; needs an exact name
+ (if cmuscheme-always-save-buffer (save-buffer))
(comint-check-source file-name) ; Check to see if buffer needs saved.
(setq scheme-prev-l/c-dir/file (cons (file-name-directory file-name)
(file-name-nondirectory file-name)))


で、使う場合は、.emacs に以下の設定を追加する。

(setq cmuscheme-always-save-buffer t)


 "cmuscheme-always-save-buffer" という変数に true が設定されていると、C-cC-l 実行時に自動でファイルが保存される。nil が設定されている場合は、元のとおり、ファイルが保存されていない場合は確認してくる。

 と、まぁ、こんな感じにしてみました。
[PR]
by fkmn | 2008-01-23 23:55 | IT
SICP リベンジ
 先週から、SICP を再開している。

 第2章の最後のあたりで止まってしまってからしばらく経っていたので、もう一度最初から流し読みしている。最初に読んだときは、書いてあることに違和感というか異物感のようなものを感じていたんだけど、読み直してみると、結構すらすらと頭に入ってきて面白い。

 Church数のところなんかは、ほとんどチンプンカンプンだったが、いま読み直してみると、そこまででもないし、弾さんの説明も何となく分かる。

 さて、この調子でどこまで行けるかなぁ。
[PR]
by fkmn | 2008-01-20 23:55 | 日記
プログラマの実力を決めるもの
学生プログラマの「実力差」は、「麻雀」と「囲碁」の差 - Text::EasyHacking
だから、「囲碁」であると気づいている人間は、情報を集めて勉強して、ひたすらコードを書いて、どんどん「強く」なっていく。

 "学生" は外してしまって、単に "プログラマ" としても問題ないんじゃないかなぁ。特に、「誰がやっても変わらない」という意識は、企業(特にSI屋)の人間の方が高いと思う。だからこそ "人月" という単位が重宝されるわけで。

さらに学生プログラマの場合に言えるのは、「その事実に気づいていない人の割合が高い」ということ。

 社会人的に少し書き直すと「その事実に薄々気づいているが、あえて無視している人の割合が高い」という風になりそう(笑)。


Matzにっき(2008-01-04)(リンク先引用元:The Mythical 5%
80%の技術者は、本を読まない、イベントに参加しない、勉強しない。それでどうして、それらを継続的に行う開発者と同等の生産性をあげることができるのか。それらを行う20%のうち、さらに80%は、(まだ)うまく成果をあげられていない。すると、それらを継続的に行い、さらにうまくいっている人はおおよそ5%になる。

「継続は力なり」ですな。僕も頑張っていこう。
# もっとも、今の会社で、プログラマ的技量がどこまで求められているかは疑問だけど。
[PR]
by fkmn | 2008-01-17 23:55 | 日記
デブサミ2008の参加申し込みをした
Major tech conferences in Japan | Asiajin

Asiajin で、今年のデブサミが2月に開催されるのを知った。なんだか、Joel が来るとかいう話なので「これはもう行くしかない!」と、速攻で参加登録。

他にも、いろいろ興味があるセッションに登録。結構悩ましいタイムテーブルだなぁ・・・。


つーか、よくよく考えてみると、来月って結構忙しいかも。
ちゃんと参加できるか、不安。
[PR]
by fkmn | 2008-01-15 23:55 | 日記
livedoorクリップのタグをリネームする "Perl" スクリプト
livedoorクリップのタグをリネームするRubyスクリプト - むぅもぉ.jp
たぶんPerlで書いたらCPANのモジュール使えるかっらもっとシンプルに書けたのかな。

API, delicious compatible - livedoor クリップ まとめサイト - livedoor Wiki(ウィキ)
Net::Delicious を endpoint 変更のみでそのままご利用いただけます。


面白そうだったのと、Net::Delicious を使うと簡単に出来そうだったので、やってみました。

ldc_tag_rename.pl

use strict;
use warnings;
use Net::Delicious;

my $livedoor_id = "your_livedoor_id";
my $apikey = "your_api_key";

my $old_tag = shift or die "usage: $0 old_tag [new_tag]\n";
my $new_tag = shift;

my $ldc = Net::Delicious->new(
{ user => $livedoor_id,
pswd => $apikey,
endpoint => 'http://api.clip.livedoor.com/v1/',
debug => 0,
}
);

for my $post ( $ldc->posts( { tag => $old_tag } ) ) {
my $tags = $post->tags;
$tags =~ s/$old_tag/$new_tag/;

$ldc->add_post(
{ url => $post->url,
description => $post->description,
extended => $post->extended,
tags => $tags,
}
);
print $post->url, "\n";
sleep 1;
}


スクリプトの "your_livedoor_id" の部分に livedoor の ID、"your_api_key" の部分に API Key を入力してから使います。

実行する時は、コマンドライン引数に「変換前のタグ」と「変換後のタグ」を指定します。「変換後のタグ」を指定しないと、タグが削除されます。

# perl ldc_tag_rename.pl google Google


元エントリと同様に、実際に使う場合は自己責任でお願いします。自分で使ってみた限りでは、特に問題なく動作しましたが。


余談だけど、Net::Delicious に "$obj->rename_tag(\%args)" というメソッドがあって、一瞬期待したけど、livedoor クリップではまだ実装されていないらしかった。残念。


# 元エントリに trackback 打とうと思ったけど、URL が分からないなぁ。
[PR]
by fkmn | 2008-01-14 23:55 | IT
「なぜ通勤に電車を使わないの?」と尋ねられたならば、僕は「BMI が25を越えたからさ」と答えるだろう
BMI が 25 を越えました。


BMI が 25 を越えるというのはどういう事か簡単に説明すると

「肥満」

の一言に尽きます。(参考:ボディマス指数 - Wikipedia


ヤバイ


ここだけの話、実は体脂肪率も結構高かったりします(最近計ってませんが)。


マジヤバイ



ということで、少しでもこの状況を改善すべく、
通勤の際に、会社の少し手前の駅で降りて、そこから歩くようにしました。

時間にして、片道約30分。


これで、少しでも痩せたらいいなぁ。
[PR]
by fkmn | 2008-01-11 23:54 | 日記
Perl の my と local と our
すっきりした>< - YoshioriのBlog
our 名前をスコープに限定. local 値をスコープに限定. my 名前と値の両方をスコープに限定

local と my - IT戦記
404 Blog Not Found:perl - myとourとscopeと
[Perl] my と local と our の違いについて - TAKESAKOのはてな出張所

 Yoshioriさんのエントリの言葉が、それぞれの特徴を端的に言い表していて面白い。ただ、分かりやすいのは、やっぱり竹迫さんの説明かな。

 僕自身が、この辺の local と my (と our)の違いが分かったと言えるようになったのは、「Effective Perl」の23章を読んでからかなぁ。「Effective Perl」は、local とか my とかで悩むぐらいに Perl に慣れた頃に読むと、役に立つ本だと思う。

Effective Perl (ASCII Addison Wesley Programming Series)
Amazon.co.jp: Effective Perl (ASCII Addison Wesley Programming Series): 本: ジョセフ・N. ホール,ランドル・L. シュワォーツ,Joseph N. Hall,Randal L. Schwartz,吉川 邦夫
[PR]
by fkmn | 2008-01-10 23:55 | IT


とあるWebアプリケーションエンジニアの日記
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
プログラミングが「出来る..
from とりあえず9JP?
Genographic ..
from ナンジャモンジャ
ジュセリーノ
from ありの出来事
くちこみブログ集(ライフ..
from くちこみブログ集(ライフ)(..
以降、丁寧語で行こう!
from エッセイ的な何か
人気ジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX