NAME

ecl - Perl extension for ECL lisp

SYNOPSIS

  use ecl;
  my $cl = new ecl;
  my $r = $cl->eval("(format nil \"[~S]\" 'qwerty)");
  my $lam = $cl->eval("(lambda (x y) (+ x y))");
  $lam->funcall(5,9); # results 14

DESCRIPTION

ecl is a bit easier to use than Language::Lisp because of embeddable nature of ECL lisp. Language::Lisp uses different approach because they are other way down: Lisp calls Perl and not vice versa.

new()

The new method used to create ecl object which is used to talk with underlying lisp. This object looks like an interpreter instance, although there is actually no interpreter instance created. Instead, this object is used to create a handy way of invoking API: given that you have $cl object you can execute:

  my $res = $cl->eval("(format nil \"~A\" (expt 2 1000))");

which is equivalent to

  my $res = ecl::eval(undef, "....");

but is much better to use.

Passing parameters to ECL and getting results from ECL

Required Perl objects converted to Lisp objects and vice versa. Compatible types are converted as-is (e.g. ECL type t_integer becomes SvIV), all other types are blessed into some package, for example into ecl::Symbol

This is done behind the scenes and user should not bother about this.

This makes following code to work:

  my $lam = $cl->eval("(lambda (x y) (+ x y))");
  print $lam->funcall(40,2);     # prints 42
  print $cl->funcall($lam,40,2); # ... another way to say the same

$cl->eval(string)

runs string within ECL interpreter and returns whatever lisp returns to us. Internally this transforms to the call si_safe_eval(...);

$cl->eval(lisp_object)

same as eval but takes lisp object instead of string as argument.

$cl->keyword("QWERTY")

returns LISP keyword as a symbol (from Perl side this means it is blessed to ecl::Symbol package). In Lisp this symbol belongs to the 'keyword' package. These keywords correspond to lisp's :keywords.

$lispobj->funcall(...)

given lisp object blessed to package ecl::Code calls the procedure.

other way round: perl-ev

 (prin1 (perl-ev "join (',','a'..'z'). qq/hello!/" ) )

AUTOLOADing

$cl->someFunctionName(args) get transformed into function call to "some-function-name"

This is done by finding lisp object for evaluating arguments, and blessing it into ecl::Code package

  $cl->prin1("qwerty");

ECL Objects

ecl::Symbol

LISP symbols are blessed to this package

ecl::Package =head3 ecl::String

ecl::Char

Object to represent character type within Lisp. Here are 3 equivalent ways to get it:

  $ch = $cl->char("c");
  $ch = $cl->char(ord("c"));
  $ch = ecl::_char("c");

Another way is:

  $ch = $cl->eval('#\c');

ecl::Code =head3 ecl::Generic

ecl::Ratio

t_ratio

ecl::Bignum

t_bignum

ecl::List

If you have a list object in Lisp, it will be automatically blessed into the ecl::List package:

  my $list = $cl->eval("'(a b c d qwerty)");

List object have item(n) method to return n-th value from the list.

List object have TIEARRAY, FETCH, FETCHSIZE methods and so ready for tie-ing as array with a tie perl funciton:

  tie my @arr, "ecl::List", $list;

Even simplier, $list have _tie method to return tied array reference:

  my $arr = $list->_tie;

Fetching items from this array works, storing them currently do not work.

ecl::HashTable

EXPORT

None. No namespace pollution, the greens are happy.

BUGS

  • ECL uses Boehm GC, and at the moment of writing it did not had reliable interface on returning memory to GC, so the leaks of memory are unavoidable.

  • funcall can not take more than 10 args - this should be fixed.

SEE ALSO

Language::Lisp

See ecls.sf.net to read about ECL lisp project. See github.com/vadrer/perl-ecl

AUTHOR

Vadim Konovalov, <vkon@cpan.org>

COPYRIGHT AND LICENSE

Copyright (C) 2008 by VKON

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.004 or, at your option, any later version of Perl 5 you may have available.