| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Register mkdir_wrap, chdir_wrap, getcwd_wrap, makedev_wrap, minor_wrap,
major_wrap and mknod_wrap.
* stream.c (mkdir_wrap, chdir_wrap, getcwd_wrap, makedev_wrap,
minor_wrap, major_wrap, mknod_wrap): New functions.
(stream_init): Initialize forgotten variable s-ifsock.
* stream.h (s_ifsock): Declared.
(mkdir_wrap, chdir_wrap, getcwd_wrap, makedev_wrap,
minor_wrap, major_wrap, mknod_wrap): Declared.
* txr.1: Forgotten documentation for remove-path and rename-path
added. Forgotten mention of s-ifsock. Documented new Unix functions.
|
|
|
|
|
|
| |
* txr.1: Documented.
* genvim.txr, txr.vim: Updated.
|
|
|
|
|
|
| |
of Lisp forms denoted by @.
(expand_meta): Bugfix: failure to expand vars, which can be
symbol macros now.
|
|
|
|
|
|
|
|
|
|
|
|
| |
vector literals using their original notation.
* parser.y (unquotes_occur): Takes new argument, level.
Only finds quotes which are at the given quasiquoting level.
Finally, this is the right semantics. In the first version of this
function, we were not eager enough: we neglected to find unquotes
that were wrapped in nested quasiquotes. Then we were too eager:
finding any unquotes, even ones belonging to the inner backquotes.
(vector, hash, choose_quote): Pass zero to unquotes_occur function.
|
|
|
|
|
|
|
|
|
| |
in the dotted position: (qquote x1 .. xn . (unquote form)),
which looks like the structure (qquote x1 .. xn unquote form).
Fixed by a hack: after recursively expanding the (unquote form)
part (rest of the form), we check whether the unexpanded
version has unquote at the front. If so, we know the expansion is just
form, and use it to emit the suitable expansion.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (top_smb, defsymacro_s, symacrolet_s): New global variables.
(lookup_symac, get_opt_param_syms, get_param_syms, op_defsymacro,
expand_symacrolet, make_var_shadowing_env): New static functions.
(expand_tree_cases, expand_catch_clause): Install shadowing environment
so lexical bindings hide any symbol macrolets.
(expand_place): Fix neglect to expand an atomic form, which breaks
symbol macros used as places.
(expand): Expand symbol macros, expand symacrolet binding forms.
Make sure symbol macros are shadowed in the lexical binding
constructs. Take advantage of return value of rlcp_tree in a
few places.
(macro_form_p): Support for symbol macros; bugfix: not handling
default argument.
(macroexpand_1): Streamlined, and support added for symbol macros.
(eval_init): Protect top_smb from gc. Create new hash, stored in
top_smb. Initialize defsymacro_s and symacrolet_s.
Register op_defsymacro.
* parser.y (rlcp_tree): Return the to form instead of useless t and nil.
* txr.1: Documented.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
a much more useful return value: the binding cell itself,
rather than the symbol.
(bind_args): Bugfix: env_vbind was still being called in one case,
leading to a neglect to bind a special variable properly.
(bindings_helper): Changed interface. Bugfix: in sequential binding,
actually bind the successive environments so closures will behave
100% correctly. Returns a list of the actual bindings, in which
special variables are not distinguished in any way.
(op_let, op_for): Conform to new bindings_helper interface. Use the
lexical environment that it returns instead of making a new one.
(op_each): Use the environment and list of bindings out of
bindings_helper. The bindings are used for stepping the lists,
and that includes stepping any special vars. The lexical environment
is used for evaluating the body. Thus, we need no special processing
for special vars here any more.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
rather than just assign to them. Got rid of the superfluous variable
saving array. Fixed the problem in recognizing the special_s symbol (it
is bindable).
(op_with_saved_vars): This simplifies, since it no longer needs
to save individual variables in an array, only to set up and
tear down a new dynamic environment frame.
(expand_vars): No longer returns two values with a cons.
Takes a form argument for error reporting and a pointer to a boolean
just to report whether there are special vars without listing them.
(expand_save_specials): The with-saved-specials form doesn't need
a var list any more, so the expander is updated not to stick them in.
(expand): Update calls to expand_vars to new interface.
|
|
|
|
| |
stream is not a string stream, but throw a proper error exception.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
parameter lists.
There is a bugfix here too (see eval_init below).
* eval.c (special_s): New global variable. This symbol is used
as a marker in parameter lists denoting expander-generating
syntax that gives information about specials.
(lookup_var, looup_var_l): Bugfix: walk the dynamic chain properly.
Fallback from the lexical chain to the dynamic.
(env_vbind_special): New static function.
(bind_args, bind_macro_params): Detect special list in params. Use
env_vbind_special to bind variables either in the dynamic environment
or the lexical one.
(expand_opt_params, expand_params): Renamed to expand_opt_params_rec
and expand_params_rec, respectively. Now take extra argument for
accumulating list of special variables found in the param list.
(expand_params): New static function.
(set_dyn_env): New static function.
(interp_fun, expand_macro): Set up and tear down new dynamic
environment around parameter list evaluation and body evaluation. This
will take any new dynamic bindings.
(bindings_helper, op_each): The special_s symbol is now used instead of
colon_k for marking specials.
(op_defun): Recognize the specials added to the parameter list
so as not to t report that as not a bindable symbol.
(op_catch): Set up an tear down new dynamic environment around
the evaluation of the catch clause param binding and body.
(expand_vars): use colon_s symbol instead of colon_k for marking
special var.
(eval_init): Bugfix: gc-protect recently added dyn_env variable.
Intern special symbol into special_s variable.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Saving and restoring of individual variables is very silly
and it's making it difficult to implement function parameters
that are rebindings of special variables.
Let's have a global pointer to a dynamic environment called dyn_env.
Let's make it part of the extended_jmp_buf structure, so that it's
implicitly saved and restored across exception handling.
Special variable lookups go through the dyn_env chain, and fall back on
the global bindings.
To override some specials, we just push a new dynamic environment and
stick them there. (As a bonus, the bindings can even be repeated in the
lexical environment (i.e. the same objects), so they can be found
faster. We have to make sure we remove that environment when we
leave the scope in the normal way. If we unwind out, it is done
automatically by extended_longjmp mechanism.
* eval.c (dyn_env): New global variable.
(lookup_var, lookup_var_l): If env is nil, look in the dyn_env
first, and only if that fails, look in the global bindings top_vb.
* signal.h (extended_jmp_buf): New member, de, for saving/restoring
dyn_env. This structure is now used whether or not we have signals.
(extended_setjmp, extended_longjmp): Updated to save and restore
dyn_env, and to do it regardless of whether there is POSIX signal
support.
(dyn_env): Declared here.
|
|
|
|
|
|
|
|
|
|
|
| |
function lookup fails, and if that fails, retrieve the special
operator binding.
(fboundp): Report t if there is a global macro binding.
* txr.1: Use "global" rather than "toplevel". Added note that
the fun operator doesn't see macro bindings. Documented that
symbol-function and fboundp see global macro bindings,
and that symbol-function can retrieve a special operator binding.
|
|
|
|
|
|
| |
(eval_init): Registered as intrinsics.
* txr.1: Documented.
|
|
|
|
|
| |
and splice symbols to be in the regular user package,
rather than the system package.
|
|
|
|
|
|
|
|
|
| |
* eval.h: Declare existing lambda_s extern variable.
* lib.c (obj_print, obj_pprint): print (lambda sym ...)
as (lambda (. sym) ...) and (lambda sym) as (lambda (. sym)).
* txr.1: document it.
|
|
|
|
|
|
|
|
|
| |
* eval.c (macrolet_s): New variable.
(lookup_mac, expand_macrolet): New static functions.
(expand): Recognize and expand macrolet form.
use lookup_mac to resolve macros rather than gethash,
since we have lexical macros now.
(eval_init): Intern macrolet symbol.
|
|
|
|
| |
Rename mac_env variable to menv for consistency.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
environment down through the expander call hierarchy.
* eval.c (expand_opt_params, expand_params, expand_tree_cases,
expand_tree_case, expand_forms, val expand_cond_pairs, val
expand_place, expand_qquote, expand_vars, expand_quasi, expand_op,
expand_catch_clause, expand_catch, expand): All expanders get new
parameter, menv. expand_forms and expand handle a nil value of menv.
(eval_intrinsic): Pass nil macro environment to expand.
(eval_init): Update intrinsic registration for expand.
* eval.h (expand, expand_forms): Declarations updated.
* parser.y (expand_meta): Gets macro env parameter.
(elem, o_elem, exprs, expr): Pass nil to expand_forms and expand_meta.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
with just using the == operator.
Removing cobj_equal_op since it's indistinguishable from eq.
Streamlining missingp and null_or_missing_p.
* eval.c (transform_op): eq to ==.
(c_var_ops): cobj_equal_op to eq.
* filter.c (trie_compress, trie_lookup_feed_char, filter_string_tree,
html_hex_continue, html_dec_continue): eq to ==.
* hash.c (hash_iter_ops): cobj_equal to eq.
* lib.c (countq, getplist, getplist_f, search_str_tree,
posq): eq to ==.
(cobj_equal_op): Function removed.
* lib.h (cobj_equal_op): Declaration removed.
(missingp): Becomes a simple macro that yields a C boolean instead
of t/nil val, because it's only used that way.
(null_or_missing_p): Becomes inline function returning int.
* match.c (v_output): eq to ==.
* rand.c (random_state_ops): cobj_equal_op to eq.
* regex.c (char_set_obj_ops, regex_obj_ops): cobj_equal_op to eq.
(reg_derivative): Silly if3 expression replaced by null.
(regexp): Redundant if2 expression wrapped around eq removed.
* stream.c (null_ops, stdio_ops, tail_ops, pipe_ops, string_in_ops,
byte_in_ops, string_out_ops, strlist_out_ops, dir_ops,
cat_stream_ops): cobj_equal_op to eq.
* syslog.c (syslog_strm_ops): cobj_equal_op to eq.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
used global variable null which holds a symbol becomes null_s.
A new macro called nilp is added that more efficiently checks whether
an object is nil, producing a C boolean value rather than t or nil.
Most of the uses of nullp in the codebase just become the more
streamlined nilp.
* debug.c (show_bindings): nullp to nilp
* eval.c (lookup_var, lookup_var_l, lookup_fun, lookup_sym_lisp1,
do_eval, expand_qquote, expand_quasi, expand_op): nullp to nilp.
(op_modplace): nullp to null.
(eval_init): Update registration of null and not from C function
nullp to null.
* filter.c (trie_compress, html_hex_continue): nullp to nil.
(filter_string_tree): null to null_s.
* hash.c (hash_next): nullp to nilp.
* lib.c (null): Variable renamed to null_s.
(code2type): null to null_s.
(lazy_flatten_scan, chainv, lazy_str, lazy_str_force_upto,
obj_print, obj_pprint):
nullp to nilp.
(obj_init): null to null_s; nullp to null.
* lib.h (null): declaration changed to null_s.
(nullp): Inline function renamed to null.
(nilp): New macro.
* match.c (do_match_line): nullp to nilp.
* rand.c (make_random_state): Likewise.
* regex.c (compile_regex): Likewise.
|
|
|
|
|
|
|
|
|
| |
for a Lisp expression in a quasistring, and doing so leads to a
potentially incorrect double expansion because the whole thing
will be expanded again, either by the TXR Lisp quasi operator's
expander (if this is a quasiliteral in Lisp) or in the TXR
pattern language, by expand_meta, which hunts down down @ expressions
and expands them.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
All predefined globals become special.
* eval.c (special, with_saved_vars_s): New global variables.
(mark_special, special_p): New functions.
(bindings_helper): Takes new argument, include_specials.
Now processes the special colon syntax for denoting special variables,
setting up their values, taking care to observe whether the
binding is parallel or sequential.
(op_let, op_for): Pass new argument to bindings_helper.
(op_each): Pass new argument to bindings_helper with a value of it,
and deal with the colon annotations that emerge in the bindings.
(op_defvar, regvar): Mark symbol as special.
(op_with_saved_vars): New static function.
(expand_vars): Takes new argument, returns a cons. Detects special
variables among the vars and produces the colon syntax.
(expand_catch_clause): Bugfix: this was using expand_vars on
a parameter list. Now properly uses expand_params.
(expand_save_specials): New static function.
(expand): For the operators that are binding constructs, handle
the new form of expand_vars which returns information about
special variables. If specials occur, then generate the
with-saved-vars form around the expansion which will save and restore
their values. The expansion of vars done by expand_vars, together
with the run-time actions of bindings_helper, do the rest.
Speaking of which, the new with-saved-vars operator form is now
expanded here too.
(eval_init): Protect new variables special and with_saved_vars_s.
Initialize special with new hash table. Store new interned
symbol in with_saved_vars_s. Register op_with_save_vars in op_table.
* txr.1: Documented specials.
|
|
|
|
|
|
| |
to eval_error call. This is a leftover from when this was cloned
from its counterpart in match.c. However, I can't think of a way
this call can ever be reached.
|
|
|
|
|
|
|
| |
functions.
(eval_init): Registered new functions.
* txr.1: Documented.
|
|
|
|
|
|
|
|
| |
the recursion early if we see a quote. This would be true if
the only quotes were those generated by the parser based on
calls to choose_quote. However, it breaks for something
like an explicitly coded '(sys:quote ,form), which becomes
(sys:quote (sys:quote ,form)), leaving a dangling unquote.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
roots that were incorrect in the last digit/bit, because it was not
generating the guess mask all the way down to bit zero. Also, added
an early test to bail the loop when an the guess at the root happens
to be right.
* mpi-patches/add-bitops: Refreshed.
* mpi-patches/fix-ctype-warnings: Likewise.
* mpi-patches/mpi-to-double: Likewise.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
opening of files, prior to directives that actually need data.
The documentation basically lied that this is the case: namely,
the text "A file isn't opened until the query demands material from
that file, and then the contents are read on demand, not all at
once." This is now a fact.
* match.c (non_matching_directive_table): New global variable.
(open_data_source): New static function. Contains an almost
verbatim migration of the source-opening logic that used
to be in match_files. The useless assignment to c->nil is gone,
and c->data == t is explicitly tested for. Instead of assuming
that only the @(next) directive does not need to have a data source
open, the table of non-matching directives is consulted. Opening
the data source is now skipped for numerous directives.
(match_files): Call open_data_source within the loop. This
means that even after processing numerous non-matching directives,
we will still correctly set up the data lazy list.
(dir_tables_init): Initialize non_matching_directive_table,
protect from GC and populate with numerous directives.
* txr.1: Improved documentation for @(next :args), and removed
a description of the hack that a single @(next) at the top of the
query suppressed the opening of the data source.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
(eval_init): Register env and env_hash functions. Register prog_args
and prog_args_full as *args* and *full-args*.
* lib.c (timegm_hack): Invalidate env_list, after mucking with
the environment via setenv and unsetenv.
* txr.c (prog_args_full, prog_args): New global variables.
(txr_main): Command-line processing converted to use TXR's
library. Populates prog_args_full and prog_args.
* txr.h (prog_args_full, prog_args): Declared.
* txr.1: Documented *args*, *full-args*, env and env-hash.
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (eval_init): Change registration for open_file, open_tail
and open_command.
* stream.c (open_file, open_tail, open_command): mode_str argument
defaulted.
* txr.1: Updated.
|
|
|
|
|
|
|
|
| |
seek_to_end_p argument being ignored, with the
behavior being no initial seek to the end.
* txr.1: Clarified the behavior of the seek-to-end-p
option.
|
|
|
|
|
| |
of list_collect. This is not necessary for correctness, but it spares
list_collect from having to search for the tail on each call.
|
|
|
|
|
|
|
|
|
|
| |
* txr.c (version): Bumped.
* txr.1: Bumped version and set date.
* configure (txr_ver): Bumped.
* RELNOTES, txr.vim, dep.mk: Updated.
|
|
|
|
| |
Fix sybol misspelling.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
intrinsic, rather than gensymv.
Register gensym_counter as *gensym-counter*.
* lib.c (gensym): Handle missing prefix argument by defaulting
the prefix to "g".
(gensymv): Function removed.
* lib.h (gensymv): Declaration removed.
* txr.1: Fixed omission: missing documentation for gensym.
Documented *gensym-counter*.
|
|
|
|
|
| |
form via expand_forms. This is completely wrong since only the
macro knows what material is evaluated and what isn't.
|
|
|
|
|
|
|
|
| |
nil parameter list; this is correctly handled by bind_macro_params.
Added support for the colon symbol as an indication that
the case is declined.
* txr.1: Updated.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (tree_case_s, tree_bind_s): New symbol variables.
(bind_macro_params): Bugfix: inappropriate exception thrown when atom
matched against parameter list. Bugfix: nil being returned when
atom matches empty parameter list. Added support for a new convention:
if loose_p is the colon keyword, then exceptions are not thrown
for destructuring mismatches; nil is returned instad.
(op_tree_case, expand_tree_cases, expand_tree_case, op_tree_bind):
New static functions.
(expand): Handle tree_case_s and tree_bind_s.
(eval_init): Intern tree-case and tree-bind symbols.
Register the corresponding operator functions op_tree_case and
op_tree_bind under these symbols in op_table.
* txr.1: Documented tree-case and tree-bind operators.
|
|
|
|
| |
superfluous material.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
alleviate a long-standing pain: when an exception happens in
TXR's library somewhere, the program dies without leaving
a clue about what code was being evaluated when that happened.
What we can do is have the evaluator publish the most recent
compound form it has processed by stashing it in a variable.
Then when an unhandled exception occurs, we can peek at that
and try to pull out source location info.
* eval.c (last_form_evaled): New variable.
(do_eval): When evaluating a compound form, stash it in
last_form_evaled.
(eval_init): Protect last_form_evaled from gc.
* eval.h (last_form_evaled): Declared.
(eval_error_s): Existing variable declared.
* unwind.c: Has to include "eval.h" for the above variable
and "parser.h" for the source_loc function.
(uw_throw): When an exception is unhandled, if
last_form_evaled has source info, add it to the diagnostic.
But not if the exception is eval-error; because errors from
the evaluators already have the info.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
back-fills some missing source code location info. We apply this to
macro expansions. If some error occurs in expanded code, this way it
is referenced to the line where the macro *call* occurs.
Not only is this better than nothing, it may be better than tracing
it to the macro definition. Ideally, we would have both places:
("the error is in the code expanded from this macro, at this site").
* eval.c (expand): Use rlcp_tree to back-fill source info in
macro expansion by taking it from the unexpanded form.
* parser.h (rlcp_tree): Declared.
* parser.y (rlcp_tree): New function.
|
|
|
|
|
|
| |
* eval.c (expand_quasi): Add some rlcp's here.
* parser.y (o_var, quasi_items, o_elems_transform): Likewise.
|
|
|
|
| |
a backwards goto.
|
|
|
|
|
|
|
|
|
| |
capture the entire form, not just the arguments.
(expand): Apply rlcp to the result of macro expansion, if it has
not set up source code location.
(eval_init): Register rlcp as intrinsic.
* txr.1: Start of macro documentation. Documented rlcp.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (top_mb, defmacro_s, macro_time_s, whole_k, env_k): New global
variables.
(expand_params): Recurse to handle macro parameter lists too.
(bind_macro_params, op_defmacro, expand_macro): New static functions.
(expand): Evaluate defmacro forms and macro-time forms at expansion
time. Recognize and expand macros (albeit not yet with proper lexical
scoping: local bindings are not able to shadow a macro).
(eval_init): Protect top_mb from GC and initialize it.
Intern new symbols defmacro, macro-time, and :whole.
Register defmacro operator in op_table.
* match.h (env_k): Added declaration for existing external variable.
|
|
|
|
|
|
|
|
|
|
|
| |
They need to be since they can contain evaluable initforms for default
arguments. Ditto with lambda; lambda parameters were being treated
using expand_vars, which is not appropriate.
* eval.c (expand_opt_params, expand_params): New static functions.
(expand_vars): Bugfix: added some missing rlcp's to propagate
line number info.
(expand): Move lambda to separate case, and expand its params
|
|
|
|
| |
in error messages.
|
|
|
|
| |
message.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
in text.
* utf8.h (UTF8_ADMIT_NUL): New preprocessor symbol.
(utf8_decoder): New member, flags.
* utf8.c (utf8_decoder_init): Initialize flags to 0.
(utf8_decode): If a null byte is encountered in the input,
then convert it to 0xDC00, rather than keeping it as zero,
unless flags contains UTF8_ADMIT_NUL.
* txr.1: Document handling of null bytes.
|
| |
|