* module/ice-9/psyntax.scm (generate-temporaries): Give temporaries the
current module, so that they may be bound at the top level.
* module/ice-9/psyntax-pp.scm: Regenerate.
(For use by guile-tools)
* module/ice-9/getopt-long.scm: Use (ice-9 optargs) so we can use
define*.
(process-options): Add stop-at-first-non-option parameter. When
this is true, stop processing when we hit a non-option (so long as
that non-option isn't something that resulted from the unclumping of
a short option group).
(getopt-long): Add #:stop-at-first-non-option keyword; pass it on to
process-options.
* test-suite/tests/getopt-long.test ("stop-at-first-non-option"): New
test (for the above).
This is needed as a prerequisite for the following change that
introduces the stop-at-first-non-option option, because when that
option is used we don't know upfront how far through the command
line we should proceed with unclumping.
* module/ice-9/getopt-long.scm (expand-clumped-singles): Delete.
(process-options): Add a loop variable to indicate how many elements
at the start of `argument-ls' are known not to be clumped. When we
see a short option and this variable is <= 0, perform unclumping
(using code that used to be in expand-clumped-singles) and loop with
the variable > 0.
(getopt-long): Don't call expand-clumped-singles upfront here.
Basically, accumulate values in the `process-options' loop variables,
instead of using set-option-spec-value!
* module/ice-9/getopt-long.scm (option-spec): Delete the `value' slot.
(process-options): Delete `val!loop' and just use `loop' everywhere
instead. When adding an option spec to `found', add the
corresponding value too; hence `found' becomes an alist, where it
was previously a list of specs.
(getopt-long): Use assq-ref to get values out of `found'. Remove
unhittable error condition for detecting an option that requires an
explicit value, where a value wasn't supplied. This condition is
actually caught and handled in `process-options'. Rewrite the end
of the procedure much more simply.
* module/ice-9/futures.scm (%workers, %create-workers!)
(create-workers!): Define a mechanism to spawn off the future threads
only when the first future is created.
(make-future): Call create-workers! here.
* module/ice-9/boot-9.scm (define-module): Fix to load the #:use-module
clauses in the order in which they appear in the define-module form.
Thanks to Jan Nieuwenhuizen for the report.
* test-suite/standalone/test-import-order: Add new test that
define-module and use-modules resolve the interface in the right
order.
* test-suite/standalone/Makefile.am:
* test-suite/standalone/test-import-order-a.scm:
* test-suite/standalone/test-import-order-b.scm:
* test-suite/standalone/test-import-order-c.scm:
* test-suite/standalone/test-import-order-d.scm: Aux files.
* module/ice-9/vlist.scm (vlist-fold-right): Avoid `vlist-reverse' and
instead `vlist-ref' individual elements. The result is about twice
faster. Thanks Andy for suggesting it indirectly. :-)
* module/ice-9/boot-9.scm (map, for-each): Implement in Scheme instead
of C. There are boot versions before `cond' is defined.
(map-in-order): Define this alias here instead of in evalext.h.
* libguile/eval.c: Stub out the map and for-each definitions to just
call into Scheme.
* libguile/evalext.c: Remove map-in-order definition.
* module/srfi/srfi-1.scm: Replace all calls to map1 with calls to map.
(map, for-each): Define implementations here, in Scheme, instead of in
C.
* test-suite/tests/eval.test (exception:wrong-length, "map"): Update the
expected exception for mapping over lists of different lengths.
* libguile/srfi-1.h:
* libguile/srfi-1.c: Remove map and for-each definitions. Remove the
bit that extended the core `map' primitive with another method: the
right way to do that is with modules.
* module/ice-9/r4rs.scm (call-with-input-file, call-with-output-file): Rewrite
with call-with-values.
(with-input-from-file): use call-with-input-file.
(with-output-to-file, with-error-to-file): use call-with-output-file.
Update docstrings to make clear that multiple values may be yielded.
* module/ice-9/boot-9.scm (while): Specify the return value as #f under
normal conditions, #t under (break), and arg... under (break arg...).
* test-suite/tests/syntax.test ("while"): Test.
* doc/ref/api-control.texi (while do): Document.
* module/ice-9/control.scm (reset, shift): Add implementations of these
operators from Wolfgang J Moeller, derived from implementations by
Oleg Kiselyov.
(reset*, shift*): Procedural variants.
* test-suite/tests/control.test ("shift and reset"): Add tests,
originally from Oleg Kiselyov.
* doc/ref/api-evaluation.texi (Compilation): Add discussion of
--fresh-auto-compile.
* doc/ref/scheme-scripts.texi (Invoking Guile): Add --fresh-auto-compile
option.
* NEWS: Add entry.
* libguile/load.c: Define %fresh-auto-compile.
(scm_primitive_load_path): Use it here.
(scm_init_load_should_auto_compile): Init from GUILE_AUTO_COMPILE env
var, with a value of "fresh".
* module/ice-9/boot-9.scm (load-in-vicinity): Auto-compilation cache is
stale if %fresh-auto-compile is true.
* module/ice-9/command-line.scm (compile-shell-switches): Parse out
--fresh-auto-compile.
* module/ice-9/command-line.scm: New module for parsing Guile's command
line, ported from script.c. Includes local eval-string implementation
to make `guile -c 1' faster, by not having to load the compiler.
* module/Makefile.am: Add to build.
* module/ice-9/boot-9.scm (define-inlineable): Moved here from SRFI-9.
* module/srfi/srfi-9 (define-inlinable): Removed here.
* doc/ref/api-procedures.texi (Inlinable Procedures): Add subsection
about `define-inlinable'.
* module/ice-9/psyntax.scm (fx+, fx-, fx=, fx<): Given our lame lack of
an inliner, inline these manually with identifier syntax.
* module/ice-9/psyntax-pp.scm: Regenerate.
* module/ice-9/psyntax.scm (with-syntax): Allow definitions in the body,
as seems to be suggested by the R6RS.
* test-suite/tests/syncase.test ("with-syntax"): Add test.
* module/ice-9/psyntax-pp.scm: Regenerate.
* libguile/r6rs-ports.c (scm_get_string_n_x): Implement `get-string-n!'
in C for efficiency.
* libguile/r6rs-ports.h: Add prototype for this function.
* module/ice-9/binary-ports.scm: Export `get-string-n!'.
* module/rnrs/io/ports.scm (get-string-n): Implement based on
`get-string-n!'.
Export both `get-string-n!' and `get-string-n'.
* module/rnrs.scm: Also export these.
* test-suite/tests/r6rs-ports.test (8.2.9 Textual input): Add a few
tests for `get-string-n' and `get-string-n!'.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
* module/ice-9/boot-9.scm (while): Report an error if `continue' is
passed one or more arguments. Previously, it would report an error if
`(continue arg rest ...)' was found within the `while', but not if
`continue' was found bare and later applied to one or more arguments,
e.g. `(apply continue (list arg rest ...))'.
* module/Makefile.am:
* module/ice-9/eval-string.scm: New module, for use in implementing the
scm_c_eval_string_from_file_line suggestion.
* test-suite/Makefile.am:
* test-suite/tests/eval-string.test: New tests.
* module/ice-9/boot-9.scm (module-use-interfaces!): Fix up to prevent
duplication in the use list of multiple incoming interfaces.
* test-suite/tests/modules.test ("module-use"): Add tests.
This fixes a problem with R6RS's `import' in particuliar: when importing
a subset of a library/module, the interface created for that purpose
inherits the name of the module it is derived from. The low-level
primitives that are used for importing would then disregard earlier
imports from the same module.
An example for this bug can be seen with the following library
definition:
(library (test-guile2)
(export foo)
(import (only (rnrs base) define)
(only (rnrs base) error))
(define (foo . args)
#t))
In the above, the import of `define' would be disregarded when `error'
is imported, thus leading to a syntax error, since `(foo . args)' is
treated as an application, since the binding of `define' would be not
present.
* module/ice-9/boot-9.scm (module-use!): Remove the filtering of the
existing imports of the module by name; a check for identity is
already done beforehand.
(module-use-interfaces!): Filter the existing imports by identity
instead of filtering them by their names.
* module/ice-9/boot-9.scm (scm-error-printer): Allow #f for rest args,
interpreting it as '(). Fixes regexp throws, which are of the form:
(regular-expression-syntax "make-regexp" "Invalid preceding regular expression" #f ("?.*"))
* module/ice-9/psyntax.scm (chi-top-sequence): Manually inline
eval-if-c&e into its two call sites; I found it hard to understand
otherwise. If the mode is just 'e, defer expansion of definitions and
expressions until the end, so that they can be expanded in a context
of all syntax expanders defined in the sequence.
* module/ice-9/psyntax.scm (chi-top-sequence): Pull chi-top into the
body of this toplevel begin expander. This will let us do r6rs
toplevel expansion correctly.
(chi-top): Remove.
(macroexpand): Dispatch to chi-top-sequence directly.
* module/ice-9/popen.scm (open-pipe*): Hack around the lack of an
after-gc hook, and pump the pipes guardian here in the procedure that
adds to the guardian.
* module/ice-9/binary-ports.scm: New module.
* module/Makefile.am: Add to makefile.
* module/rnrs/io/ports.scm: Re-export bindings from (ice-9 binary
ports). This will allow the compiler to not pull (rnrs) into its
included module set.
* module/ice-9/boot-9.scm (the-scm-module): Make it its own public
interface.
* test-suite/tests/modules.test ("foundations")["the-root-module",
"the-scm-module"]: New tests.