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)