summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Version 80txr-80Kaz Kylheku2014-02-177-93/+163
| | | | | | | | | | * 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-172-5/+10
| | | | Fix sybol misspelling.
* * eval.c (eval_init): Register gensym function as the gensymKaz Kylheku2014-02-175-9/+47
| | | | | | | | | | | | | | 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-172-4/+7
| | | | | 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-163-11/+22
| | | | | | | | 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-163-11/+202
| | | | | | | | | | | | | | | | | * 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-162-0/+10
| | | | superfluous material.
* In the spirit of the previous hack, here is another hack toKaz Kylheku2014-02-164-1/+43
| | | | | | | | | | | | | | | | | | | | | | | | | 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-164-2/+32
| | | | | | | | | | | | | | | | 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-163-11/+26
| | | | | | * 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-162-3/+12
| | | | a backwards goto.
* * eval.c (bind_macro_params): Bugfix: the :whole parameter mustKaz Kylheku2014-02-153-3/+181
| | | | | | | | | 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-153-8/+225
| | | | | | | | | | | | | | | * 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-152-8/+68
| | | | | | | | | | | 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-152-14/+19
| | | | in error messages.
* * eval.c (bindings_helper): Fixed misspelling of "symbol" in exceptionKaz Kylheku2014-02-152-1/+6
| | | | message.
* A trivial change in the UTF-8 decoder allows TXR to handle null bytesKaz Kylheku2014-02-154-1/+29
| | | | | | | | | | | | | | 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-142-2/+8
|
* * hash.c (inhash): Simplify with gethash_c.Kaz Kylheku2014-02-142-10/+9
|
* Replacing acons_new_l and aconsq_new_l interfaces with onesKaz Kylheku2014-02-146-24/+59
| | | | | | | | | | | | | | | | | | | | | | | | | | | 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-142-3/+6
|
* * eval.c (eval_init): Registered hash_update_1 as intrinsic.Kaz Kylheku2014-02-145-1/+57
| | | | | | | | * 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-142-3/+9
| | | | | 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-142-1/+8
| | | | | 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-145-88/+52
| | | | | | | | | | | | | | | | | | | | | 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-145-6/+95
| | | | | | | | | | | * 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-145-0/+73
| | | | | | | | | * 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-122-0/+23
| | | | | | | | 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-122-0/+19
| | | | | | | (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-123-14/+139
| | | | | | | (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-122-39/+24
| | | | | | | | 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-122-3/+8
| | | | mistake from two commits ago leading to a regression.
* * eval.c (eval_init): Register new functions posqual, posql,Kaz Kylheku2014-02-115-0/+149
| | | | | | | | | | 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-114-7/+22
| | | | | | | | | | 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.
* Version 79txr-79Kaz Kylheku2014-02-115-4/+36
|
* * eval.c (if_fun): Bugfix: forgotten handling of optionalKaz Kylheku2014-02-112-1/+6
| | | | alternative argument.
* * eval.c (subst_vars): Bugfix: results of expressions notKaz Kylheku2014-02-113-9/+34
| | | | | | | | | | | | treated in the same way as variables: lists not stringified, causing expansions with parentheses, and sometimes errors due to unhandled objects. Also, use tostringp instead of format for stringifying objects. stringifying object. Bugfix.k * match.c (subst_vars): Added comment similar to the one in the subst_vars of eval.c. Removed superfluous conversion code where the str variable is already known to be a string.
* * eval.c (apply): Fix regression in dwim operator: not handlingKaz Kylheku2014-02-112-1/+7
| | | | | nil object properly. Since dwim now trivially delegates to apply, apply must recognize nil.
* * combi.c (comb_hash_while_fun, comb_hash_gen_fun, comb_hash): NewKaz Kylheku2014-02-114-7/+61
| | | | | | | | | | | | | static functions. (comb): Support hash tables. * hash.c (print_key_val): When values are nil, print in a more condensed way by omitting the second element. This notation is accepted as input already by the parser. (hash_insert_pair): New function. * txr.1: Description of comb updated to indicate that it works over hashes.
* * arith.c: Remove inclusion of unneeded headers: <limits.h>Kaz Kylheku2014-02-112-3/+5
| | | | and <dirent.h>.
* * Makefile (OBJS): New object file, combi.o.Kaz Kylheku2014-02-118-614/+703
| | | | | | | | | | | | | | | | * dep.mk: Updated. * eval.c: Removed combination and permutation functions; they now reside in combi.c. (generate): Changed from static to external linkage. * eval.h (generate): Declared. * combi.c: New file. * combi.h: New file. * txr.vim: Regenerated.
* * eval.c (rcomb_gen_fun_common): Streamlined implementation.Kaz Kylheku2014-02-102-10/+14
| | | | Got rid of stack that is consed up on each call.
* Relaxed behavior: don't throw errors for impossible permutations,Kaz Kylheku2014-02-103-50/+78
| | | | | | | | | | | | | | | but return an empty list. * eval.c (perm_init_common): Do not throw error; return a nil state if permutation length exceeds sequence length. (perm_vec, perm_list, perm_str): Check for null return from perm_init_common and return empty list. (k_conses): Do not throw error; return empty list. (comb_list_gen_fun): Check for nil value out of k_conses. (comb): For vectors and strings, check length against k and return nil if necessary. For lists, comb_list_gen_fun handles it. * txr.1: Section order rearranged, and updated.
* * eval.c (rcomb_while_fun, rcomb_gen_fun_common,Kaz Kylheku2014-02-103-3/+159
| | | | | | | | rcomb_list_gen_fun, rcomb_list, rcomb_vec_gen_fun, rcomb_vec, rcomb_str_gen_fun, rcomb_str, rcomb): New static functions. (eval_init): Register rcomb as intrinsic. * txr.1: Documented rcomb.
* * eval.c (rperm, perm_str): Just in case, return a mutable emptyKaz Kylheku2014-02-103-2/+172
| | | | | | | | | | string, rather than null_string, which is a literal. (k_conses, comb_while_fun, comb_gen_fun_common, comb_list_gen_fun, comb_list, comb_vec_gen_fun, comb_vec, comb_str_gen_fun, comb_str, comb): New static functions. (eval_init): Registered comb as instrinsic. * txr.1: Documented comb.
* * eval.c (rperm_list, rperm_vec, rperm_str): n variable renamedKaz Kylheku2014-02-095-22/+271
| | | | | | | | | | | | | | | | | | to k, for consistency with rperm. (rperm): Likewise, and the behavior in the k == zero case is changed to return a single empty permutation. (perm_while_fun, perm_index, perm_gen_fun_common, perm_init_common, perm_vec_gen_fill, perm_vec_gen_fun, perm_vec, perm_list_gen_fill, perm_list_gen_fun, perm_list, perm_str_gen_fill, perm_str_gen_fun, perm_str, perm): New static functions. (eval_init): perm registered as intrinsic. * lib.c (vecref_l): Bugfix: allow negative indices, just like vecref. * lib.h (three, four): New macros. * txr.1: Updated documentation for rperm. Documented perm.
* * lib.c (vector, vec_set_length, cat_vec): When the vector sizeKaz Kylheku2014-02-082-4/+26
| | | | overflows the size_t type that is passed to malloc, throw an exception.
* * eval.c (nperm_while_fun, nperm_gen_fun, nperm_list,Kaz Kylheku2014-02-073-0/+141
| | | | | | | | nperm_vec_gen_fun, nperm_vec, nperm_str_gen_fun, nperm_str, nperm): New static functions. (eval_init): nperm registered as intrinsic. * txr.1: Documented nperm function.
* Version 78.txr-78Kaz Kylheku2014-02-066-72/+131
|
* * lib.c (int_str): Regression: handle base argument properly.Kaz Kylheku2014-02-062-1/+5
|