* module/oop/goops.scm (compute-keyword-formal-ids): Renamed from
->keyword-formal-ids; modified to do work both on the list of formals
and the list of formal ids in the next-method call.
(compute-make-procedure): Use compute-keyword-formal-ids.
* module/oop/goops (compute-procedure, compute-make-procedure): Emit
lambda or lambda* as appropriate. This doesn't matter now since all
will boil down to lambda-case, but to be future-proof...
Also add some clarifying comments.
* module/oop/goops.scm (method-keyword-formals?): Remov method slot
keyword-formals? as well as exported procedure method-keyword-formals?
introduced in 765f1d49 by partially reverting that commit.
* module/oop/goops.scm: Export method* and define-method*.
(define-method): Extract definitions of helper procedures and place
them in an eval-when at top level.
(define-method*): Renamed from last commits define-method and modified
to invoke method*.
(define-method): New syntax.
(parse-keyword-formals): Renamed from parse-formals and modified to
give keyword methods a specialzers list with tail <top>.
(parse-formals): Re-introduce the code of previous parse-args.
(%compute-applicable-methods): Revert change of previous
commit. Giving keyword methods a specializer tail <top> naturally
makes original %compute-applicable-methods work also with keyword
methods (which kind of shows that we have made the correct choices).
(method*): Renamed from last commit's "method".
(method): New syntax.
* module/oop/goops.scm (keyword-formals?): New slot in <method>.
(method-keyword-formals?): New exported <method> getter.
(%compute-applicable-methods): Treat method as applicable if having
matched all specializers, still have further arguments and have
keyword-formals.
(%compute-applicable-methods): Remove unused local variable n.
(define-syntax method): Rename parse-args to parse-formals.
(parse-formals): Return formals, specializers and keyword-formals.
(compute-procedure): Make a lambda* with possibly keyword formals.
(->formal-ids): Renamed from ->proper and now returns formal-ids.
(->keyword-formal-ids): New procedure. Filter out formal ids from
a keyword formal specification.
(compute-make-procedure): Adapted for keyword formals. Needs
->formal-ids and ->keyword-formal-ids to compute the
real-next-method call.
(compute-procedures): Pass on keyword-formals.
(syntax method): Adapted for keyword formals.
* module/ice-9/psyntax.scm (define/override, define*/override): Use
instead of set! on globals.
($sc-dispatch): Renest. Will compile to the same thing as before.
* module/ice-9/psyntax-pp.scm: Regenerate.
* module/ice-9/psyntax.scm (resolve-module*, resolve-variable): New
helpers.
(free-id=?, resolve-identifier): Use new helpers.
* module/ice-9/psyntax-pp.scm: Regenerate.
* module/ice-9/psyntax.scm (expand-let, expand-letrec, ...): Name these
expanders, then install them. Allows for better code evolution and
decreases the indent.
* module/ice-9/psyntax-pp.scm: Regenerate.
* module/ice-9/psyntax.scm (build-lexical-reference): No "type"
parameter. Adapt callers.
(valid-bound-ids?, distinct-bound-ids?, bound-id-member?): Use match.
(expand-sequence, expand-top-sequence): Use match. For
expand-top-sequence, ensure that both phases of expansion are run in
order; was the case before, but by accident. Don't accumulate results
in reverse.
(parse-when-list): Use match.
* module/ice-9/psyntax.scm (id-var-name): No need for `search` to return
the marks. Simplify to use scope instead of repeating, and use match.
* module/ice-9/psyntax-pp.scm: Regenerate.
* module/ice-9/psyntax.scm (maybe-name-value): Return a fresh lambda
instead of mutating the given lambda.
(define-expansion-accessors): No need to define setters.
* module/ice-9/psyntax.scm (gen-unique): Instead of making a string with
an embedded hex counter, make a vector. A little less work than making
a string, and slightly smaller binaries.
(gen-label, gen-mark): Use gen-unique.
(resolve-identifier): Adapt case that recognizes labels denoting
lexicals to be less strict.
* module/ice-9/psyntax-pp.scm: Regenerate.
* module/ice-9/psyntax.scm (expand-top-sequence): Remove needless
gen-label uses, and replace one use with gen-lexical (which is what is
needed).
* module/ice-9/psyntax-pp.scm: Regenerate.
Fixes <https://bugs.gnu.org/73835>.
This fixes this error when compiling with GCC 14 and musl libc on 32-bit
Alpine Linux:
filesys.c: In function 'scm_sendfile':
filesys.c:1405:16: error: assignment to 'off_t *' {aka 'long long int *'} from incompatible pointer type 'scm_t_off *' {aka 'long int *'} [-Wincompatible-pointer-types]
1405 | offset_ptr = SCM_UNBNDP (offset) ? NULL : &c_offset;
| ^
* libguile/filesys.c (scm_sendfile): Change type of ‘c_offset’.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
The current recommendation of `list-copy' is not right and does not lead
to preserving the original list:
scheme@(guile-user)> (define x (list (cons 'a 1) (cons 'b 2)))
scheme@(guile-user)> (define y (list-copy x))
scheme@(guile-user)> (assq-set! y 'b 3)
$1 = ((a . 1) (b . 3))
scheme@(guile-user)> x
$2 = ((a . 1) (b . 3))
Correct approach seems to be use `alist-copy' from SRFI-1 leading to the
expected behavior of:
scheme@(guile-user)> ,use (srfi srfi-1)
scheme@(guile-user)> (define x (list (cons 'a 1) (cons 'b 2)))
scheme@(guile-user)> (define y (alist-copy x))
scheme@(guile-user)> (assq-set! y 'b 3)
$1 = ((a . 1) (b . 3))
scheme@(guile-user)> x
$2 = ((a . 1) (b . 2))
* doc/ref/api-data.texi (Adding or Setting Alist Entries): Recommend
`alist-copy'.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
The incorrect procedure is mentioned; see the example that immediately
follows.
* doc/ref/api-foreign.texi (Foreign Functions): fix typo to
pointer->procedure.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
According to the previous wording, omitting all optional arguments led
to empty interface. That however was not the case and was only a
documentation bug (as confirmed by wingo on IRC). So let us fix that.
* doc/ref/api-modules.texi (Using Guile Modules): Fix implication of
omitting optional arguments.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
The specification mandates a string, but with rationale suggesting symbols
would be a more natural fit.
> In some ways using symbols would be preferable. However, we want
> human-readable names, and standard Scheme does not provide a way to include
> spaces or mixed-case text in literal symbols.
Add support for symbols as an implementation extension and for backwards
compatibility with the reference implementation.
* module/srfi/srfi-64.scm (%cmp-group-name): New procedure.
(test-end): Use it.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Reported-by: Daniel Llorens <lloda@sarc.name>
Fixes <https://bugs.gnu.org/30600>.
* module/system/repl/command.scm (define-meta-command): Flush all
remaining input after handling a read error.
* module/system/repl/common.scm (flush-all-input): New public procedure.
* module/system/repl/repl.scm: Remove local flush-all-input definition.
If pipe2 is not available (e.g. on MacOS) and flags are set,
SCM_SYSERROR was correctly signaled, however errno was not set, so it
reported as:
Undefined error: 0
That sucks both in tests (the test is not skipped) and in actual
usage (user has no idea what went wrong).
So set errno to ENOSYS as well.
* libguile/posix.c (scm_pipe2) [!HAVE_PIPE2] <c_flags>: Set errno to
ENOSYS.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
`tmpnam' is a deprecated procedure that can be excluded during a
configure (`--disable-tmpnam'). There currently was a single test
relying on it, and therefore failing is such configuration. This commit
switches to mkstemp instead.
* test-suite/tests/posix.test ("system*"): Use mkstemp instead of
tmpnam.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
On Darwin posix_spawnp is not considered secured and therefore we
fallback to Gnulib's version. That one however does not return ENOENT
when the file does not exist, but PID of the child process. This seems
to be allowed by the standard.
* test-suite/tests/posix.test (skip-on-darwin): New procedure.
("spawn")["file not file"]: Skip on Darwin.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
MacOS adds __CF_USER_TEXT_ENCODING to every program, in similar way GNU
Hurd prepends LD_ORIGIN_PATH (based on the comment). So extend the
logic to do similar stripping on MacOS.
* test-suite/tests/posix.test ("spawn")
["env with #:environment and #:output"]: Strip trailing
__CF_USER_TEXT_ENCODING environment variable when on Darwin.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Darwin accepts any template, as demonstrated here:
#include <stdio.h>
#include <unistd.h>
int
main(void)
{
char template[] = {'T', '-', 'A', 'A', 'A', 'A', 'A', 'A', '\0'};
char *res = mkdtemp(template);
puts(res ? res : "(null)");
perror("mkdtemp");
}
Outputs:
T-AAAAAA
mkdtemp: Undefined error: 0
This does not match prescribed POSIX behavior, but it is what it is.
* test-suite/tests/filesys.test (skip-on-darwin): New procedure.
("mkdtemp")["invalid template"]: Skip on Darwin.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
When passed a port, `readlink' relies on the Linux specific behavior of
empty c_path meaning "the fd itself". That does not work on Darwin.
Since there is no branch that would yield both fd and c_path, fallback
to freadlink when __APPLE__ is defined.
* libguile/filesys.c (do_readlink): Call freadlink for !__APPLE__.
* configure.ac (AC_CHECK_FUNCS): Add freadlink.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>