Attempting to fix the interaction reader in the REPL

This commit is contained in:
Jens Axel Søgaard 2012-06-24 22:32:36 +02:00
parent c53891eb13
commit aa5284534a
7 changed files with 77 additions and 29 deletions

View File

@ -1,29 +1,10 @@
#lang racket
(provide get-language-info get-info)
(provide get-language-info)
(define (get-language-info data)
(lambda (key default)
(displayln (list 'bracket-info/get-language-info key default))
(case key
[(configure-runtime)
'(#(bracket/runtime-config configure #f))]
[(color-lexer)
(dynamic-require 'syntax-color/default-lexer
'default-lexer)
(displayln "HErE")
(dynamic-require "parser.rkt"
'color-expression-lexer)]
[else default])))
(require racket/runtime-path)
(define-runtime-path color-lexer-path "parser.rkt")
(define (get-info in mod line col pos)
(displayln (list 'bracket-info/get-info in mod line col pos))
(lambda (key default)
(displayln (list 'reader/get-info key default))
(case key
[(color-lexer)
(dynamic-require color-lexer-path 'color-expression-lexer)]
[else default])))

View File

@ -1185,14 +1185,22 @@
(define (Plot f range [options '(List)])
; TODO: Implement options
(displayln (list f range))
;(displayln (list f range))
(define y-min -5)
(define y-max +5)
(define excluded? #f)
; TODO: plot2d needs to be extended to multiple functions
#;(define fs
(match functions
[(List: f ...) f]
[f (list f)]
[else (error 'Plot "TODO")]))
(define fs (list f))
(match range
[(List: var x-min x-max)
; TODO: Declare var as a local variable ?
(plot2d (if (procedure? f)
(λ (x) (displayln x) (f x))
(λ (x) (f x))
(λ (x) (N (Substitute f (Equal var x)))))
x-min x-max y-min y-max excluded?)]
[else (error)]))

View File

@ -71,7 +71,8 @@
[string (:: #\" (:* (:~ #\")) #\")]
[identifier (:: letter (:* (:or letter digit #\_ #\?)))]
[identifier:= (:: letter (:* (:or letter digit #\_ #\?)) ":=")]
[identifierOP (:: letter (:* (:or letter digit #\_ #\?)) "(")])
[identifierOP (:: letter (:* (:or letter digit #\_ #\?)) "(")]
[comment (:: "%" (complement (:: any-string #\newline any-string)) #\newline)])
(define (string-drop-right n s)
(substring s 0 (- (string-length s) n)))
@ -105,6 +106,8 @@
["<>" 'NOT-EQUAL]
["" 'NOT-EQUAL]
["define" 'DEFINE]
[comment
(return-without-pos (expression-lexer input-port))]
[string
(token-STRING (substring lexeme 1 (- (string-length lexeme) 1)))]
; The parser can only look ahead 1 token, so we have 3
@ -154,6 +157,8 @@
(syn-val lexeme 'no-color #f start-pos end-pos)]
["define"
(syn-val lexeme 'constant #f start-pos end-pos)]
[comment
(syn-val lexeme 'comment #f start-pos end-pos)]
[string
(syn-val lexeme 'string #f start-pos end-pos)]
; The parser can only look ahead 1 token, so we have 3
@ -165,7 +170,10 @@
[(:+ digit)
(syn-val lexeme 'constant #f start-pos end-pos)]
[(:: (:+ digit) #\. (:* digit))
(syn-val lexeme 'constant #f start-pos end-pos)]))
(syn-val lexeme 'constant #f start-pos end-pos)]
; catch anything else
[any-char
(syn-val lexeme 'error #f start-pos end-pos)]))
;; A macro to build the syntax object
@ -362,6 +370,7 @@
(define (parse-expression src stx ip)
(port-count-lines! ip)
(define out
((expression-parser
(if src src (object-name ip))
; If you change any of these values, then
@ -395,3 +404,5 @@
(eq? (position-token-token peek1) 'EOF))
(begin0 peek1 (next))
(begin0 peek (next)))))))
(displayln out)
out)

View File

@ -57,6 +57,10 @@
(define list-ref List-ref)
(define-syntax (define stx)
(syntax-case stx () [(_ . more) #'(Define . more)]))
(require bracket/lang/parser)
(current-read-interaction
(λ (_ in)
(parse-expression 'repl #'repl (open-input-string "1+2"))))
body))
'module-language
'#(bracket/bracket-info get-language-info #f)))))

View File

@ -16,4 +16,5 @@
[(_ sym ...)
#'(begin (define sym 'sym) ...)]))
(require bracket/lang/parser)
(provide (all-from-out bracket/lang/parser))

View File

@ -8,5 +8,49 @@
(display v)))
(define (configure data)
(show-enabled #t))
(show-enabled #t)
(current-read-interaction read0))
(require bracket/lang/reader)
(define (without-lang-read src in)
(parameterize ([read-accept-reader #f]
[read-accept-lang #f])
(read-one-line src in)))
; XXX This is almost certainly wrong.
(define (read0 src ip)
(displayln (list 'read0 src ip))
(begin0
(without-lang-read src ip)
(current-read-interaction read1)))
(define (read1 src ip)
(displayln (list 'read1 src ip))
(current-read-interaction read0)
eof)
(define (read2 src ip)
(displayln (list 'read2 src ip))
(current-read-interaction read0)
eof)
;; at the repl, honu will only read a single line at a time regardless
;; of how many expressions it contains
(define (read-one-line name input)
(define quit? #f)
(define one-line
(with-output-to-string
(lambda ()
(let loop ()
(define next (read-char input))
(when (eof-object? next)
(set! quit? #t))
(when (not (or (eof-object? next)
(char=? next #\newline)))
(display next)
(loop))))))
(if quit?
eof
(read-syntax name (open-input-string one-line))))

View File

@ -21,7 +21,7 @@
;;; http://scicomp.stackexchange.com/questions/2377/algorithms-for-adaptive-function-plotting
;;; for discussion on adaptive plotting.
(define *debug* #t)
(define *debug* #f)
; These count functions are used to measure the
; number of evaluations of the function to be drawn.
@ -262,4 +262,3 @@
(list
(list 'angle: angle)))))
angle]))