dd1daf92e4
* mes.c (bload_env): Mark as internal. (load_env): Likewise. Load Scheme reader from source. Remove dumping. (dump): New function. * (vm_begin_env): Allow for gc while read_input_file_env. (mes_builtins): Add *dot*. (read_input_file_env)[!READER]: Invoke read-input-file. * module/mes/read-0.mes (read-env): New function. (read-word): Support quasisyntax. Remove usage of ' thoughout. * module/mes/repl.mes (repl): Use read instead of read-env. * guile/mes.scm (environment): Add *dot*. * guile/reader.mes: Update. * NEWS: Update.
182 lines
6.4 KiB
Scheme
182 lines
6.4 KiB
Scheme
;;; -*-scheme-*-
|
|
|
|
;;; Mes --- Maxwell Equations of Software
|
|
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
|
|
;;;
|
|
;;; This file is part of Mes.
|
|
;;;
|
|
;;; Mes is free software; you can redistribute it and/or modify it
|
|
;;; under the terms of the GNU General Public License as published by
|
|
;;; the Free Software Foundation; either version 3 of the License, or (at
|
|
;;; your option) any later version.
|
|
;;;
|
|
;;; Mes 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 General Public License for more details.
|
|
;;;
|
|
;;; You should have received a copy of the GNU General Public License
|
|
;;; along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
;;; Commentary:
|
|
|
|
;;; repl.mes defines repl, a repl for Mes.
|
|
|
|
;;; Code:
|
|
|
|
(mes-use-module (mes scm))
|
|
|
|
(define welcome
|
|
"Mes 0.3
|
|
Copyright (C) 2016 Jan Nieuwenhuizen <janneke@gnu.org>
|
|
|
|
Mes 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.
|
|
|
|
Enter `,help' for help.
|
|
")
|
|
|
|
(define warranty
|
|
"Mes 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/gpl.html>, for more details.
|
|
")
|
|
|
|
(define copying
|
|
"Mes is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or (at
|
|
your option) any later version.
|
|
|
|
Mes 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 General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
|
")
|
|
|
|
(define help-commands
|
|
"Help Commands:
|
|
|
|
,expand SEXP - Expand SEXP
|
|
,sc-expand SEXP - SC-expand SEXP
|
|
,help - Show this help
|
|
,show TOPIC - Show info on TOPIC [c, w]
|
|
,use MODULE - load MODULE
|
|
")
|
|
|
|
(define show-commands
|
|
"Show commands:
|
|
|
|
,show c - Show details on licensing; GNU GPLv3+
|
|
,show w - Show details on the lack of warranty
|
|
")
|
|
|
|
(define (repl)
|
|
(let ((count 0)
|
|
(print-sexp? #t))
|
|
|
|
(define (expand)
|
|
(let ((sexp (read)))
|
|
(when #t print-sexp?
|
|
(display "[sexp=")
|
|
(display sexp)
|
|
(display "]")
|
|
(newline))
|
|
(display (expand-macro sexp))
|
|
(newline)))
|
|
|
|
(define (scexpand)
|
|
(let ((sexp (read)))
|
|
(when #t print-sexp?
|
|
(display "[sexp=")
|
|
(display sexp)
|
|
(display "]")
|
|
(newline))
|
|
(display (sc-expand sexp))
|
|
(newline)))
|
|
|
|
(define (help . x) (display help-commands))
|
|
(define (show . x)
|
|
(define topic-alist `((#\newline . ,show-commands)
|
|
(#\c . ,copying)
|
|
(#\w . ,warranty)))
|
|
(let ((topic (read-char)))
|
|
(display (assoc-ref topic-alist topic))))
|
|
(define (use a)
|
|
(lambda ()
|
|
(let ((module (read)))
|
|
(mes-load-module-env module a))))
|
|
(define (meta command a)
|
|
(let ((command-alist `((expand . ,expand)
|
|
(sc-expand . ,scexpand)
|
|
(help . ,help)
|
|
(show . ,show)
|
|
(use . ,(use a)))))
|
|
((or (assoc-ref command-alist command)
|
|
(lambda () #f)))))
|
|
|
|
(display welcome)
|
|
(let loop ((a (current-module)))
|
|
(display "mes> ")
|
|
(force-output)
|
|
(let ((sexp (read-env a)))
|
|
(when (not (eq? sexp '()))
|
|
(when print-sexp?
|
|
(display "[sexp=")
|
|
(display sexp)
|
|
(display "]")
|
|
(newline))
|
|
(cond ((and (pair? sexp) (eq? (car sexp) (string->symbol "unquote")))
|
|
(let ((r (meta (cadr sexp) a)))
|
|
(if (pair? r) (loop (append r a))
|
|
(loop a))))
|
|
((and (pair? sexp) (eq? (car sexp) 'mes-use-module))
|
|
(loop (mes-load-module-env (cadr sexp) a)))
|
|
(else (let ((e (eval-env sexp a)))
|
|
(if (eq? e *unspecified*) (loop a)
|
|
(let ((id (string->symbol (string-append "$" (number->string count)))))
|
|
(set! count (+ count 1))
|
|
(display id)
|
|
(display " = ")
|
|
(display e)
|
|
(newline)
|
|
(loop (acons id e a))))))))))))
|