summaryrefslogtreecommitdiffstats
path: root/ChangeLog
Commit message (Collapse)AuthorAgeFilesLines
...
* Implemented macrolet.Kaz Kylheku2014-02-221-0/+11
| | | | | | | | | * 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.
* * eval.c (bind_macro_params, expand_macro, macroexpand_1, macroexpand):Kaz Kylheku2014-02-221-0/+5
| | | | Rename mac_env variable to menv for consistency.
* Preparation for lexical macros: we need to pass a macroKaz Kylheku2014-02-221-0/+18
| | | | | | | | | | | | | | | | | 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.
* Replacing uses of the eq function which are used only as C booleans,Kaz Kylheku2014-02-221-0/+40
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* The C function nullp is being renamed to null, and the rarelyKaz Kylheku2014-02-221-0/+41
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* * parser.y: Bugfix, I think. :) We do not need to call the expanderKaz Kylheku2014-02-221-0/+10
| | | | | | | | | 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.
* Implementing special variables with local overriding.Kaz Kylheku2014-02-211-0/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* * eval.c (subst_vars): Change throwing of query_error_sKaz Kylheku2014-02-211-0/+7
| | | | | | 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.
* * eval.c (macro_form_p, macroexpand_1, macroexpand): New staticKaz Kylheku2014-02-201-0/+8
| | | | | | | functions. (eval_init): Registered new functions. * txr.1: Documented.
* * parser.y (unquotes_occur): Bugfix: we should not terminateKaz Kylheku2014-02-201-0/+9
| | | | | | | | 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.
* * mpi-patches/faster-square-root (mp_sqrt): Bugfix: was computing squareKaz Kylheku2014-02-191-0/+14
| | | | | | | | | | | | | 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.
* Fixing a long-running issue in the TXR pattern language: prematureKaz Kylheku2014-02-191-0/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | 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.c (env_hash): new function.Kaz Kylheku2014-02-181-0/+17
| | | | | | | | | | | | | | | | (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.
* The mode argument in some stream-opening functions becomes optional.Kaz Kylheku2014-02-181-0/+12
| | | | | | | | | | * 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.
* * stream.c (open_tail): Fix 2013-12-02 regression:Kaz Kylheku2014-02-181-0/+9
| | | | | | | | 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.
* * combi.c (rperm_gen_full): Update ptail with return valueKaz Kylheku2014-02-181-0/+6
| | | | | of list_collect. This is not necessary for correctness, but it spares list_collect from having to search for the tail on each call.
* Version 80txr-80Kaz Kylheku2014-02-171-0/+12
| | | | | | | | | | * txr.c (version): Bumped. * txr.1: Bumped version and set date. * configure (txr_ver): Bumped. * RELNOTES, txr.vim, dep.mk: Updated.
* * eval.c (bind_args, op_defvar, op_defun, op_defmacro, op_modplace):Kaz Kylheku2014-02-171-0/+5
| | | | Fix sybol misspelling.
* * eval.c (eval_init): Register gensym function as the gensymKaz Kylheku2014-02-171-0/+15
| | | | | | | | | | | | | | 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*.
* * eval.c (expand): Bugfix: do not expand any part of the macroKaz Kylheku2014-02-171-0/+6
| | | | | form via expand_forms. This is completely wrong since only the macro knows what material is evaluated and what isn't.
* * eval.c (op_tree_case): Removed superfluous handling ofKaz Kylheku2014-02-161-0/+9
| | | | | | | | 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.
* New destructuring operators.Kaz Kylheku2014-02-161-0/+19
| | | | | | | | | | | | | | | | | * 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.
* * eval.c (bind_macro_params): Bugfix: enforce mismatch onKaz Kylheku2014-02-161-0/+5
| | | | superfluous material.
* In the spirit of the previous hack, here is another hack toKaz Kylheku2014-02-161-0/+26
| | | | | | | | | | | | | | | | | | | | | | | | | 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.
* Nice idea: how about a function which walks the tree structure andKaz Kylheku2014-02-161-0/+17
| | | | | | | | | | | | | | | | 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.
* Bugfixes: not propagating source loc info in quasiliterals.Kaz Kylheku2014-02-161-0/+8
| | | | | | * eval.c (expand_quasi): Add some rlcp's here. * parser.y (o_var, quasi_items, o_elems_transform): Likewise.
* * eval.c (expand): Replace blatant tail calls withKaz Kylheku2014-02-161-0/+5
| | | | a backwards goto.
* * eval.c (bind_macro_params): Bugfix: the :whole parameter mustKaz Kylheku2014-02-151-0/+10
| | | | | | | | | 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.
* First cut at implementation of macros.Kaz Kylheku2014-02-151-0/+17
| | | | | | | | | | | | | | | * 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.
* Bugfix: parameters of defun were not being treated by expander.Kaz Kylheku2014-02-151-0/+12
| | | | | | | | | | | 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
* * eval.c (bind_args, op_modplace): Use ~s consistentlyKaz Kylheku2014-02-151-0/+5
| | | | in error messages.
* * eval.c (bindings_helper): Fixed misspelling of "symbol" in exceptionKaz Kylheku2014-02-151-0/+5
| | | | message.
* A trivial change in the UTF-8 decoder allows TXR to handle null bytesKaz Kylheku2014-02-151-0/+15
| | | | | | | | | | | | | | 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.
* * hash.c (hash_update): Avoid double cdr.Kaz Kylheku2014-02-141-0/+4
|
* * hash.c (inhash): Simplify with gethash_c.Kaz Kylheku2014-02-141-0/+4
|
* Replacing acons_new_l and aconsq_new_l interfaces with onesKaz Kylheku2014-02-141-0/+28
| | | | | | | | | | | | | | | | | | | | | | | | | | | that return the new or old cons cell rather than a pointer to its cdr field. * eval.c (transform_op): use of acons_new_l replaced with acons_new_c. * hash.c (struct hash): acons_new_l_fun member replaced with acons_new_c_fun. (make_hash, make_similar_hash): initialize acons_new_l_fun member using either acons_new_c or aconsql_new_c. (gethash_l): function becomes an inline in hash.h. (gethash_c): new function, based on gethash_l. (inhash, gethash_n): updated w.r.t struct hash change. * hash.h (gethash_c): declared. (gethash_l): becomes an inline wrapper for gethash_c. * lib.c (acons_new_l, aconsql_new_l): functions removed. (acons_new_c, aconsql_new_c): new functions. (obj_init): use gethash_c and rplacd instead of gethash_l and set. * lib.h (acons_new_l, aconsql_new_l): declarations removed. (acons_new_c, aconsql_new_c): declared.
* * hash.c (inhash): Simplify code with gethash_f.Kaz Kylheku2014-02-141-0/+4
|
* * eval.c (eval_init): Registered hash_update_1 as intrinsic.Kaz Kylheku2014-02-141-0/+10
| | | | | | | | * hash.c (hash_update_1): New function. * hash.h (hash_update_1): Declared. * txr.1: Documented hash-update-1.
* * hash.c (inhash): Rename local variable from new to new_p.Kaz Kylheku2014-02-141-0/+6
| | | | | This is consistent with usage elsewhere in the module, and more importantly, keeps our code C++.
* * lib.c (class_check): Bugfix: the function was assuming thatKaz Kylheku2014-02-141-0/+6
| | | | | the argument is a pointer type object, leading to a crash if given a fixnum integer or string literal.
* Different approach: optional arguments on hash-isec and hash-uni allowKaz Kylheku2014-02-141-0/+22
| | | | | | | | | | | | | | | | | | | | | for more flexible joining of data from the hash tables. * eval.c (eval_init): Remove hash_guni and hash_gisec. Change registration for hash_uni and hash_isec to three arguments with one optional. * hash.c (hash_uni): Third parameter introduced, join_func. The default behavior changes: in the two argument case, clashing keys prefer the value from hash1 rather than hash2. For this reason, we now iterate over hash2 first, then hash1. (hash_guni): Removed. (hash_isec): Third parameter introduced, join_func. (hash_gisec): Removed. * hash.h (hash_uni, hash_isec): Declarations updated. (hash_guni, hash_gisec): Delarations removed. * txr.1: Documentation updated.
* * eval.c (eval_init): Register hash_guni and hash_gisec as intrinsics.Kaz Kylheku2014-02-141-0/+13
| | | | | | | | | | | * hash.c (hash_guni, hash_gisec): New functions. (hash_isec): Bugfix: since gethash was naively used, keys in hash2 associated with the value nil were erroneously omitted from the intersection. * hash.h (hash_guni, hash_gisec): Declared. * txr.1: Documented new functions.
* * eval.c (eval_init): Register inhash as intrinsic.Kaz Kylheku2014-02-141-0/+11
| | | | | | | | | * hash.c (inhash): New function. * hash.h (inhash): Declared. * txr.1: Documented inhash. Also, added surprisingly missing documentation for gethash!
* * parser.l: Disallow syntax like 1.0a, flagging it asKaz Kylheku2014-02-121-0/+9
| | | | | | | | an invalid floating-point token. The problem is that 1a is allowed, for compatibility with other Lisp dialects (it is a symbol) whereas 1.0a was scanning as 1.0 followed by a, which is inconsistent. Some Lisp dialects embedded dots in symbols, and allow 1.0a as a symbol token. We don't.
* * hash.c (struct hash): New member, equal_fun.Kaz Kylheku2014-02-121-0/+8
| | | | | | | (hash_equal_op): Short circuited logic: whenever we pull identical cells from either hash, we don't have to go through the pending lookaside list. (make_hash, make_similar_hash): Initialize new structure member.
* * hash.c (hash_equal_op, hash_hash_op): New static functions.Kaz Kylheku2014-02-121-0/+8
| | | | | | | (hash_ops): New functions registered in table of operations. * txr.1: Documentation for equal function updated to explain how two hashes are equal.
* Undoing bogus optimization, which can only work when objectsKaz Kylheku2014-02-121-0/+9
| | | | | | | | are treated as immutable. * hash.c (last_equal_key, last_equal_hash): Variables removed. (equal_hash, hash_process_weak): All references to removed variables scrubbed.
* * lib.c (some_satisfy, all_satisfy, none_satisfy): Fix codingKaz Kylheku2014-02-121-0/+5
| | | | mistake from two commits ago leading to a regression.
* * eval.c (eval_init): Register new functions posqual, posql,Kaz Kylheku2014-02-111-0/+11
| | | | | | | | | | posq, pos, and pos_if as intrinsics. * lib.c (posqual, posql, posq, pos, pos_if): New functions. * lib.h (posqual, posql, posq, pos, pos_if): Declared. * txr.1: Documented
* * eval.c (eval_init): Turn a require argument into an optionalKaz Kylheku2014-02-111-0/+11
| | | | | | | | | | one for the functions some, all and none. * lib.c (some_satisfy, all_satisfy, none_satisfy): Add defaulting behavior for pred parameter. * txr.1: Document that the predicate function is optional in calls to some, all and none.