mes: Guile-like command-line interface.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 22 Apr 2018 09:51:28 +0000 (11:51 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 22 Apr 2018 09:51:28 +0000 (11:51 +0200)
* module/mes/boot-0.scm (tty?): Guile-like command-line interface.
* scripts/repl.mes: Remove.
* scripts/mescc.mes: Update.
* tests/*.test: Update scripts.
* module/mes/repl.mes (repl): Add ,quit.

36 files changed:
make.scm
module/mes/boot-0.scm
module/mes/repl.mes
scripts/mescc.mes
scripts/repl.mes [deleted file]
src/mes.c
src/reader.c
tests/base.test
tests/boot.test
tests/catch.test
tests/closure.test
tests/cwv.test
tests/display.test
tests/fluids.test
tests/getopt-long.test
tests/guile.test
tests/let-syntax.test
tests/let.test
tests/match.test
tests/math.test
tests/module.test
tests/optargs.test
tests/peg.test
tests/pmatch.test
tests/psyntax.test
tests/quasiquote.test
tests/read.test
tests/record.test
tests/scm.test
tests/srfi-1.test
tests/srfi-13.test
tests/srfi-14.test
tests/srfi-16.test
tests/srfi-43.test
tests/syntax.test
tests/vector.test

index 2ed2c7cd69802b38074ae0eb0e6c61d302231e18..6bb41654c0ee36e0347719d6b7e23512632a9078 100755 (executable)
--- a/make.scm
+++ b/make.scm
@@ -512,7 +512,6 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
 
 (add-target (install "guile/mescc.scm" #:dir "bin" #:substitutes #t))
 (add-target (install "scripts/mescc.mes" #:dir "bin" #:substitutes #t))
-(add-target (install "scripts/repl.mes" #:dir "bin" #:substitutes #t))
 (define bootstrap? #f)
 (if bootstrap?
     (add-target (install "src/mes.mes" #:dir "bin" #:installed-name "mes"))
index 9c37976bfb35f83037670fe019845b69bbb9d276..ade835ba9f907604b51b295f310c0b7599b6736b 100644 (file)
 (mes-use-module (mes posix))
 ;; ;; end boot-0.scm
 
+(mes-use-module (mes getopt-long))
+
 (primitive-load 0)
+(let ((tty? (isatty? 0)))
+  (define (parse-opts args)
+    (let* ((option-spec
+            '((dump)
+              (help (single-char #\h))
+              (load)
+              (source (single-char #\s) (value #t))
+              (version (single-char #\V)))))
+      (getopt-long args option-spec #:stop-at-first-non-option #t)))
+  (define (source-arg? o)
+    (equal? "-s" o))
+  (let* ((s-index (list-index source-arg? %argv))
+         (args (if s-index (list-head %argv (+ s-index 2)) %argv))
+         (options (parse-opts args))
+         (source (option-ref options 'source #f))
+         (files (if s-index (list-tail %argv (+ s-index 1))
+                    (option-ref options '() '())))
+         (help? (option-ref options 'help #f))
+         (usage? (and (not help?) (null? files) (not tty?)))
+         (version? (option-ref options 'version #f)))
+    (or
+     (and version?
+          (display (string-append "mes (Mes) " %version "\n"))
+          (exit 0))
+     (and (or help? usage?)
+          (display "Usage: mes [OPTION]... [FILE]...
+Evaluate code with Mes, interactively or from a script.
+
+  [-s] FILE      load source code from FILE, and exit
+  --             stop scanning arguments; run interactively
+
+The above switches stop argument processing, and pass all
+remaining arguments as the value of (command-line).
+
+  --dump             dump binary program to stdout
+  -h, --help         display this help and exit
+  --load             load binary program [module/mes/boot-0.32-mo]
+  -v, --version      display version information and exit
+" (or (and usage? (current-error-port)) (current-output-port)))
+          (exit (or (and usage? 2) 0)))
+     options)
+    (cond ((pair? files)
+           (let* ((file (car files))
+                  (port (if (equal? file "-") 0
+                            (open-input-file file))))
+             (set! %argv files)
+             (set-current-input-port port)))
+          ((and (null? files) tty?)
+           
+           (mes-use-module (mes repl))
+           (set-current-input-port 0)
+           (repl))
+          (else #t))))
 (primitive-load 0)
index ae928c45dd714648ab34095f48af838a3994249d..206dbe84efeebb7cab0df91eb20eaf0d4d0a2e20 100644 (file)
@@ -98,6 +98,7 @@ along with Mes.  If not, see <http://www.gnu.org/licenses/>.
 
   ,expand SEXP         - Expand SEXP
   ,help                - Show this help
+  ,quit                - Quit this session
   ,show TOPIC          - Show info on TOPIC [c, w]
   ,use MODULE          - load MODULE
 ")
@@ -132,6 +133,8 @@ along with Mes.  If not, see <http://www.gnu.org/licenses/>.
              (topic (find (negate char-whitespace?) (symbol->list word))))
         (display (assoc-ref topic-alist topic))
         *unspecified*))
+    (define (quit . x)
+      (exit 0))
     (define (use a)
       (lambda ()
         (let ((module (read)))
@@ -139,6 +142,7 @@ along with Mes.  If not, see <http://www.gnu.org/licenses/>.
     (define (meta command a)
       (let ((command-alist `((expand . ,(expand a))
                              (help . ,help)
+                             (quit . ,quit)
                              (show . ,show)
                              (use . ,(use a)))))
         ((or (assoc-ref command-alist command)
index 993e856546ab6daae4d5008263ab50e0ee16fce4..66ce1e5a9e1755f4aaf63c76fa4990f95eae7943 100755 (executable)
@@ -10,8 +10,7 @@ then
 fi
 MES_MODULEDIR=${MES_MODULEDIR-$MES_PREFIX/"module"}
 export MES_MODULEDIR
-$MES $MES_FLAGS -- "$@" < $0
-#paredit:||
+$MES -s $0 "$@"
 exit $?
 !#
 
@@ -121,8 +120,7 @@ Usage: mescc.mes [OPTION]... FILE...
       (string-suffix? ".mes-o" o)))
 
 (define (main args)
-  (let* ((args (cons* (car args) (cdr (member "--" args))))
-         (options (parse-opts args))
+  (let* ((options (parse-opts args))
          (files (option-ref options '() '()))
          (file (car files))
          (preprocess? (option-ref options 'E #f))
diff --git a/scripts/repl.mes b/scripts/repl.mes
deleted file mode 100755 (executable)
index bd53889..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#! /bin/sh
-# -*-scheme-*-
-MES=${MES-$(dirname $0)/mes}
-prefix=module/
-cat $0 /dev/stdin | $MES $MES_FLAGS -- "$@"
-#paredit:|
-exit $?
-!#
-
-;;; Mes --- Maxwell Equations of Software
-;;; Copyright © 2016,2017,2018 Jan (janneke) 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/>.
-
-(mes-use-module (mes repl))
-(mes-use-module (mes syntax))
-(primitive-load 0)
-
-(let* ((files (cdr (command-line)))
-       (file (if (pair? files) (car files)))
-       (file (if (and (equal? file "--") (pair? files) (pair? (cdr files))) (cadr files) file)))
-    (cond ((equal? file "--help")
-           (format (current-error-port) "Usage: repl.mes [--help|--version]\n")
-           (exit 0))
-          ((equal? file "--version")
-           (format (current-error-port) "mescc.mes (mes) ~a\n" %version)
-           (exit 0))))
-
-(repl)
-()
-
index 059318a6740402738e9935b47f19a58c3a8e8633..2971a8831dca1b868ead5d3aa1c381b308491bc9 100644 (file)
--- a/src/mes.c
+++ b/src/mes.c
@@ -29,7 +29,9 @@
 // minimal for boot-0.scm
 // int ARENA_SIZE = 100000; // 32b: 1MiB, 64b: 2 MiB
 // take a bit more to run all tests
-int ARENA_SIZE = 400000; // 32b: 1MiB, 64b: 2 MiB
+// int ARENA_SIZE = 400000; // 32b: 1MiB, 64b: 2 MiB
+// take a bit extra for loading repl
+int ARENA_SIZE = 1000000; // 32b: 2MiB, 64b: 4 MiB
 #if !_POSIX_SOURCE
 //int MAX_ARENA_SIZE = 60000000; // 32b: ~ 300MiB
 int MAX_ARENA_SIZE = 166600000; // 32b: ~ 2GiB
@@ -2268,20 +2270,22 @@ load_env (SCM a) ///((internal))
 SCM
 bload_env (SCM a) ///((internal))
 {
-#if 1 //__MESC__
+#if !_POSIX_SOURCE
   char *mo = "mes/read-0-32.mo";
-  g_stdin = open ("module/mes/read-0-32.mo", O_RDONLY);
-  char *read0 = MODULEDIR "mes/read-0-32.mo";
+  g_stdin = open ("module/mes/boot-0.32-mo", O_RDONLY);
+  char *read0 = MODULEDIR "mes/boot-0.32-mo";
   g_stdin = g_stdin >= 0 ? g_stdin : open (read0, O_RDONLY);
 #else
-  char *mo ="mes/read-0.mo";
-  g_stdin = open ("module/mes/read-0.mo", O_RDONLY);
-  g_stdin = g_stdin >= 0 ? g_stdin : open (MODULEDIR "mes/read-0.mo", O_RDONLY);
+  char *mo ="mes/boot-0.mo";
+  g_stdin = open ("module/mes/boot-0.mo", O_RDONLY);
+  g_stdin = g_stdin >= 0 ? g_stdin : open (MODULEDIR "mes/boot-0.mo", O_RDONLY);
 #endif
 
   if (g_stdin < 0)
     {
-      eputs ("no such file: ");eputs (mo);eputs ("\n");
+      eputs ("no such file: ");
+      eputs (mo);
+      eputs ("\n");
       return 1;
     } 
   assert (getchar () == 'M');
@@ -2362,20 +2366,12 @@ main (int argc, char *argv[])
     ARENA_SIZE = atoi (p);
   if (p = getenv ("MES_SAFETY"))
     GC_SAFETY = atoi (p);
-  if (argc > 1 && !strcmp (argv[1], "--help"))
-    return puts ("Usage: mes [--dump|--load] < FILE\n");
-  if (argc > 1 && !strcmp (argv[1], "--version"))
-    {
-      puts ("Mes ");puts (VERSION);puts ("\n");
-      return 0;
-    };
   g_stdin = STDIN;
   g_stdout = STDOUT;
   r0 = mes_environment ();
 
   SCM program = (argc > 1 && !strcmp (argv[1], "--load"))
     ? bload_env (r0) : load_env (r0);
-  g_tiny = argc > 2 && !strcmp (argv[2], "--tiny");
   if (argc > 1 && !strcmp (argv[1], "--dump"))
     return dump ();
 
index e0cebea0255412c79e1954faddce83a78d76a6da..d012f6a5b6136376c7ac1a87ec2d52f521d507a4 100644 (file)
@@ -439,8 +439,6 @@ reader_read_string ()
   return MAKE_STRING (lst);
 }
 
-int g_tiny = 0;
-
 int
 dump ()
 {
index dcd5ee8bcd57d3beda94b091f34e4f0580f225ec..e9942df9d73d961b6f83a115a76760bf705dc6f6 100755 (executable)
@@ -1,8 +1,7 @@
 #! /bin/sh
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
-#export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 455c598fea2dbfb8f9309d6835eb114f84cf0aee..753f4b6c72f44ea7cebd2a1b5bca670f708a1157 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 export MES_BOOT=boot-02.scm
-$MES $MES_FLAGS "$@" < $0
+$MES < $0
 exit $?
 !#
 
index 8b6a258a775c0366c8b943bd48fac34aae964e08..03029424a3c49d8baf1757ebe4477f5f69ac4b24 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index dbbea982ccdf4126fc97951c9bf7eaccf4fc9398..7ec5a7064dd580c088e921ff16051d58026095b1 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 742e7cbdb07cbb60c3887d74c754ca688eec7030..0676cc5523bd726beda571da015e67589c9eee47 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index c645c1fdc43a61f3202ca1396606c87de6225768..88d49647ed84b78cf13dbf66ed07fb74eb2c06f9 100755 (executable)
@@ -1,8 +1,7 @@
 #! /bin/sh
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
-#export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index b405d089fd39802f4d1d21335561a9694d3c31db..0ddb05c311b7d2adaed8f5d0c3f299970c6295db 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index ae4ef740c9b63c54ca764e5688e831a7bfef26fb..ae835c5ef96e34ae2fe44a996023d543f20fe095 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index ff74e0874af3ab2174b082e80aae55055704eda6..8aed9e84672798e8224eed939fc2cd7f2ce95c0d 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 3eaf9d5d3b65e4d09c1ed24275ef2ed2f4769427..2037a3da902d63ac06f5ccb77cff3322793111c1 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 0431e9d4946e747ac95289e0dc26cd7c091a1f99..9a6309195baff6d7460f74568c0cd8da34e3ed13 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 76bead2aa9821361a008edeac1e4e32c8c3d884f..73e7876c136db88881ee60a5bf32060b5305d9c2 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 7f2af71e42bb98acce99dbb2b587d4b2f539ab9e..f66c8c671454f9ce53550a920774d6f336765245 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index fc88879f441d3c153aa0c4561da40735e7dc9241..4659dd78c47cccccd6d311b4406f0731e396ec15 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 5209464038cf06d1f3ac1846c9191b07680ffb15..03e5ff673ca9fcbb92e93a4422cc0e0c5c515038 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 575aeaacb0b77cb3d9b7f060a24a2085e95c663e..597834186bd4471eee4f878af7bdab232a66863d 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-166000000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 596b6d9a8ff85067598a632392d7659da935d1a7..247354c06f125fc9598134063801ed887fe49046 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 441e782d083c2142e1b9d016297562e5af466f17..088f9faabcc77a0a2ee6a040ac2b3c0c88627a7f 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-200000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index b339fba1900b1d0e4fc9a44f7ff18725332211ff..cdeb7c3fd9a91d4031c577eb6e0a6059198366b1 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 #paredit:||
 exit $?
 !#
index d99568fde2d249e22c3b103e6046c349d487af86..1b470f8a86b7575253d4bdc3f69ca7ed906131ae 100755 (executable)
@@ -2,8 +2,7 @@
 # -*-scheme-*-
 # ***REMOVE THIS BLOCK COMMENT INITIALLY***
 MES=${MES-$(dirname $0)/../src/mes}
-#export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 295b586264419d5a4ca8bd1c67ba916a46b495b6..9b21cb5b6dd933207746f2e20fa3d0a063abe50a 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 0e1927fff7f980e3ce6eda6238a99987b1a841e4..6a9277bbec2bf8eb70731e02d6c943408ef8a60b 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 14eb6e2f6c896c75346a7779f6aa7a2e1dc6c85e..719adfec81ffbc7d05634a3f712994947fae8bde 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 39e7224ae3ab85991b2db66deb25d9867f995935..a78246aed5b9bc06d90906cba9c0ae9f1c796760 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 195def2a675a09460ae1af4dd5028413c066a2cc..a26823e315f6cef1570e4427d1adefa634b63581 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index a250e8a84650efdeed8e24bca4d5803b47249f19..496cf0ee50192977f0c5d2f8e44324cdeb18ae90 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index e46cd00514866b6ac67831e6e35224589a1700d7..a8ddce95c7e088031607b1effbd24104fb4404a5 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 96363ea7997df299e76e17158e23a507a7449985..c8ab06275c08524d75095bc812582f593c586b80 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#
 
index 74290bd426d78018d14035285562390b1d1927b2..73ada674c1d17b48abfabcb7f8fab4adf41787bd 100755 (executable)
@@ -2,7 +2,7 @@
 # -*-scheme-*-
 MES=${MES-$(dirname $0)/../src/mes}
 #export MES_ARENA=${MES_ARENA-40000}
-$MES $MES_FLAGS "$@" < $0
+$MES -s $0
 exit $?
 !#