kdi(今度行く)とitkt(行ってきた)

先日カットに行った時に美味しい店の話になって、

ブログで見かけた美味しそうな店はブックマークでリスト化してる

とかそういう話をした。

それにしても見ているブログがかぶるなぁと思い、帰ってきてからローカルネタのブログを数えたら120件くらいしかなかったので意外と少ない(と思ったがローカルネタにカテゴライズしてないブログもあるのでそういうの入れたら200件くらいにはなるか)。というより、よくよく考えてみるに食べ物関係のブログがかぶっているだけか。まぁ三島、沼津は少ないので、簡単に収束してしまうような気もする。

さらに、リスト化してるだけで、実際に行けてないんですよねー的な話もしていて、さすがに、これじゃいかんときちんとタグふって管理してみることにした。

今度行く

ブログに貼付けやすいようにmarkdownで出力

use URI;
use XML::Feed;
use Encode;

my $feed = XML::Feed->parse(URI->new('http://b.hatena.ne.jp/kzfm/rss?tag=kdi'))
  or die XML::Feed->errstr;
print $feed->title, "\n";
for my $entry ($feed->entries) {
  my $title = encode('utf8',$entry->title);
  my $link = $entry->link;
  print "- [$title]($link)\n";
}

これで、月に一回くらいまとめておけば、食欲が刺激されて吉。行ったとこにはitktとかタグふれば、達成率も管理できて尚よい。

あと、美容師さんのお薦めを聞いていたら、OPERAにいかねばならん気にさせられた。

MooseでLisp(MoospのFunction::Setq)

やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。

sub fun {
  my ($self, $arguments) = @_;
  my $arg1 = $self->eval->eval($arguments->cdr)->car;
  my $sym = $arguments->car;
  $sym->value($arg1);
  $self->env->put($sym,$sym->name);
  return $arg1;
}

束縛するものがリストだと、まだうまくいかない。

Moosp> (setq a 5)
5
Moosp> (setq b 2)
2
Moosp> (+ a b)
7
Moosp> (setq c (+ 1 2))
Attribute (value) does not pass the type constraint because: Validation
failed for 'Moosp::Sexp' failed with value Moosp::List=HASH(0xa2a110) at lib/Moosp/Function/Setq.pm line 22
Moosp::Function::Setq::fun('Moosp::Function::Setq=HASH(0xa208a0)',
'Moosp::List=HASH(0xa29a80)') called at lib/Moosp/Eval.pm line 93
Moosp::Eval::eval('Moosp::Eval=HASH(0xa1dcc0)',
'Moosp::List=HASH(0xa29fa0)') called at lib/Moosp.pm line 67
Moosp::run('Moosp=HASH(0x804320)') called at moosp.pl line 7

MooseでLisp(MoospのFunction::Add)

やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。

REPLまで出来て

(+ 1 2)

は動くのに

(+ (+ 1 2) 3)

が動かなくて、evalの再帰が悪いのかと思ったら、Functionのほうだった。

sub fun {
  my ($self, $arguments) = @_;
  my $arg1;
  my $ret =  Moosp::Integer->new(value => 0);
  return $ret if ($arguments->isa('Moosp::Nil'));

  while (1) {
    $arg1 = $self->eval->eval($arguments->car);
    $ret = $ret->add($arg1);
    last if ($arguments->cdr->isa('Moosp::Nil'));
    $arguments = $arguments->cdr;
  }
  return $ret;
}

carがfunctionの場合はcdr部は全て評価済みにしておかないといけないんだった。

やっとうまく動いた

Moosp> (+ (+ 1 2) (+ 3 4))
10

tak実行が見えてきた。

MooseでLispを実装してみる(REPL)

やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。(14日目のあたり)

REPLまでやって対話環境にしてみたら、エラーが出まくる。readerよりはevaluatorまわりの気がしないでもない。なんか細かいとこから見直さないといけなさそうなのでTest::Pod::Coverageとかちゃんと通るようにという気晴らしを。

明日から、帰省するので向こうでちまちまデバッグをする予定。ゴールデンウィーク中には最後(takの実行)までは行きたい。

MooseでLispを実装してみる(Eval)

やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。(13日目のあたり)

REPLのE、つまり評価器をつくる。これが終われば統合して処理系を完成させるのみ。

しかし10日目のCARがevalしたあとのcarを返すようになっているのだけど、evalはlistを戻さんよ?最後の処理系の完成のところで色々バグが見つかる予感(大)

MooseでLispを実装してみる(Readerのデバッグ)

やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。(12日目のあたり)

()がNilになるようにReaderをいじる。makeListメソッドをちょっと変えればいいだけ。

MooseでLispを実装してみる(ラムダリストと変数の局所化)

やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。(11日目のあたり)

lambda1

  1. argumentsをスタックに積む。その際積んだスタート地点を記憶しておく
  2. ラムダリストを順番にスタックの値と交換する(元の値は待避される)
  3. body部を評価する
  4. ラムダリストをスタックの値と交換する(元の値に戻す)
  5. 評価した値を返して終了

例としてa=>5,b=>1であるとき以下の式を評価してみる。

((lambda (a b) (+ a b)) 2 3)

スタックに引数の値を積む

lambda2

スタックの値とラムダリストの値を交換する

lambda3

body部を評価したらスタックに待避した値を戻す

lambda4

これでOK

Moospもこの通りに実装すればよいみたい。あとsexpEvalの

argList = (List)argList.cdr;

は必要ないような気がする。

MooseでLispを実装してみる(システム関数)

やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。(10日目のあたり)

評価系まわりを書き始めるが、ここらへんから妙に省略度が高くなっているので追いかけるのが大変。14日まで頑張れば一通りできるようなのだけどそこまでたどり着けるのが不安になってきた。

さて、関数はS式関数と内部的な関数(システム関数)があって、システム関数は別のクラスとしてつくる。Moosp::Functionってのを用意してその下にMoosp::Function::Car,Moosp::Function::Quoteとかのクラスを用意するようにしてみた。システム関数は初期化の時に一括して環境(Env)のほうに登録するようになっているようだ。

ん?envとかevalはどっから出てきたんだ?と探したら14日目で

// システム関数の登録
Function funs = new Function(env, eval);  // 関数クラスの設定
funs.registSystemFunctions();      // システム関数の生成

初期化時にenvとevalを渡すのね。10日目のFunctionクラスのコードは省略されていたのであとでまた見直す必要があるな。

MooseでLispを実装してみる(RPL)

やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。

READ-PRINT-LOOPまでのものを動かしてみる

$ perl moosp.pl 
Moosp> (1 2 3 4)
(1 2 3 4)
Moosp> (e r t)
(E R T)
Moosp> (2 . 3)
(2 . 3)
Moosp> (defun plus (a b) (+ a b))
(DEFUN PLUS (A B) (+ A B))

コード

package Moosp;

use Moose;
use Moosp::Env;
use Moosp::Reader;
use Term::ReadLine;

our $VERSION = 0.01;

sub run {
  my $self = shift;

  my $term = new Term::ReadLine 'Simple LISP REPL';
  my $prompt = "Moosp> ";
  my $OUT = $term->OUT || \*STDOUT;

  while ( defined ($_ = $term->readline($prompt)) ) {
    my $reader = Moosp::Reader->new();
    my $sexp = $reader->readFromString($_);
    warn $@ if $@;
    print $OUT $sexp->serialize(), "\n" unless $@;
  }

}

__PACKAGE__->meta->make_immutable;

no Moose;

1; # End of Moosp

moosp.pl

#!/usr/bin/env perl    
use lib "./lib";    
use Moosp;    
Moosp->new->run();

MooseX::Singletonの継承

MooseX::Singletonでuseしたクラスが継承している場合instanceで呼ばれたオブジェクトはスーパークラスのメソッドを呼べないという挙動ではまった。

package Foo;
use Moose;

sub p { return "XXX" }

package Sng;

use MooseX::Singleton;

extends 'Foo';

package main;

my $sng_new = Sng->new();
warn $sng_new->p();

my $sng_instance = Sng->instance;
warn $sng_instance->p();

実行

$ perl ms.pl 
XXX at ms.pl line 15.
Can't locate object method "instance" via package "Sng" at ms.pl line 17.

version

$ perl -MMooseX::Singleton\ 999
MooseX::Singleton version 999 required--this is only version 0.14.