mzperl - Embed Perl in MzScheme


    (perl-use 'Config)
    (printf "<MzScheme> I'm running under Perl, version ~A.\n"
            (perl-eval "$Config{version}"))
    printf "<Perl> I'm running under MzScheme, version %s.\n",


Is it Scheme? Is it Perl? It's neither, it's both. It's MzPerl!

MzPerl is a "new language" that looks like MzScheme. As an added bonus, you'll get access to the full Perl runtime via the MzPerl API.

The mzperl script will normally be installed in the same directory as the perl binary on your system, for example as /usr/local/bin/mzperl.


The MzPerl API is just a set of MzScheme primitives that you can use to access the Perl runtime. They are the same set of primitives defined in all Language::MzScheme->new instances:

perl-eval code

Eval a string or symbol in Perl and return the result. There are 11 variants of this call, just like any other functions exported from Perl:

    ; list context calls
    (perl-eval "string")    ; if there is one return value, return it
                            ; as a scalar, otherwise returns a list
    (perl-eval@ "string")   ; returns a list
    (perl-eval^ "string")   ; returns a vector
    (perl-eval% "string")   ; returns a hash-table
    (perl-eval& "string")   ; returns an association-list

    ; scalar context calls
    (perl-eval$ "string")   ; returns a scalar of an appropriate type
    (perl-eval~ "string")   ; returns a string
    (perl-eval+ "string")   ; returns a number
    (perl-eval. "string")   ; returns the first character
    (perl-eval? "string")   ; returns a boolean (#t or #f)

    ; void context calls
    (perl-eval! "string")   ; always returns #<void>

perl-use module [ import-list ]

Loads a perl module, and optionally imports symbols from it, just like Perl's use keyword. Imported symbols are available in subsequent perl-eval calls, as well as in scheme code as primitives.

Fully-qualified names (Module::symbol) are always available.

perl-require module-or-filename

Loads a perl module or file, without importing any symbols.

perl-do filename

Evaluates a perl file. Also available in all 11 context forms like the perl-eval above.

;__PERL__; ... ;__END__;

The ;__PERL__; token begins a perl code region. It ends on the next ;__END__; token, or until the end of file.


Scheme has no CPAN. Perl5 has no macros and no continuations. So... :-)

Continuations? In Perl?

Yes. To wit:

    (let* ((yin ((perl-eval "sub { print $/; @_ }")
                 (call/cc (perl-eval "sub { @_ }"))))
           (yang ((perl-eval "sub { print '*'; @_ }")
                  (call/cc (perl-eval "sub { @_ }"))))) (yin yang))


Autrijus Tang <>


Copyright 2004 by Autrijus Tang <>.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.