やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。進行中のメモなのであちこち修正するかも。というか修正しまくりで全然進まないのでメモることにしたという。もう少しまとまったらLISPをみんなで勉強しよう!に投稿したい。
ちなみにMooseでlispなのでMoosp(ムースプ)だ。
まずNilとTはMooseX::SingletonでSingletonにした。
package Moosp::Nil;
use MooseX::Singleton;
with 'Moosp::Sexp';
sub str {"NIL"}
__PACKAGE__->meta->make_immutable;
no MooseX::Singleton;
1;
Tも一緒。
package Moosp::T;
use MooseX::Singleton;
extends 'Moosp::Atom';
with 'Moosp::Sexp';
sub str {"T"}
__PACKAGE__->meta->make_immutable;
no MooseX::Singleton;
1;
javaでlispだとSexpはインターフェースなのでMoose::Roleのクラスにしてみたけどこれでいいのかはわからない(まだ最後まで動かしてないので)。
package Moosp::Sexp;
use Moose::Role;
requires 'str';
sub print {
my $self = shift;
print $self->str;
}
sub serialize {
my $self = shift;
return $self->str;
}
no Moose::Role;
1;
Moosp::Atom
package Moosp::Atom;
use Moose;
__PACKAGE__->meta->make_immutable;
no Moose;
1;
モダンperl入門が手放せない