{prompt←4↑''} (eval ##.repl) stop ⍝ Read-eval-print loop. [repl] uses quote-quad (⍞) to input an argument for operand function [eval]. The result is displayed in the session and the loop repeated until [stop] is input. In particular, if [stop] is '', repl terminates when an empty line is entered. Ref: http://en.wikipedia.org/wiki/Read-eval-print_loop Technical note: [repl] reports 'Eh?' if the operand function generates an error. The error-guard is isolated in an inner function in order to preserve tail-call optimisation in the main loop. This is a consequence of error-guards' having dynamic as opposed to lexical scope. Without such isolation the loop would accumulate stack frames with successive interactions. repl←{ ⍝ Read-eval-print loop. ⍺←4↑'' ⍝ default prompt expr←(≢⍺)↓⍞⊣⍞←⍺ ⍝ read expression expr≡,⍵: ⍝ matches terminator: quit. expr∧.=' ':⍺ ∇ ⍵ ⍝ blank line: ignore. ⎕←⍺⍺{ ⍝ print 0::'Eh?' ⍝ catching all errors ⍺⍺ ⍵ ⍝ eval }expr ⍝ of expr ⍺ ∇ ⍵ ⍝ loop } Examples: ⌽ repl'→' ⍝ reverse of input. hello olleh world dlrow → ⎕size repl ')' ⍝ size of object display 3588 repl 684 notes 1363400 ) ⍎ repl '' ⍝ mini-session until null input. 2+3 5 ⍳3 1 2 3 display∘⍎ repl')' ⍝ boxed output 1 2 + 3 4 ┌→──┐ │4 6│ └~──┘ 1 2 + ⊂3 4 ┌→────────────┐ │ ┌→──┐ ┌→──┐ │ │ │4 5│ │5 6│ │ │ └~──┘ └~──┘ │ └∊────────────┘ }}} ⍝ error Eh? ) scripts._defs∘parse repl'→' ⍝ bind left arg for dyadic fuction: →parse← 2+3 A ┌┴─┐ ┌┴┐ 3 2 + ∘.+/m n A ┌──┴──┐ ┌─┴──┐ ┌┴┐ ┌┴─┐ / m n ∘ ┌┴┐ . + → See also: parse esh lisp joy Back to: contents Back to: Workspaces