* geesh/pattern.scm (ascii-lower-case, ascii-upper-case, asii-digits):
Remove variables.
(character-range): New function.
(parse-matching-bracket-expression): Use it to allow any character
range contained in one of the ASCII uppercase, ASCII lowercase, or
ASCII digits character sets.
* geesh/built-ins/utils.scm (get-evaluator): New public function.
* geesh/built-ins/dot.scm: New file.
* geesh/built-ins/eval.scm: New file.
* geesh/Makefile.am: Add them.
* geesh/built-ins.scm (*special-built-ins*): Add dot and eval.
* geesh/shell.scm (ignore-errexit?): New parameter.
(without-errexit): New function.
(errexit): New function.
(sh:exec-let, sh:set-redirects, sh:with-redirects, sh:subshell,
sh:substitute-command, sh:pipeline, sh:and, sh:or, sh:not, sh:while,
sh:cond): Use it to exit on nonzero status.
* geesh/built-ins/set.scm (option?): New function.
(option-letter?): New function.
(set-option!): New function.
(main): Set or print options as specified by the given arguments.
* tests/spec/oil.scm: Filter out a redirect test that was only passing
because set did not work.
* geesh/environment.scm (*options*): New variable.
(getopt): New public function.
(setopt!): New public function.
(*option-names*): New public variable.
(*option-letters*): New public variable.
* geesh/repl.scm (run-repl): Add optional port parameter.
* scripts/geesh.in: Add '--command' and '--stdin' flags, and if
neither flag is provided, treat the first argument as a file to
interpret.
Instead of passing around references to the environment, just treat it
as a global. The old way was just the remains of an idea to make the
environment immutable and keep the interpreter from manipulating any
global state. By making everything global and mutable, we will have
less impedance mismatch with POSIX going forward.
The following changelog is only a sketch, since nearly every function
has changed.
* geesh/environment.scm: Replace this module with one that treats the
environment as a global resource.
* tests/environment.scm: Delete file.
* Makefile.am: Remove it from the list of tests.
* geesh/shell.scm, geesh/eval.scm, geesh/repl.scm, geesh/word.scm,
geesh/built-ins/break.scm, geesh/built-ins/continue.scm,
geesh/built-ins/echo.scm, geesh/built-ins/export.scm,
geesh/built-ins/false.scm, geesh/built-ins/read.scm,
geesh/built-ins/readonly.scm, geesh/built-ins/set.scm,
geesh/built-ins/true.scm, geesh/built-ins/unset.scm: Remove 'env'
parameters and use the new environment module.
* .dir-locals.el: Update indentation of functions that no longer take
an 'env' parameter and add with-arguments, with-environ, and
with-variables from the new environment module.
* tests/shell.scm, tests/word.scm: Update environment creation and
manipulation in tests.
* geesh/environment.scm (<variable>): New record type.
(make-environment): Initialize variables as records.
(var-ref): Extract value from record.
(set-var!): Inject value into record and throw an error if variable
is read-only.
(set-var-export!): New public function.
(set-var-read-only!): New public function.
(environment->environ): Only include exported variables.
* geesh/word.scm (expand-word): Change the 'split?' keyword argument
to 'output', accepting one of 'fields', 'string', or 'pattern'.
(word->qword): Update calls.
* geesh/eval.scm (eval-word): Same as 'expand-word' above.
(eval-redir): Update call.
(eval-sh): Update calls.
* geesh/environment.scm (delete-environment-vars!): New public function.
(delete-environment-functions!): New public function.
* geesh/built-ins/unset.scm: New file.
* Makefile.am: Add it.
* geesh/built-ins.scm: Enable 'unset'.
Sometimes we need to make minor changes to the tests to make them work
for us. This patch enables doing search and replace on a test-by-test
basis.
* tests/spec/oil.scm: Allow for tests to be modified.
* geesh/shell.scm (sh:set-redirects): New public function.
* geesh/eval.scm (eval-sh): Use it to handle 'exec' specially when
called with redirects but no arguments.
This was simply a mistake.
* geesh/shell.scm (sh:substitute-command): Leave 'current-input-port'
and 'current-error-port' alone.
* tests/shell.scm: Remove tests that check that input and error gets
ignored during substitutions.
Instead of saving and restoring redirects manually, if we let them all
be parameters (like 'current-input-port'), we can use 'parameterize'
and make Guile take of this for us. As a side-effect of this change,
redirect errors get handled.
* geesh/shell.scm (save-and-set-redirect): Rename this...
(redir->parameter+port): ...to this and change the return value to be
a pair consisting of a parameter and a port.
(restore-saved-port): Remove function.
(sh:with-redirects): Use 'parameterize' to effect redirects rather
than updating them and restoring them manually.
There are two issues that arise due to output port buffers and
forking. If we run Scheme code in a child process, we need to avoid
copying buffered output into the child process. Otherwise, the
buffered output could be written twice. If we run non-Scheme
code (i.e., exec), we need to flush the ports to ensure proper
sequencing of writes since the non-Scheme code will not know about the
buffered output and will write its output before the buffer gets
flushed.
* geesh/shell.scm (exec-utility): Flush all ports before forking.
(%subshell): Ditto.