メメメモモ

プログラミング、筋トレ、ゲーム、etc

Acme::Lisp

http://search.cpan.org/~ambs/Acme-Lisp-0.03/lib/Acme/Lisp.pm


下記のようにLispの計算を評価してくれます。

use strict;
use warnings;
use Acme::Lisp;

# 引き算                                                                
my $lisp_code = [ qw(- 1 2 3 4) ];
print eval_lisp($lisp_code) ,"\n";

# 再帰的なリストも評価できる                                      
my $rec_code = [qw(+ 1 2)];
my $lisp_code2 = [qw(- 1 2 3),$rec_code];
print eval_lisp($lisp_code2) , "\n";


Acme::Lispでは、下記のような形で、算術処理を記述しています。

BEGIN {
    $eval{'+'} = sub { my $ans = 0; $ans += $_ for @_; return $ans };
    $eval{'-'} = sub { my $ans = shift @_; $ans -= $_ for @_; return $ans };
    $eval{'*'} = sub { my $ans = 1; $ans *= $_ for @_; return $ans };
    $eval{'/'} = sub { my $ans = shift @_; for (@_) {
        if ($_) { $ans /= $_ } else { die "division by zero\n" }}; return $ans };  
    $eval{'exit'} = sub { exit };
    $eval{'quit'} = sub { exit };
}


四則演算のみ定義してますね。