|
From: Shinya H. <te...@to...> - 2003-04-27 06:44:00
|
Hi all, I am new to this list.
-- Thanks shapr for a developer account.
I've just wrote a library for embedding Perl.
$ cat Perl.hs
module Language.Perl
( new -- :: IO PERLREF
, eval -- :: PERLREF -> String -> IO ()
) where
import Foreign hiding (new)
import Foreign.C
type PERL = Ptr ()
type PERLREF = ForeignPtr ()
foreign import ccall "perl_alloc" perl_alloc :: IO PERL
foreign import ccall "perl_construct" perl_construct :: PERL -> IO ()
foreign import ccall "perl_parse" perl_parse :: PERL -> FunPtr () -> Int
-> Ptr CString -> Ptr CString -> IO ()
foreign import ccall "perl_run" perl_run :: PERL -> IO ()
foreign import ccall "perl_destruct" perl_destruct :: PERL -> IO ()
foreign import ccall "perl_free" perl_free :: PERL -> IO ()
foreign import ccall "_eval_pv" _eval_pv :: PERL -> CString -> IO CString
foreign import ccall "&xs_init" xs_init :: FunPtr ()
new :: IO PERLREF
new =
perl_alloc >>= \my_perl ->
perl_construct my_perl >>
newCString "" >>= \a1 ->
newCString "-e" >>= \a2 ->
newCString "0" >>= \a3 ->
newArray [a1, a2, a3] >>= \argv ->
perl_parse my_perl xs_init 3 argv nullPtr >>
perl_run my_perl >>
newForeignPtr my_perl (destructPerl my_perl)
where
destructPerl perl = perl_destruct perl >> perl_free perl
eval :: PERLREF -> String -> IO String
eval perl str = do
res <- withForeignPtr perl $ \p -> withCString str (_eval_pv p)
peekCString res
$ cat wrapper.c
#include <EXTERN.h>
#include <perl.h>
#ifdef PERL_IMPLICIT_CONTEXT
char* _eval_pv(pTHX_ const char *p) {
#else
char *_eval_pv(void *dummy, char *p) {
#endif
SV *sv = eval_pv(p, TRUE);
return SvPV(sv, PL_na);
}
EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
EXTERN_C void
xs_init(pTHX)
{
char *file = __FILE__;
newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
}
$ ghc -fglasgow-exts -c Perl.hs wrapper.c \
-optc '`perl -MExtUtils::Embed -e ccopts`' \
-optl '`perl -MExtUtils::Embed -e ldopts`'
$ mkdir Language && cp Perl.hi Language/
$ cat try.hs
module Main where
import qualified Language.Perl as Perl
main = do
perl <- Perl.new
html <- Perl.eval perl $
"use LWP::Simple;" ++
"get 'http://haskell.org/';"
putStr html
$ ghc -fglasgow-exts -o try try.hs Perl.o wrapper.o -optl \
'`perl -MExtUtils::Embed -e ldopts`'
$ ./try
-- Wow!
I have to consider a way to build and use the library.
And I am planning to write a Language.Ruby, Language.Python,
and Template engine like the Temlate-toolkit(*).
[*] http://www.template-toolkit.org/
--
SH
te...@to...
|