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... |