This change adds support for Guile-style modules, but does not
enable it by default. It can be enabled by using the 'boot-5' boot
script.
* mes/module/mes/guile-module.mes: New file.
* mes/module/mes/boot-5.mes: New file.
* mes/module/mes/boot-0.mes (effective-version, include-from-path)
(define-module, use-modules, effective-version): Move these...
* mes/module/mes/guile.scm: ...here.
* mes/module/mes/boot-0.mes: Move '%main' and the command-line
interface code...
* mes/module/mes/main.mes: ...to this new file.
* mes/module/mes/boot-0.mes: Import '(mes guile)' and '(mes main)'.
* mes/module/ice-9/rdelim.scm: New file.
* tests/data/bar.scm: New file.
* tests/data/foo.scm: New file.
* tests/guile-module.test: New file.
* build-aux/check-mes.sh (TESTS): Add it.
If 'make-fluid' is a macro that calls 'gensym' directly, any attempt
to wrap 'make-fluid' will result in only one symbol being produced
at expansion time.
* mes/module/mes/fluids.mes (make-fluid): Rewrite to generate a
symbol at evaluation time, and use that symbol as a key for a hash
table.
(fluid?, fluid-ref, fluid-set!): Adjust accordingly.
(with-fluid*, with-fluids): Use 'fluid-ref' instead of applying a
fluid directly.
* tests/fluids.test: Add test.
* src/eval-apply.c (expand_variable_): Process internal definitions
as local variables; ensure all free variables are bound (creating
bindings if necessary).
(eval_apply): When evaluating a pair with a binding in its car,
evaluate the binding before dispatching; when evaluating a binding,
raise an error if the location does not have a value.
* src/mes.c (mes_environment): Bind special symbols to themselves.
* mes/module/mes/boot-0.scm (defined?): Make sure the variable
actually has a value.
* mes/module/mes/boot-00.scm (defined?): Likewise.
* mes/module/mes/boot-01.scm (defined?): Likewise.
* mes/module/mes/boot-02.scm (defined?): Likewise.
* mes/module/mes/boot-03.scm (defined?): Likewise.
* scaffold/boot/60-let-syntax-expanded.scm (defined?): Likewise.
* src/eval-apply.c: Do not add a frame to the GC stack while making
a continuation.
* mes/module/mes/catch.mes (catch): Remove workaround.
* tests/boot.test: Add test.
* src/eval-apply.c (set_x): Add the 'define_p' argument and if it is
not set, signal an error on an undefined variable.
(eval_apply): When evaluating 'set-x!' forms, leave 'define_p'
unset; when evaluating 'define' forms, set 'define_p'.
If we want to make variable lookup extensible, we need to call into
Scheme code during lookup. This might cause the garbage collector
to run, invalidating any pointer held by C code. This change
updates call sites for variable lookup to avoid holding pointers
into Scheme data.
* src/eval-apply.c (expand_variable_): Store expressions and formals
in GC-managed registers.
(expand_variable): Initialize registers for 'expand_variable_'.
(eval_apply): When evaluating 'define' and 'define-macro' forms, do
not rely on local C variables after calls to 'lookup_binding' or
'expand_variable'.
In addition to simplifying the interpreter, this change ensures that
'primitive-load' evaluates the loaded file in the top level
environment.
* include/mes/symbols.h (cell_symbol_primitive_load): Remove
variable.
(cell_vm_begin_primitive_load): Remove variable.
(cell_vm_begin_expand_primitive_load): Remove variable.
(SYMBOL_MAX, CELL_SYMBOL_RECORD_TYPE): Adjust accordingly.
* src/symbol.c (init_symbols): Do not initialize removed variables.
* src/eval-apply.c (eval_apply): Remove primitive load code.
(primitive_load): New function.
* include/mes/builtins.h (primitive_load): Declare it.
* src/builtins.c (mes_builtins): Initialize it.
* mes/module/mes/boot-03.scm: Remove duplicate call to
'primitive-load'.
* mes/module/mes/boot-0.scm: Remove extra call to 'primitive-load';
adjust how the "--main" option is handled.
* tests/base/test.test: Add a test.
* tests/data/load.scm: Set the 'toplevel?' variable to support the
new test.
* src/eval-apply.c (eval_apply): When evaluating 'define', recompute
the 'global_p' and 'local_p' flags; when evaluating a local
definition, set the closure directly instead of using 'set_x'.
* tests/base.test: Add a test.
* mes/module/srfi/srfi-9-struct.mes (print-record-type): New
procedure.
(make-record-type): Add 'printer' as new record type field and use
'print-record-type' as the struct printer.
(record-type-printer): New procedure.
(record-type-fields): Bump index for the 'printer' field.
(record-constructor): Use the record type printer as the struct
printer if it is defined.
(record-printer): Print the record type name instead of the raw
record type.
* scaffold/boot/17-open-input-string.scm: Test 'current-module' to
see if we can lookup 'read-string' in a module.
* scaffold/boot/gc.scm: Skip all tests on Guile.
* tests/gc.test: Rename 'mes?' to 'mes-core?'; use 'current-module'
to check if we need to use core Mes procedures; and adjust all tests
accordingly.
* tests/scm.test (iota -1): Skip on Guile.
* tests/vector.test (make-vector): Adjust for Guile.
* include/mes/mes.h (M1): New variable.
* src/mes.c (main): Initialize it.
* src/gc.c (gc_flip): Account for it.
(gc_): Copy it.
(gc_dump_state): Dump it.
* src/test/gc.c (test_setup, main): Initialize it.
* src/module.c (current_module): New function.
* src/builtiins.c (mes_builtins): Register it as 'current-module'.
* include/mes/builtins.h (current_module): Declare it.
This change removes the internal '<module>' record type, and changes
the initial module to be a plain hash table.
* src/symbol.c (init_symbols_): Remove 'cell_symbol_module'.
* include/mes/symbols.h (cell_symbol_module): Remove declaration.
(CELL_SYMBOL_MAX, CELL_SYMBOL_RECORD_TYPE): Adjust accordingly.
* src/module.c (make_initial_module): Use a raw hash table instead
of a struct.
(module_variable, module_define_x): Adjust accordingly.
(make_module_type, module_printer): Remove functions.
* src/builtins.c (mes_builtins): Do not register them.
* include/mes/builtins.h (make_module_type, module_printer): Remove
declarations.
* src/eval-apply.c (eval_apply): Replace 'module_printer' with
'hash_table_printer'.
* src/mes.c (main): Likewise, and initialize 'R0' after calling
'make_initial_module'.
Co-authored-by: Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
This change introduces a 'lexical?' field for bindings (called
'lexical_p' and stored in the cdr of the binding cell). Non-lexical
bindings handle variables transparently, while lexical bindings do
not.
* src/module.c (module_define_x): Wrap value in a variable.
* include/mes/mes.h (scm): Add 'lexical_p' to the cdr union.
* src/eval-apply.c (make_binding_): Add a 'lexical_p' argument.
(lookup_handle): Remove function.
(lookup_binding): Add function.
(lookup_value): Use 'lookup_binding' and return the contents of
variables that are not bound lexically.
(set_env_x): Remove function.
(set_x): New function.
(expand_variable_): Use 'lookup_binding' in place of
'lookup_handle'.
(eval_apply): Likewise; use 'set_x' in place of 'set_env_x'; and
when evaluating a binding, return the contents of variables that are
not bound lexically.
* include/mes/builtins.h (set_env_x): Remove declaration.
* src/builtins.c (mes_builtins): Do not register 'set-env!'.
* scaffold/boot/53-closure-display.scm (closure)[mes]: Rewrite to
avoid 'module-variable'.
* src/variable.c: New file.
* simple.make (LIBMES_SOURCES): Add it.
* build-aux/configure-lib.sh (mes_SOURCES): Add it.
* build-aux/snarf.sh: Snarf it.
* kaem.run: Compile it.
* include/mes/builtins.h (make_variable): New function.
(variable_p): New function.
(variable_ref): New function.
(variable_set_x): New function.
(variable_printer): New function.
* src/builtins.c (mes_builtins): Register them.
* include/mes/mes.h (make_variable_type): New function.
(scm_variable_type): New variable.
* src/module.c (make_initial_module): Initialize it.
* src/gc.c (gc_flip, gc_): Keep track of it.
* include/mes/symbols.h (cell_symbol_variable): New variable.
(SYMBOL_MAX): Adjust accordingly.
* src/symbol.c (init_symbols): Initialize 'cell_symbol_variable'.
* mes/module/mes/scm.mes (make-undefined-variable): New procedure.
(variable-bound?): New procedure.
* tests/variable.test: New file.
* build-aux/check-mes.sh (TESTS): Add it.
* src/module.c (module_variable): Do not search local bindings.
(module_ref): Remove function.
* src/eval-apply.c (lookup_handle): New function.
(lookup_value): New function.
(set_env_x, expand_variable_, eval_apply): Use 'lookup-handle' and
'lookup-value' in place of 'module_variable' and 'module_ref'
respectively.
* src/core.c (error): Likewise.
* include/mes/mes.h (lookup_handle, lookup_value): Add declarations.
* include/mes/builtins.h (module_ref): Remove declaration.
* src/builtins.c (mes_builtins): Remove "module-ref".
Co-authored-by: Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* include/mes/mes.h (scm_hash_table_type): New type.
* src/hash.c (make_hash_table_type): Rename from make_hash_type, and
initialize it.
* src/symbol.c (init_symbols): Add it to environment.
* tests/hash.test: Add a test.
Co-authored-by: Timothy Sample <samplet@ngyro.com>
This merely allows adding non-string keys to a hash table and puts them
non-string keys in bucket 0. Efficiency is lost. TODO: calculate a
proper hash.
* src/hash.c (hash_): Allow non-string keys in bucket 0.
* tests/hash.test: Add a test.
Co-authored-by: Timothy Sample <samplet@ngyro.com>
This fixes
gcc-lib/libc+gnu.c: At top level:
gcc-lib/libc+gnu.c:2694:1: error: conflicting types for ‘execve’
execve (char const *file_name, char **argv, char **env)
^~~~~~
In file included from gcc-lib/libc+gnu.c:492:0:
include/unistd.h:66:5: note: previous declaration of ‘execve’ was here
int execve (char const *file, char *const argv[], char *const env[]);
^~~~~~
This reverts commit 828c27a073.