(download .zip file at https://code.google.com/r/srborlongan-picolisp/source/browse/)
(when (< (javaVersion T) (1 8) ) (error "Please run Ersatz PicoLisp on a Java 8+ VM to load this file." (javaVersion) ) ) (symbols "concurrentComputing" 'pico) (javaImport java.io.PrintStream java.lang.Runnable (java.util Arrays function.Consumer stream.Stream) ) (local *ObjectArrayClass *Message *ConcurrentComputing) (setq *ObjectArrayClass (.getClass> (array) ) *Message "Enjoy Rosetta Code" *ConcurrentComputing (passMethodHandle (methodHandle "Virtual" Stream.class "forEach" Void.TYPE Consumer.class) (thread "Virtual" (methodHandle BaseStream.class "parallel" BaseStream.class) (castMethodHandle Stream.class Stream.class) ) (methodHandle "Static" Arrays.class "stream" Stream.class *ObjectArrayClass) (thread *Message chop (split " ") (map+ mapcar pack) (map+ mapcar '(@ (thread (passMethodHandle (methodHandle "Virtual" PrintStream.class "println" Void.TYPE Object.class) (constantMethodHandle System.out PrintStream.class) (constantMethodHandle (next) Object.class) ) (methodHandleAsFunctionalInterface Runnable.class) ) ) ) (constantMethodHandle *ObjectArrayClass) ) (thread Runnable.class (functionalMethodHandle Void.TYPE) (methodHandleAsFunctionalInterface Consumer.class) (constantMethodHandle Consumer.class) ) ) ) (when *ConcurrentComputing (de pico~concurrentComputing () (invokeMethodHandle *ConcurrentComputing) ) )
Displays the following in any order:
Please note that while Java 7's invokedynamic functions are used to provide function-pointer-like functionality in this example, the reference Stream class (for map-reduce operations) are from Java 8.
Invokedynamic functions are used to translate thread-unsafe PicoLisp code into less-thread-unsafe Java function pointers (lambdas only exist in Java 8).
Stream is used to easily reproduce the concurrent computation requirements of the original Rosetta Code example.
http://picolisp.com/wiki/?invokedynamic
28oct13 | srborlongan |