Acme::Lisp - Evals lisp code on array references


Acme-Lisp documentation Contained in the Acme-Lisp distribution.

Index


Code Index:

NAME

Top

Acme::Lisp - Evals lisp code on array references

VERSION

Top

Version 0.03

SYNOPSIS

Top

    use Acme::Lisp;

    my $lisp_code = [ qw(- 1 2 3 4) ];

    eval_lisp($lisp_code) # return -8

EXPORT

Top

eval_lisp

This method receives a reference to a Perl list with lisp code, and evaluates it, returning the value obtained with the evaluation.

Currently supported clisp:

+

Sums values

-

Subtracts values

*

Multiply values

/

Divide values (at the moment, real division)

exit

Exits que program execution (same as quit)

quit

Quits the program execution (same as exit)

NOTE

Top

This is a concept module. If I have time, maybe I'll add some functions. If not, well, you can send me patches.

AUTHOR

Top

Alberto Simões, <ambs@cpan.org>

BUGS

Top

At the moment division is done as real values, and not fractions as usual on common lisp.

Please report any bugs or feature requests to bug-acme-lisp@rt.cpan.org, or through the web interface at http://rt.cpan.org. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

COPYRIGHT & LICENSE

Top


Acme-Lisp documentation Contained in the Acme-Lisp distribution.
package Acme::Lisp;

use warnings;
use strict;

require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(eval_lisp);

our %eval;

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 };
}

our $VERSION = '0.03';

sub eval_lisp {
  my $code = shift;

  #print Dumper($code);

  return $code unless ref $code eq "ARRAY";

  my $func = shift @$code;
  if (exists($eval{$func})) {
    return &{$eval{$func}}(map {eval_lisp($_)} @$code);
  } else {
    die "Unknown function '$func'\n";
  }
}



1; # End of Acme::Lisp