Lisp が広く使われるようになった将来。Lisp プログラマが他言語を使わなくてはならないとき、とまどうことが多いかと思います。そのような将来必要になる情報をまとめることで逆に現在 Lisp プログラマを増やせるのではないか?という作戦です。 http://www.norvig.com/python-lisp.html , http://www.unixuser.org/~euske/doc/python/python-lisp-j.html 「Lisp プログラマのためのPython」入門を意識しています。 Perl/Lisp に詳しい方に足していただければ、、と思います。
Lisp/Perl はインタプリタ型|コンパイラ型で、オブジェクト指向を備えた高水準プログラミング言語です。
| Key Feature | Lisp Feature | Perl 5 Feature | Perl 6 Feature |
| すべてはオブジェクト | Yes | No | Yes |
| リストにいろいろなものを入れられる | Yes | Yes | Yes |
| 複数のパラダイム | Yes | Yes | Yes |
| 記憶管理 | GC | Reference Counter | GC (parrot) |
| マクロ | Yes | No (ただしSource Filterあり) | Yes |
| 対話的なループ | Yes | No (perl -de 1) | YES |
| 簡潔かつ表現力ある言語 | |||
| プラットフォーム間での移植性 | Windows, Mac, Unix, Linux | Windows, Mac, Unix, Linux | Windows, Mac, Unixen ... |
| 実装の数 | たくさん | ひとつ | 複数 (ただし現時点ではpugsのみ) |
# 加算関数
#!/usr/bin/perl
use strict;
use warnings;
sub make_adder {
my $n = shift;
return sub { my $x = shift; return $x + $n; };
}
my $add3 = make_adder(3);
printf "%s\n", $add3;
printf "> %s\n", $add3->(2);
my $add27 = make_adder(27);
printf "%s\n", $add27;
printf "> %s\n", $add27->(2);
# counter
sub counter {
my $counter = 0;
# reset and stamp
return ( sub { $counter = 0; return $counter; }, sub { $counter++; return $counter; } );
}
my ($reset, $stamp) = counter();
printf "%s %s\n", $reset, $stamp;
printf "%s %s %s %s\n", $stamp->(), $stamp->(), $reset->(), $stamp->();
# 上記の例
sub make_adder($n){ sub($x){ $x + $n } }
sub counter {
my $counter = 0;
return ( sub{ $counter = 0 }, sub{ $couter++} );
}
# closureいろいろ
sub($x){ $x + 1 } # 基本形
-> $x { $x + 1 } # -> を使うとargumentを()でくくらなくてもよい
{ $^x + 1 } # placeholderを使って
# 無名なのにcombinatorなしで再帰!
{ $^n <= 1 ?? 1 !! $^n * &?BLOCK($^n - 1) }.(10) # fact(10)