Language-LispPerl

 view release on metacpan or  search on metacpan

OLD_README.md  view on Meta::CPAN

# CljPerl

CljPerl is a Lisp implemented by Perl. It borrows the idea from Clojure,
which makes a seamless connection with Java packages.
Like Java, Perl has huge number of CPAN packages.
They are amazing resources. We should make use of them as possible.
However, programming in Lisp is more insteresting.
CljPerl is a bridge between Lisp and Perl. We can program in Lisp and
make use of the great resources from CPAN.

## Key features

 * Seamless connection with Perl.
 * Coroutine.
 * Actor.(experimental)
 * Native XML form which could be used to create web page template.

## Example

	;; file t.clp
	(defmacro defn [name args & body]
	  `(def ~name
	     (fn ~args ~@body)))
	
	(defn foo [arg]
	  (println arg))
	
	(foo "hello world!") ;comment here
	
	(foo (+ 1 2))
	
	(.CljPerl print "Hi\n")
	
	(. print "Guy\n")

	(defmulti mf type)
	(defmethod mf "string" [a] (println "string"))
	(defmethod mf "keyword" [a] (println "keyword"))
	(mf "test")
	(mf :test)

	(def c (coroutine
	  (println "b")
	  (coro-sleep)
	  (println "d")))

	(println "a")
	(coro-resume c)
	(println "c")
	(coro-resume c)


	(def a (actor
	  (println "a")
	  (actor-send (actor-receive) "exit")
	  (println "b")))

	(actor-send a (actor-self))
	(println (actor-receive "exit")

	------------------

	> bin/cljp t.clp

## Install

	cpan install CljPerl

## Lisp <-> Perl

CljPerl is hosted on Perl. Any object of CljPerl can be passed into Perl and vice versa including code.

An example of using Perl's IO functions.

####### Perl functions in CljPerl.pm

	package CljPerl;
	
	sub open {
	  my $file = shift;
	  my $cb = shift;
	  my $fh;
	  open $fh, $file;
	  &{$cb}($fh);
	  close $fh;
	}
	
	sub puts {
	  my $fh = shift;
	  my $str = shift;
	  print $fh $str;
	}
	
	sub readline {
	  my $fh = shift;
	  return <$fh>;
	}
	
####### CljPerl functions in core.clp

	(ns file
	  (defn open [file cb]
	    (. open file cb))
	
	  (defn >> [fh str]
	    (. puts fh str))
	
	  (defn << [fh]
	    (. readline fh)))



( run in 0.562 second using v1.01-cache-2.11-cpan-39bf76dae61 )