Swing REPL written in Ersatz PicoLisp

This is just a very simple illustration of what can be done combining PicoLisp and Java. Go ahead and make your own more powerful version!

#!ersatz/pil

(setq
   Frame (java "javax.swing.JFrame" T "Ersatz PicoLisp")
   ContPane (java Frame 'getContentPane)
   ResOut (java "javax.swing.JTextArea" T 5 20)
   ProgIn (java "javax.swing.JTextArea" T "(prinl 11) (+ 22 33)") )

(de isReturnKey (KeyCode)
   (= (java KeyCode) 10) )

(de handleKeyEvent (KeyEvt)
   (let (KeyCode (java KeyEvt 'getKeyCode)
         KeyText (java KeyEvt 'getKeyText KeyCode) )
      #(prinl KeyCode " " KeyText) (java ResOut 'append KeyText)
      (when (isReturnKey KeyCode)
         (let (ProgText (java ProgIn 'getText)
               Prog (str ProgText)
               Result (run Prog) )
            #(java ResOut 'append (pack (pack (clip (chop ProgText))) "^J"))
            (java ResOut 'append (pack (sym Prog) "^J"))
            (java ResOut 'append (pack "-> " (sym Result) "^J")) ) ) ) )

(let Font (java "java.awt.Font" T "Verdana" 0 16)
   (java ResOut 'setFont Font)
   (java ProgIn 'setFont Font) )

(java ProgIn 'addKeyListener
   (interface "java.awt.event.KeyListener"
      'keyTyped nil
      'keyPressed handleKeyEvent
      'keyReleased nil ) )

(java ContPane 'setLayout (java "javax.swing.BoxLayout" T ContPane
   (public "javax.swing.BoxLayout" 'Y_AXIS) ) )
(java ContPane 'add (java "javax.swing.JScrollPane" T ResOut))
(java ContPane 'add (java "javax.swing.JScrollPane" T ProgIn))

(java Frame 'pack)
(java Frame 'setLocation 60 80)
(java Frame 'setSize 600 400)
(java Frame 'setDefaultCloseOperation (public "javax.swing.JFrame" 'EXIT_ON_CLOSE))
(java Frame 'setVisible T)

(java ProgIn 'grabFocus)
(let ProgLen (length (java ProgIn 'getText))
   (java ProgIn 'setSelectionEnd ProgLen)
   (java ProgIn 'setSelectionStart ProgLen) )

https://picolisp.com/wiki/?swingrepl

01jan12   Jon