[plt-scheme] a tiny repl

From: Hugh Myers (hsmyers at gmail.com)
Date: Sun Jun 28 18:55:59 EDT 2009

I see--- you substitute apply for eval. I'll take a look.

--hsm

On Sun, Jun 28, 2009 at 4:43 PM, Ryan Culpepper<ryanc at ccs.neu.edu> wrote:
> Hugh Myers wrote:
>>
>> On the off chance that others who read this list are as needy as
>> myself, what follows is a tiny repl. I use an expanded version to test
>> and debug my current work--- single stepping through a chess game for
>> instance. Since I'm new to scheme, I've no knowledge of better ways to
>> do this, so feel free to criticize. It paid for itself by being
>> helpful to me, gravy if helpful to someone else...
>
> I try to stay away from 'eval' unless I really need it. You could instead
> just keep a table of command names and the procedures that implement them.
> Here's how to do it:
>
>  ;; repl : string -> (loops)
>  (define (repl prompt)
>    (display prompt)
>    (let* ([line (read-line)]
>           [parts (regexp-split #px"\\s" line)])
>      (when (pair? parts)
>        (let* ([command-part (car parts)]
>               [parameter-parts (cdr parts)]
>               [command (lookup-command command-part)]
>               [parameters (for/list ([part parameter-parts])
>                             (string->actual part))])
>          (when command
>            (apply command parameters))))
>      (repl prompt)))
>
>  ;; lookup-command : string -> procedure/#f
>  ;; Gets the procedure that implements the given command,
>  ;; or #f if given an unknown command name.
>  (define (lookup-command command-name)
>    ;; commands : (listof (cons string procedure))
>    ;; You can lift this to top-level, but you must put it *after*
>    ;; the definitions of 'repl-help', 'jmp', and 'print-board'.
>    (define commands
>      (list (cons "h" repl-help)
>            (cons "q" (lambda () (escape 'Bye!)))
>            (cons "j" jmp)
>            (cons "p" print-board)))
>    (let ([entry (assoc command-name commands)])
>      (and entry (cdr entry))))
>
> A few of your functions can now go away, and the rest are unchanged:
>
>  (define (repl-help)
>    (printf "~a~%" "Commands are h,p, and q.")
>    (printf "~a~%" "Where:")
>    (printf "~a~%" "       h =s 'help'")
>    (printf "~a~%" "       j n =s 'jmp n plys'")
>    (printf "~a~%" "       p =s 'print-board'")
>    (printf "~a~%" "       q =s 'quit'"))
>
>  (define (jmp n)
>    (printf "jump forward ~A ply in movelist~%" n))
>
>  (define (print-board)
>    (printf "display board~%"))
>
>  (define (escape v)
>    (abort-current-continuation
>     (default-continuation-prompt-tag)
>     (lambda () v)))
>
>  (define (string->actual s)
>    (let ([value (if (string->number s)
>                     (string->number s)
>                     (string->symbol s))])
>      value))
>
>  (define (test-repl)
>    (repl "test> "))
>
> Ryan
>


Posted on the users mailing list.