Using srborlongan-picolisp:

(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:
  • Enjoy
  • Rosetta
  • Code


  • 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