mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 20:00:19 +02:00
* module/system/repl/debug.scm: New file, defines a data type to hold state for a debugger stack, and some helper procedures to print the stack or print a frame. Most pieces are from (system vm debug). * module/system/repl/error-handling.scm: New file, implements call-with-error-handling and with-error-handling, and instead of going into a debugger, we go into a recursive repl that happens to have debugging information. Will be removing the old debugger from (system vm debug) shortly. * module/Makefile.am (SYSTEM_SOURCES): Add error-handling and debug scm files. * module/system/repl/repl.scm (prompting-meta-read): Better error handling -- we don't want to go into a debugger when reading a command. (start-repl): Add #:debug keyword argument, and just dispatch to run-repl. (run-repl): New function, with the guts of the old start-repl. Added a prompt, to which a throw to 'quit will abort. * module/system/repl/common.scm (repl-prepare-eval-thunk): New helper. In the future we will use this to not enter the debugger on errors that happen at compile time. (repl-eval): Use repl-prepare-eval-thunk. (repl-print): Run the before-print-hook when printing a value. * module/system/repl/command.scm (*command-table*): Move `option' to the `system' group. Move `trace' to the `profile' group. Add `debug' and `inspect' groups. (command-abbrevs): Rename from command-abbrev, and allow multiple abbreviations. (display-group): Fix the case where abbrev? was #f. (display-summary): Fix alignment of the command and abbreviations. Allow multiple abbreviations. (read-command): Rename from read-datum, and have better error handling. (meta-command): Better error handling. (define-meta-command): Better error handling. (help, show, import, compile, disassemble, time, profile, trace): Fix docstrings and error messages. (define-stack-command): New helper, for commands that operate on a saved stack. (backtrace, up, down, frame, procedure, locals): New debugger commands, in the REPL now. (inspect, pretty-print): New "inspect" commands.
208 lines
7.6 KiB
Scheme
208 lines
7.6 KiB
Scheme
;;; Repl common routines
|
||
|
||
;; Copyright (C) 2001, 2008, 2009, 2010 Free Software Foundation, Inc.
|
||
|
||
;;; This library is free software; you can redistribute it and/or
|
||
;;; modify it under the terms of the GNU Lesser General Public
|
||
;;; License as published by the Free Software Foundation; either
|
||
;;; version 3 of the License, or (at your option) any later version.
|
||
;;;
|
||
;;; This library is distributed in the hope that it will be useful,
|
||
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
;;; Lesser General Public License for more details.
|
||
;;;
|
||
;;; You should have received a copy of the GNU Lesser General Public
|
||
;;; License along with this library; if not, write to the Free Software
|
||
;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||
|
||
;;; Code:
|
||
|
||
(define-module (system repl common)
|
||
#:use-module (system base syntax)
|
||
#:use-module (system base compile)
|
||
#:use-module (system base language)
|
||
#:use-module (system vm program)
|
||
#:use-module (ice-9 control)
|
||
#:export (<repl> make-repl repl-language repl-options
|
||
repl-tm-stats repl-gc-stats repl-inport repl-outport repl-debug
|
||
repl-welcome repl-prompt
|
||
repl-read repl-compile repl-prepare-eval-thunk repl-eval
|
||
repl-parse repl-print repl-option-ref repl-option-set!
|
||
repl-default-option-set! repl-default-prompt-set!
|
||
puts ->string user-error
|
||
*warranty* *copying* *version*))
|
||
|
||
(define *version*
|
||
(format #f "GNU Guile ~A
|
||
Copyright (C) 1995-2010 Free Software Foundation, Inc.
|
||
|
||
Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
|
||
This program is free software, and you are welcome to redistribute it
|
||
under certain conditions; type `,show c' for details." (version)))
|
||
|
||
(define *copying*
|
||
"Guile is free software: you can redistribute it and/or modify
|
||
it under the terms of the GNU Lesser General Public License as
|
||
published by the Free Software Foundation, either version 3 of
|
||
the License, or (at your option) any later version.
|
||
|
||
Guile is distributed in the hope that it will be useful, but
|
||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
Lesser General Public License for more details.
|
||
|
||
You should have received a copy of the GNU Lesser General Public
|
||
License along with this program. If not, see
|
||
<http://www.gnu.org/licenses/lgpl.html>.")
|
||
|
||
(define *warranty*
|
||
"Guile is distributed WITHOUT ANY WARRANTY. The following
|
||
sections from the GNU General Public License, version 3, should
|
||
make that clear.
|
||
|
||
15. Disclaimer of Warranty.
|
||
|
||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY
|
||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||
|
||
16. Limitation of Liability.
|
||
|
||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||
SUCH DAMAGES.
|
||
|
||
17. Interpretation of Sections 15 and 16.
|
||
|
||
If the disclaimer of warranty and limitation of liability provided
|
||
above cannot be given local legal effect according to their terms,
|
||
reviewing courts shall apply local law that most closely approximates
|
||
an absolute waiver of all civil liability in connection with the
|
||
Program, unless a warranty or assumption of liability accompanies a
|
||
copy of the Program in return for a fee.
|
||
|
||
See <http://www.gnu.org/licenses/lgpl.html>, for more details.")
|
||
|
||
|
||
;;;
|
||
;;; Repl type
|
||
;;;
|
||
|
||
(define-record/keywords <repl>
|
||
language options tm-stats gc-stats inport outport debug)
|
||
|
||
(define repl-default-options
|
||
'((compile-options . (#:warnings (unbound-variable arity-mismatch)))
|
||
(trace . #f)
|
||
(interp . #f)))
|
||
|
||
(define %make-repl make-repl)
|
||
(define* (make-repl lang #:optional debug)
|
||
(%make-repl #:language (lookup-language lang)
|
||
#:options repl-default-options
|
||
#:tm-stats (times)
|
||
#:gc-stats (gc-stats)
|
||
#:inport (current-input-port)
|
||
#:outport (current-output-port)
|
||
#:debug debug))
|
||
|
||
(define (repl-welcome repl)
|
||
(display *version*)
|
||
(newline)
|
||
(newline)
|
||
(display "Enter `,help' for help.\n"))
|
||
|
||
(define (repl-prompt repl)
|
||
(cond
|
||
((repl-option-ref repl 'prompt)
|
||
=> (lambda (prompt) (prompt repl)))
|
||
(else
|
||
(format #f "~A@~A~A> " (language-name (repl-language repl))
|
||
(module-name (current-module))
|
||
(let ((level (length (cond
|
||
((fluid-ref *repl-stack*) => cdr)
|
||
(else '())))))
|
||
(if (zero? level) "" (format #f " [~a]" level)))))))
|
||
|
||
(define (repl-read repl)
|
||
((language-reader (repl-language repl)) (repl-inport repl)
|
||
(current-module)))
|
||
|
||
(define (repl-compile-options repl)
|
||
(repl-option-ref repl 'compile-options))
|
||
|
||
(define (repl-compile repl form)
|
||
(let ((from (repl-language repl))
|
||
(opts (repl-compile-options repl)))
|
||
(compile form #:from from #:to 'objcode #:opts opts
|
||
#:env (current-module))))
|
||
|
||
(define (repl-parse repl form)
|
||
(let ((parser (language-parser (repl-language repl))))
|
||
(if parser (parser form) form)))
|
||
|
||
(define (repl-prepare-eval-thunk repl form)
|
||
(let* ((eval (language-evaluator (repl-language repl))))
|
||
(if (and eval
|
||
(or (null? (language-compilers (repl-language repl)))
|
||
(assq-ref (repl-options repl) 'interp)))
|
||
(lambda () (eval form (current-module)))
|
||
(make-program (repl-compile repl form)))))
|
||
|
||
(define (repl-eval repl form)
|
||
(let ((thunk (repl-prepare-eval-thunk repl form)))
|
||
(% (thunk))))
|
||
|
||
(define (repl-print repl val)
|
||
(if (not (eq? val *unspecified*))
|
||
(begin
|
||
(run-hook before-print-hook val)
|
||
;; The result of an evaluation is representable in scheme, and
|
||
;; should be printed with the generic printer, `write'. The
|
||
;; language-printer is something else: it prints expressions of
|
||
;; a given language, not the result of evaluation.
|
||
(write val (repl-outport repl))
|
||
(newline (repl-outport repl)))))
|
||
|
||
(define (repl-option-ref repl key)
|
||
(assq-ref (repl-options repl) key))
|
||
|
||
(define (repl-option-set! repl key val)
|
||
(set! (repl-options repl) (assq-set! (repl-options repl) key val)))
|
||
|
||
(define (repl-default-option-set! key val)
|
||
(set! repl-default-options (assq-set! repl-default-options key val)))
|
||
|
||
(define (repl-default-prompt-set! prompt)
|
||
(repl-default-option-set!
|
||
'prompt
|
||
(cond
|
||
((string? prompt) (lambda (repl) prompt))
|
||
((thunk? prompt) (lambda (repl) (prompt)))
|
||
((procedure? prompt) prompt)
|
||
(else (error "Invalid prompt" prompt)))))
|
||
|
||
|
||
;;;
|
||
;;; Utilities
|
||
;;;
|
||
|
||
(define (puts x) (display x) (newline))
|
||
|
||
(define (->string x)
|
||
(object->string x display))
|
||
|
||
(define (user-error msg . args)
|
||
(throw 'user-error #f msg args #f))
|