add 'current-read-interaction' parameter

svn: r18769
This commit is contained in:
Matthew Flatt 2010-04-09 13:22:57 +00:00
parent 8c6bbb43cb
commit 1621091fc1
12 changed files with 573 additions and 488 deletions

View File

@ -334,6 +334,21 @@
(cond [(thread-cell-ref repl-init-thunk) (cond [(thread-cell-ref repl-init-thunk)
=> (λ (t) (thread-cell-set! repl-init-thunk #f) (t))])) => (λ (t) (thread-cell-set! repl-init-thunk #f) (t))]))
(define/override (front-end/interaction port settings)
(λ ()
(let ([v (parameterize ([read-accept-reader #t])
(with-stack-checkpoint
((current-read-interaction)
(object-name port)
port)))])
(if (eof-object? v)
v
(let ([w (cons '#%top-interaction v)])
(if (syntax? v)
(namespace-syntax-introduce
(datum->syntax #f w v))
v))))))
;; printer settings are just ignored here. ;; printer settings are just ignored here.
(define/override (create-executable setting parent program-filename) (define/override (create-executable setting parent program-filename)
(let* ([executable-specs (drscheme:language:create-executable-gui (let* ([executable-specs (drscheme:language:create-executable-gui

View File

@ -2,4 +2,6 @@
scheme/base scheme/base
#:info get-info #:info get-info
#:module-info '#(racket/private/get-info get-info #f)
(require racket/private/get-info) (require racket/private/get-info)

View File

@ -4,4 +4,7 @@
(provide configure) (provide configure)
(define (configure config) (define (configure config)
(current-prompt-read (lambda ()
(printf "r> ")
(read)))
(print-as-quasiquote #t)) (print-as-quasiquote #t))

View File

@ -208,4 +208,6 @@
;; readline-prompt and using read-complete-syntax below should still ;; readline-prompt and using read-complete-syntax below should still
;; work fine) ;; work fine)
(display prompt) (flush-output)) (display prompt) (flush-output))
(begin0 (read-syntax) (do-multiline-chunk)))) (begin0 (let ([in (current-input-port)])
((current-read-interaction) (object-name in) in))
(do-multiline-chunk))))

View File

@ -288,15 +288,34 @@ the @scheme[current-prompt-read], @scheme[current-eval], and
@defparam[current-prompt-read proc (-> any)]{ @defparam[current-prompt-read proc (-> any)]{
A parameter that determines a procedure that takes no arguments, A parameter that determines a @deftech{prompt read handler}, which is
displays a prompt string, and returns a top-level form to a procedure that takes no arguments, displays a prompt string, and
evaluate. This procedure is called by the read phase of returns a top-level form to evaluate. The prompt read handler is
@scheme[read-eval-print-loop]. The default prompt read handler prints called by @scheme[read-eval-print-loop], and the handler typically
@litchar{> } and returns the result of should call the @tech{read interaction handler} (as determined by the
@scheme[current-read-interaction] parameter) after printing a prompt.
The default prompt read handler prints @litchar{> } and returns the
result of
@schemeblock[ @schemeblock[
(parameterize ((read-accept-reader #t)) (let ([in (current-input-port)])
(read-syntax)) ((current-read-interaction) (object-name in) in))
]}
@defparam[current-read-interaction proc (any/c input-port? -> any)]{
A parameter that determines the current @deftech{read interaction
handler}, which is procedure that takes an arbitrary value and an
input port and returns an expression read from the input port.
The default read interaction handler accepts @scheme[_src] and
@scheme[_in] and returns
@schemeblock[
(parameterize ([read-accept-reader #t])
(read-syntax _src _in))
]} ]}

View File

@ -1168,6 +1168,7 @@ enum {
MZCONFIG_PRINT_HANDLER, MZCONFIG_PRINT_HANDLER,
MZCONFIG_PROMPT_READ_HANDLER, MZCONFIG_PROMPT_READ_HANDLER,
MZCONFIG_READ_HANDLER,
MZCONFIG_READTABLE, MZCONFIG_READTABLE,
MZCONFIG_READER_GUARD, MZCONFIG_READER_GUARD,

File diff suppressed because it is too large Load Diff

View File

@ -178,6 +178,7 @@ static Scheme_Object *call_with_values(int argc, Scheme_Object *argv[]);
Scheme_Object *scheme_values(int argc, Scheme_Object *argv[]); Scheme_Object *scheme_values(int argc, Scheme_Object *argv[]);
static Scheme_Object *current_print(int argc, Scheme_Object **argv); static Scheme_Object *current_print(int argc, Scheme_Object **argv);
static Scheme_Object *current_prompt_read(int, Scheme_Object **); static Scheme_Object *current_prompt_read(int, Scheme_Object **);
static Scheme_Object *current_read(int, Scheme_Object **);
static Scheme_Object *write_compiled_closure(Scheme_Object *obj); static Scheme_Object *write_compiled_closure(Scheme_Object *obj);
static Scheme_Object *read_compiled_closure(Scheme_Object *obj); static Scheme_Object *read_compiled_closure(Scheme_Object *obj);
@ -546,6 +547,11 @@ scheme_init_fun (Scheme_Env *env)
"current-prompt-read", "current-prompt-read",
MZCONFIG_PROMPT_READ_HANDLER), MZCONFIG_PROMPT_READ_HANDLER),
env); env);
scheme_add_global_constant("current-read-interaction",
scheme_register_parameter(current_read,
"current-read-interaction",
MZCONFIG_READ_HANDLER),
env);
scheme_install_type_writer(scheme_unclosed_procedure_type, scheme_install_type_writer(scheme_unclosed_procedure_type,
write_compiled_closure); write_compiled_closure);
@ -8859,6 +8865,15 @@ current_prompt_read(int argc, Scheme_Object **argv)
0, NULL, NULL, 0); 0, NULL, NULL, 0);
} }
static Scheme_Object *
current_read(int argc, Scheme_Object **argv)
{
return scheme_param_config("current-read-interaction",
scheme_make_integer(MZCONFIG_READ_HANDLER),
argc, argv,
2, NULL, NULL, 0);
}
Scheme_Object * Scheme_Object *
scheme_default_print_handler(int argc, Scheme_Object *argv[]) scheme_default_print_handler(int argc, Scheme_Object *argv[])
{ {
@ -8885,11 +8900,8 @@ Scheme_Object *
scheme_default_prompt_read_handler(int argc, Scheme_Object *argv[]) scheme_default_prompt_read_handler(int argc, Scheme_Object *argv[])
{ {
Scheme_Config *config; Scheme_Config *config;
Scheme_Object *port; Scheme_Object *port, *reader;
Scheme_Object *inport; Scheme_Object *inport, *name, *a[2];
Scheme_Object *name;
Scheme_Object *stx;
Scheme_Cont_Frame_Data cframe;
config = scheme_current_config(); config = scheme_current_config();
port = scheme_get_param(config, MZCONFIG_OUTPUT_PORT); port = scheme_get_param(config, MZCONFIG_OUTPUT_PORT);
@ -8898,11 +8910,36 @@ scheme_default_prompt_read_handler(int argc, Scheme_Object *argv[])
scheme_write_byte_string("> ", 2, port); scheme_write_byte_string("> ", 2, port);
scheme_flush_output(port); scheme_flush_output(port);
name = ((Scheme_Input_Port *)inport)->name;
if (inport == scheme_orig_stdin_port) if (inport == scheme_orig_stdin_port)
scheme_flush_orig_outputs(); scheme_flush_orig_outputs();
name = (Scheme_Object *)scheme_port_record(inport);
name = ((Scheme_Input_Port *)name)->name;
reader = scheme_get_param(config, MZCONFIG_READ_HANDLER);
a[0] = name;
a[1] = inport;
return _scheme_apply(reader, 2, a);
}
Scheme_Object *
scheme_default_read_handler(int argc, Scheme_Object *argv[])
{
Scheme_Config *config;
Scheme_Object *name = argv[0];
Scheme_Object *inport = argv[1];
Scheme_Object *stx;
Scheme_Cont_Frame_Data cframe;
if (!SCHEME_INPORTP(inport))
scheme_wrong_type("default-read-interaction-handler",
"input port",
1,
argc,
argv);
config = scheme_current_config();
config = scheme_extend_config(config, MZCONFIG_CAN_READ_READER, scheme_true); config = scheme_extend_config(config, MZCONFIG_CAN_READ_READER, scheme_true);
scheme_push_continuation_frame(&cframe); scheme_push_continuation_frame(&cframe);

View File

@ -13,7 +13,7 @@
#define USE_COMPILED_STARTUP 1 #define USE_COMPILED_STARTUP 1
#define EXPECTED_PRIM_COUNT 980 #define EXPECTED_PRIM_COUNT 981
#define EXPECTED_UNSAFE_COUNT 65 #define EXPECTED_UNSAFE_COUNT 65
#define EXPECTED_FLFXNUM_COUNT 53 #define EXPECTED_FLFXNUM_COUNT 53

View File

@ -1930,6 +1930,7 @@ Scheme_Object *scheme_default_eval_handler(int, Scheme_Object *[]);
Scheme_Object *scheme_default_compile_handler(int, Scheme_Object *[]); Scheme_Object *scheme_default_compile_handler(int, Scheme_Object *[]);
Scheme_Object *scheme_default_print_handler(int, Scheme_Object *[]); Scheme_Object *scheme_default_print_handler(int, Scheme_Object *[]);
Scheme_Object *scheme_default_prompt_read_handler(int, Scheme_Object *[]); Scheme_Object *scheme_default_prompt_read_handler(int, Scheme_Object *[]);
Scheme_Object *scheme_default_read_handler(int argc, Scheme_Object *[]);
extern Scheme_Object *scheme_default_global_print_handler; extern Scheme_Object *scheme_default_global_print_handler;

View File

@ -13,12 +13,12 @@
consistently.) consistently.)
*/ */
#define MZSCHEME_VERSION "4.2.5.6" #define MZSCHEME_VERSION "4.2.5.7"
#define MZSCHEME_VERSION_X 4 #define MZSCHEME_VERSION_X 4
#define MZSCHEME_VERSION_Y 2 #define MZSCHEME_VERSION_Y 2
#define MZSCHEME_VERSION_Z 5 #define MZSCHEME_VERSION_Z 5
#define MZSCHEME_VERSION_W 6 #define MZSCHEME_VERSION_W 7
#define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y)
#define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)

View File

@ -6699,17 +6699,22 @@ static void make_initial_config(Scheme_Thread *p)
} }
{ {
Scheme_Object *ph, *prh; Scheme_Object *ph;
ph = scheme_make_prim_w_arity(scheme_default_print_handler, ph = scheme_make_prim_w_arity(scheme_default_print_handler,
"default-print-handler", "default-print-handler",
1, 1); 1, 1);
init_param(cells, paramz, MZCONFIG_PRINT_HANDLER, ph); init_param(cells, paramz, MZCONFIG_PRINT_HANDLER, ph);
prh = scheme_make_prim_w_arity(scheme_default_prompt_read_handler, ph = scheme_make_prim_w_arity(scheme_default_prompt_read_handler,
"default-prompt-read-handler", "default-prompt-read-handler",
0, 0); 0, 0);
init_param(cells, paramz, MZCONFIG_PROMPT_READ_HANDLER, prh); init_param(cells, paramz, MZCONFIG_PROMPT_READ_HANDLER, ph);
ph = scheme_make_prim_w_arity(scheme_default_read_handler,
"default-read-interaction-handler",
2, 2);
init_param(cells, paramz, MZCONFIG_READ_HANDLER, ph);
} }
init_param(cells, paramz, MZCONFIG_PORT_COUNT_LINES, scheme_false); init_param(cells, paramz, MZCONFIG_PORT_COUNT_LINES, scheme_false);