package Lisp::Subr::Perl;

# Make many perl functions available in the lisp envirionment

use strict;
use vars qw($DEBUG $VERSION);

$VERSION = sprintf("%d.%02d", q$Revision: 1.4 $ =~ /(\d+)\.(\d+)/);

use Lisp::Symbol qw(symbol);

my @code;

# Perl builtins that does take zero arguments
for (qw(time times getlogin getppid fork wait)) {
    push(@code, qq(symbol("$_")->function(sub { $_ });\n));
}

# Perl builtins that take one optional argument
for (qw(sin cos rand srand exp log sqrt int hex oct abs ord chr
        ucfirst lcfirst uc lc quotemeta caller reset exit
        umask chdir chroot readlink rmdir getpgrp
        localtime gmtime alarm sleep
        require stat length chop chomp defined undef study pos
        -r -w -x -o -R -W -X -O -e -z -s -f -d -l -p -S -b -c
        -t -u -g -k -u -g -k -T -B -M -A -C
    ))
{
    push(@code, qq(symbol("$_")->function(sub { \@_==0?$_:$_ \$_[0] });\n));
}

print join("", @code) if $DEBUG;
eval join("", @code);
die $@ if $@;

# some additional stuff
symbol("perl-eval")->function(sub { eval $_[0] });

1;