* libguile.h:
* libguile/Makefile.am:
* libguile/deprecated.h:
* libguile/deprecated.c:
* libguile/init.c:
* libguile/properties.c:
* libguile/properties.h: Deprecate the "primitive properties"
interface. It was only used to implement object properties, and that
is no longer the case.
* module/ice-9/boot-9.scm (make-object-property): Reimplement just in
terms of weak hash tables, and make threadsafe.
* NEWS:
* doc/ref/api-utility.texi: Update.
* libguile/ports.h (scm_i_remove_port): Remove declaration, as it was
SCM_INTERNAL.
* libguile/ports.c (scm_add_to_port_table): Issue a deprecation
warning if this function is called. Remove needless SCM_API
declaration, it was already declared as such in ports.h. Safely
access the port table.
(scm_i_remove_port): Remove bogus comment about lack of need for
threadsafety. Take the port table mutex.
(scm_close_port): No need to take port table mutex around calling
scm_i_remove_port.
* libguile/ports.c (scm_i_set_default_port_encoding,
scm_i_default_port_encoding): New function. Replace
`scm_i_set_port_encoding_x' and `scm_i_get_port_encoding' with
PORT == SCM_BOOL_F.
(scm_i_set_port_encoding_x): Assume PORT is a port.
(scm_i_get_port_encoding): Remove.
(scm_port_encoding): Adjust accordingly.
(scm_new_port_table_entry): Use `scm_i_default_port_encoding'.
* libguile/ports.h (scm_i_get_port_encoding): Remove declarations.
(scm_i_default_port_encoding, scm_i_set_default_port_encoding): New
declarations.
* libguile/posix.c (setlocale): Use `scm_i_set_default_port_encoding'.
* module/ice-9/getopt-long.scm (fatal-error): New helper. For errors
that come from the user -- i.e., not the grammar -- we will handle our
own error printing and call `exit' rather than relying on the root
catch handler. This is more friendly to the user than a Scheme
backtrace.
(parse-option-spec, process-options, getopt-long): Call `fatal-error'
as appropriate.
* test-suite/tests/getopt-long.test (pass-if-fatal-exception): New
helper, checks that a certain key was thrown to, and that suitable
output has been printed on an error port.
(deferr): Change to expect a 'quit key instead of 'misc-error. Update
exceptions to not match the beginning of the string, as that will be
the program name. Update tests to use pass-if-fatal-exception.
* module/ice-9/getopt-long.scm: #:keywords in the define-module block.
(option-spec): Define as a srfi-9 record instead of playing macro
games with boot-9 records.
* libguile/backtrace.c (display_error_body): Don't look up the
frame-source if Guile isn't initialized yet. Fixes display-error
before boot has finished.
* libguile/throw.c (handler_message): Likewise, don't backtrace before
boot has finished, because we can't load (system vm frame).
* libguile/throw.c (find_pre_init_catch): New internal helper.
(pre_init_throw): If we don't find a catch, print out a message and
abort.
(scm_init_throw): Declare pre-init-throw as taking at least one arg.
* libguile/foreign.c (unpack): Make sure X is a pointer before using
`SCM_POINTER_VALUE'.
* test-suite/tests/foreign.test ("pointer->procedure"): New test prefix.
* meta/uninstalled-env.in (subdirs_with_ltlibs): Remove "srfi".
Reorder the load-path and load-compiled-path to put the root dir after
guile-readline, so that relative canonicalization computes the correct
path for ice-9/readline.scm.
* module/ice-9/format.scm (format): When DESTINATION is #f, use a
Unicode-capable output string port.
* test-suite/tests/format.test ("format basic output")["default to
Unicode-capable port"]: New test.
* module/system/repl/error-handling.scm (display-syntax-error)
(error-string): Until we get the exception-printing patch merged in,
copy display-syntax-error into error-handling so that we avoid
display-error. Fixes bug 32365.
* module/ice-9/psyntax.scm (quasiquote): Import new definition from
upstream psyntax, to allow unquote and unquote-splicing to take
multiple arguments.
(unquote, unquote-splicing): Adapt to not require a particular syntax
form.
* module/ice-9/psyntax-pp.scm: Regenerated.
* module/language/tree-il/inline.scm (boolean-value): Add a case for
applications of primitives, and move the memq/memv->bool code here.
(inline!): We were inlining (memq 'a '(a b c)) => #t, and not the list
tail, which was an embarrassing bug. Fixed by moving this code to the
boolean-value function. Thanks to Mark Harig for the report.
When parsing non-real complex numbers, apply exactness specifiers on
per-component basis, as is done in PLT Scheme. For complex numbers
written in rectangular form, exactness specifiers are applied to the
real and imaginary parts before calling scm_make_rectangular. For
complex numbers written in polar form, exactness specifiers are applied
to the magnitude and angle before calling scm_make_polar.
There are two kinds of exactness specifiers: forced and implicit. A
forced exactness specifier is a "#e" or "#i" prefix at the beginning of
the entire number, and applies to both components of a complex number.
"#e" causes each component to be made exact, and "#i" causes each
component to be made inexact. If no forced exactness specifier is
present, then the exactness of each component is determined
independently by the presence or absence of a decimal point or hash mark
within that component. If a decimal point or hash mark is present, the
component is made inexact, otherwise it is made exact.
After the exactness specifiers have been applied to each component, they
are passed to either scm_make_rectangular or scm_make_polar to produce
the final result. Note that this will result in a real number if the
imaginary part, magnitude, or angle is an exact 0.
Previously, both forced and implicit exactness specifiers applied to
the number as a whole _after_ calling scm_make_rectangular or
scm_make_polar.
For example, (string->number "#i5.0+0i") now does the equivalent of:
(make-rectangular (exact->inexact 5.0) (exact->inexact 0))
which yields 5.0+0.0i. Previously it did the equivalent of:
(exact->inexact (make-rectangular 5.0 0))
which yielded 5.0.
* libguile/numbers.c (mem2ureal): Receive a forced exactness specifier
(forced_x), create and maintain our own implicit exactness specifier
flag local to this component (implicit_x), and apply these exactness
specifiers within this function. Previously, we received a pointer to
an implicit exactness specifier flag from above, and the exactness
specifiers were applied from within scm_i_string_length.
(mem2complex): Receive a forced exactness specifier parameter and pass
it down to mem2ureal. Previously, we passed down a pointer to an
implicit exactness specifier flag instead.
(scm_i_string_to_number): No longer create an implicit exactness
specifier flag here, and do not apply exactness specifiers here. All
we do here now regarding exactness is to parse the "#e" or "#i" prefix
(if any) and pass this information down to mem2ureal via mem2complex
in the form of an explicit exactness specifier (forced_x).
(scm_c_make_polar): If the cosine and sine of the angle are both NaNs
and the magnitude is zero, return 0.0+0.0i instead of +nan.0+nan.0i.
This case happens when the angle is not finite.
* test-suite/tests/numbers.test (string->number): Move the test cases
for non-real complex numbers into a separate table in which the
expected real and imaginary parts are separate entries. Add several
new test cases.
* numbers.c: Add new macros DOUBLE_IS_POSITIVE_INFINITY and
DOUBLE_IS_NEGATIVE_INFINITY.
(scm_max, scm_min): Use the new macros to detect particular
infinities. Previously we checked the return value of `isinf'
to determine the sign of the infinity, but that is not portable.