summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* tree: let tree-iter be iterable via generic iteration.Kaz Kylheku2021-05-123-0/+36
| | | | | | | | | | * lib.c (seq_iter_init_with_info): Recognize tree_iter object, and treat using tree iterator function. * tests/010/tree.tl: test case for tree subrange iteration with collect-each. * txr.1: Updated.
* doc: nonexistent tree-value-atKaz Kylheku2021-05-112-3/+3
| | | | * txr.1: Fix typos: tree-value-at should be trie-value-at.
* tree: streamline iteration; provide high limit.Kaz Kylheku2021-05-117-1704/+1692
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Getting rid of tree-begin-at and tree-reset-at. Now tree-begin takes two optional parameters, for specifying high and low range. * tree.c (struct tree_diter): New members, tree and highkey. We need tree due to requiring access to the less function. If the iterator has no highkey, the iterator itself is stored in that member to indicate this. (tree_iter_mark): Mark the tree and highkey. (tree_begin): Take optional lowkey and highkey arguments, initializing iterator acordingly. (tree_begin_at): Function removed. (copy_tree_iter, replace_tree_iter): Copy tree and highkey members. The latter require special handling due to the funny convention for indicating highkey absence. (tree_reset): Take optional lowkey and highkey arguments, configuring these in the iterator being reset. (tree_reset_at): Function removed. (tree_next, tree_peek): Implement highkey semantics. (sub_tree): Simplified: from and to arguments are just passed through to tree_begin, and there is no need for a separate loop which enforces the upper limit, that now being handled by the iterator itself. (tree_begin): Update registrations of tree-begin and tree-reset; remove tree-begin-at and tree-reset-at intrinsics. * tree.h (tree_begin_at, tree_reset_at): Declarations removed. (tree_begin, tree_reset): Declarations updated. * lib.c (seq_iter_rewind, seq_iter_init_with_info, where, populate_obj_hash): Default new optional arguments in tree_begin and tree_reset calls. * parser.c (circ_backpatch): Likewise. * tests/010/tree.tl: Affected cases updated. * txr.1: Documentation updated. * share/txr/stdlib/doc-syms.tl: Regenerated.
* tree: support indexing and range extraction.Kaz Kylheku2021-05-116-1564/+1702
| | | | | | | | | | | | | | | | | | | * lib.c (do_generic_funcall): Support tree object invocation with one or two arguments via sub and ref. (sub): Implement for trees via sub_tree. (ref): Implement for trees via tree_lookup. * tree.c (sub_tree): New function. (tree_init): Register sub-tree intrinsic. * tree.h (sub_tree): Declared. * tests/010/tree.tl: New tests. * txr.1: Documented: DWIM bracket syntax on trees, sub and ref support for trees, sub-tree function, * share/txr/stdlib/doc-syms.tl: Regenerated.
* tree: replace-tree-iter function.Kaz Kylheku2021-05-115-1/+66
| | | | | | | | | | | | | * tree.c (replace_tree_iter): New function. (tree_init): Register replace-tree-iter intrinsic. * tree.h (tree_init): Declared. * share/txr/stdlib/doc-syms.tl: Updated. * txr.1: Documented. * tests/010/tree.tl: New test case.
* tree: copy-tree-iter function.Kaz Kylheku2021-05-106-2/+62
| | | | | | | | | | | | | | | * lib.c (copy): Handle tree_iter_s via copy_tree_iter. * tree.c (copy_tree_iter): New function. (tree_init): copy-tree-iter intrinsic registered. * tree.h (copy_tree_iter): Declared. * tests/010/tree.tl: New test case. * txr.1: Documented. * share/txr/stdlib/doc-syms.tl: Updated.
* diff/isec: reset hash/tree iter instead making new.Kaz Kylheku2021-05-103-2/+13
| | | | | | | | | | | * lib.c (seq_iter_rewind): Use hash_reset and tree_reset to rewind the existing iterator rather than allocating a new one. * tests/010/hash.tl: New file, covering uni, diff and isec for hash tables. * tests/010/tree.tl: New tests.
* doc: fix out of order compat notes.Kaz Kylheku2021-05-101-23/+23
| | | | | * txr.1: Move compatibility notes 258, 257 and 231 to the correct position, so the numbers are descending.
* lib: remove spurious null statement.Kaz Kylheku2021-05-101-1/+1
| | | | | * lib.c (seq_getpos): Remove spurious semicolon which adds an unreachable null statement.
* math: poly/rpoly diagnostic mixup.Kaz Kylheku2021-05-101-2/+2
| | | | | * arith.c (poly, rpoly): fix: the poly function wrongly refers to itself as rpoly and vice versa in diagnostics.
* lib: basic support for trees as sequences.Kaz Kylheku2021-05-094-38/+146
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As of this commit, binary search trees can be iterated: mapped over with mapcar and such. * arith.c (poly, rpoly): rpoly won't work with trees. They work just with vectors and lists so let's make the error message more accurate. I noticed the self names of these two are swapped; will fix in another commit. * eval.c (tprint): Refactor to use iterator framework for objects other than lists. The tree case falls into this, so trees are supported. * lib.h (enum seq_kind): New enum constant SEQ_TREELIKE. (seq_iter_init_with_info): Declared. * lib.c (seq_info): Map tree object to SEQ_TREELIKE type. (seq_iter_get_tree, seq_iter_peek_tree): New static functions. (seq_iter_rewind): Support rewinding tree iteration. I think we could reuse the existing iterator here, and in the hash case as well. I made a note to look into this. (seq_iter_init_with_info): Internal linkage changed to external, because tprint in eval.c uses this. Handle SEQ_TREELIKE case here, by setting up iterator with the two new static functions. (seq_iter_mark): Handle SEQ_TREELIKE_CASE. Change switch statement to exhaustively list cases. (ldiff): Add SEQ_TREELIKE to various cases. Idea is that we handle it like SEQ_HASH. (nsort, sort, nshuffle, take, take_while, take_until, drop_while, drop_until, update): Add case for SEQ_TREELIKE, routing to error message. (lazy_where_tree_func): New static function. (where, sel, reject): Support trees.
* tree: expose insert, lookup and delete functions.Kaz Kylheku2021-05-092-5/+10
| | | | | | | | | | * tree.c (tree_insert, tree_lookup_node, tree_delete_node, tree_delete): Switch internal linkage to external linkage. * tree.h (tree_insert, tree_lookup_node, tree_delete_node, tree_delete): Declared.
* tree: new tree-peek function.Kaz Kylheku2021-05-095-13/+95
| | | | | | | | | | | | | | * tree.c (tn_peek_next): New static function. (tree_peek): New function. (tree_init): Register tree-peek intrinsic. * tree.h (tree_peek): Declared. * txr.1: Documented. * tests/010/tree.c: Work tree-peek into existing test case. * share/txr/stdlib/doc-syms.tl: Updated.
* tree: new make_similar_tree unction.Kaz Kylheku2021-05-094-0/+39
| | | | | | | | | | | * tree.c (make_similar_tree): New function. (tree_init): Register make-similar-tree intrinsic * tree.h (make_similar_tree): Declared. * tests/010/tree.tl: New tests. * txr.1: Documented.
* parser: #; tests and bugfixes.Kaz Kylheku2021-05-063-1638/+1706
| | | | | | | | | | | | | | | | This is motivated by the recent crash regression in the #; comment out mechanism. The parser doesn't have adequate coverage in the test suite. * tests/012/syntax.tl: New file, for testing syntax. A problem was found #;.expr did not work inside a list, only at top level. It required a space before the dot. * parser.y (listacc): A couple of productions to handle hash-semicolon immediately followed by a dot without any whitespace, and then by an expression. * y.tab.c.shipped: Regenerated.
* configure: reconfigure: add "$@" to configure line.Kaz Kylheku2021-05-051-2/+2
| | | | | | * configure: Allow the conveninence of additional parameters to be passed through reconfigure, to tweak the previous configuration.
* configure: bug: in-place reconfigure clobber.Kaz Kylheku2021-05-051-0/+1
| | | | | | * configure: before generating reconfigure, remove it. Otherwise, if are executing the reconfigure script, errors can appear in it if its length is extended.
* matcher: new "each-match family" of macros.Kaz Kylheku2021-05-045-6/+331
| | | | | | | | | | | | | | | | | | * lisplib.c (match_set_entries): New autoload symbols: each-match, append-matches, keep-matches, each-match-product, append-match-products, keep-match-products. * share/txr/stdlib/doc-syms.tl: Updated. * share/txr/stdlib/match.tl (each-match-expander): New function. (each-match, append-matches, keep-matches, each-match-product, append-match-products, keep-match-products): New macros. * tests/011/patmatch.tl: New tests covering each macro, far from exhaustively. * txr.1: Documented.
* parser: fix regression in #; syntax.Kaz Kylheku2021-05-043-3/+9
| | | | | | | | | | | | A crash has showed up when processing commented-out objects. This is due to the most recent gc fix to the parser. * parser.y (set_syntax_tree): Avoid the set macro when tree has the special value nao (not an object). * y.tab.c.shipped: Regenerated. * y.tab.h.shipped: Likewise.
* format: use self variable in error messages.Kaz Kylheku2021-05-041-6/+6
| | | | | * stream.c (formatv): Replace hard-coded "format:" with ~a and self argument. Several error messages are revised.
* format: ~x/~X specifiers support buffers.Kaz Kylheku2021-05-045-18/+84
| | | | | | | | | | | | | * buf.c (buf_hex): New function. * buf.h (buf_hex): Declared. * stream.c (formatv): Support printing of buffers in hex via temporary buffer containing hex characters, similarly to how bignums are handled. * tests/018/format.tl: New file, providing some coverage over new and affected code.
* sha256/md5: leak: don't use borrowed buffer for hash.Kaz Kylheku2021-05-043-2/+3
| | | | | | | | | | | | | | | It's incorrect to use a borrowed buf, because a borrowed buf assumes that the memory isn't dynamically allocated, and will not free it when it is finalized by the garbage collector. The buffer which holds the hash returned by sha256 and md5 does in fact own the memory. * buf.c (make_owned_buf): Static function becomes external. * buf.h (make_owned_buf): Declared. * chksum.c (chksum_ensure_buf): Use make_owned_buf rather than make_borrowed_buf.
* buf: bugfix: int-buf, uint-buf refer to alloc size.Kaz Kylheku2021-05-042-2/+6
| | | | | | | | | | * buf.c (int_buf, uint_buf): Refer to the buffer length b->len rather than the underlying allocation size b->size. Referring to b->size will not only produce the wrong value when it is larger than len, but b->size can be null for a borrowed buffer, producing a crash. * tests/012/buf.tl: Tests.
* compiler: bug: not warning bad uses of some local funs.Kaz Kylheku2021-05-031-2/+3
| | | | | | | | | | | | | | | | | | When a lexical function defined with flet or labels is called with the wrong arguments, this is not being diagnosed if that function is being lifted to load-time. This is because the sys:load-time-lit that the lambda is wrapped with is not propagating the pars attribute of the frag structure from the lambda to its own returned frag. * share/txr/stdlib/compiler.tl (compiler comp-load-time-lit): After compiling the expression to obtain the exp frag, stuff exp.pars to both the lt-frag that is generated, as well as to the returned dummy frag carrying the dreg access that retrieves the function. It's important for this returned frag to carry the info, because from there it is propagated to the function binding by comp-fbind by the (set bind.pars frag.pars) expression.
* rel-path: bugfixes.Kaz Kylheku2021-05-033-21/+136
| | | | | | | | | | | | | | | * share/txr/stdlib/copy-file.tl: When removing .. components, a dotdot must only cancel preceding non-dotdot. We must check not only that the out stack is not empty but that the top element isn't dotdot. Also, eliminate empty components, like the documentation says. Lastly, we must check for the impossible cases, when the from path uses .. components that are impossible to navigate backwards to form a relative path. * tests/018/rel-path.tl: Test cases added. * txr.1: Updated with additional descriptions, fixes and examples.
* New function: rel-path.Kaz Kylheku2021-05-035-1/+150
| | | | | | | | | | | | | * lisplib.c (copy_file_set_entries): Add rel-path as autoload trigger for copy-file module. * share/txr/stdlib/copy-file.tl (rel-path): New function. * tests/018/rel-path.tl: New file. * txr.1: Documented. * share/txr/stdlib/doc-syms.tl: Updated.
* New function: portable-abs-path-p.Kaz Kylheku2021-05-024-8/+61
| | | | | | | | | | | | | | | * share/txr/stdlib/doc-syms.tl: Updated. * stream.c (portable_abs_path_p): New function, exact copy of old abs_path_p. (abs_path_p): Rewritten to be specific to host platform. No Windows-drive-like prefixes are checked on POSIX. (stream_init): Register new function. Register abs-path-p conditionally based on 258 compatibility. * stream.h (portable_abs_path_p): Declared. * txr.1: Documented, with compat notes.
* bug: join-with segfault on character separators.Kaz Kylheku2021-05-022-1/+25
| | | | | | | * lib.c (join_with): Pass the correct onech array down to cat_str_init, rather than a null pointer. * tests/015/split.tl: New tests covering join and join-with.
* doc: "suficient" typo in new paragraph.Kaz Kylheku2021-05-021-1/+1
| | | | | * txr.1: Fix typo in recently introduced paragraph about file compiler's treatment of symbols.
* Version 258txr-258Kaz Kylheku2021-05-016-146/+176
| | | | | | | | | | * RELNOTES: Updated. * configure, txr.1: Bumped version and date. * share/txr/stdlib/ver.tl: Bumped. * txr.vim, tl.vim: Regenerated.
* parser: gc bug.Kaz Kylheku2021-05-012-507/+491
| | | | | | | | | * parser.y (set_syntax_tree): New static function. Uses GC-correct assignment via set macro. (spec): Call set_syntax_tree instead of raw assignments to parser->syntax_tree, which violate GC rules. * y.tab.c.shipped: Regenerated.
* configure: use -ansi, not -std=c90.Kaz Kylheku2021-05-011-1/+1
| | | | | * configure: In maintainer mode, we specify C90. Some versions of clang don't like -std=c90, but only the -ansi option.
* doc: note a diff between compiled and source files.Kaz Kylheku2021-04-301-0/+42
| | | | | | * txr.1: A new paragraph about how symbols are treated: source files can refer to unqualified symbols, but compiled files do not.
* tree: new functions for reseting iterator.Kaz Kylheku2021-04-305-1/+104
| | | | | | | | | | | | | | * tree.c (tree_reset, tree_reset_at): New functions. (tree_init): tree-reset and tree-reset-at intrinsics registered. * tree.h (tree_reset, tree_reset_at): Declared. * tests/010/tree.tl: New tests. * txr.1: Documented. * share/txr/stdlib/doc-syms.tl: Updated.
* tree: remove unused member from dynamic iter.Kaz Kylheku2021-04-301-3/+0
| | | | | | * tree.c (struct tree_diter): Remove the tr member; it is not used anywhere. (tree_begin, tree_begin_at): Remove initialization of tdi->tr.
* vim: more accurate treatment of brace vars.Kaz Kylheku2021-04-301-1/+2
| | | | | | | | | | The txr_bracevar region is not appropriate for quasiliterals, because it contains txr_regex. * genvim.txr (tl_bracevar): New syn region, based on copying txr_bracevar and changing it so it contains tl_regex and not txr_regex. (txr_quasilit): Contain tl_bracevar rather than txr_bracevar.
* vim: support for #T and #N syntax.Kaz Kylheku2021-04-301-4/+4
| | | | | | * genvim.txr (txr_error, txr_list, txr_ign_par, txr_ign_bkt): Add T and N to the pattern that recognises #H, #S and #R, so that tree and node literals are handled.
* tree: use rlist in test case.Kaz Kylheku2021-04-301-1/+1
| | | | | * tests/010/tree.tl: Use rlist to express discontinuous range instead of appending ranges.
* mapcar*: fix broken.Kaz Kylheku2021-04-292-1/+7
| | | | | | | | | | * eval.c (lazy_mapcar_func): We must capture the return value of iter_step, since we refer to it in the next statement, expecting it to have stepped. This bug causes a behavior as if the original list had an extra nil. * tests/012/lazy.tl: Tests. Poor test coverage is why this sort of thing comes up and bites us.
* tree: new tree-begin-at function.Kaz Kylheku2021-04-295-8/+112
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * tree.c (enum tree_iter_state): New iterator state tr_find_low_prepared dedicated to the tree-begin-at traversal. This state indicates that tree-next should visit the starting node that it is given, and then after that, treat anything to the left of it as having been visited. In the other states, tree-next does not visit the node it is given but uses it as the starting point to find the next node. (tn_find_next): Bugfix here: when navigating the right link, the function neglected to add the node to the path. But the logic for backtracking up the path expects this: it checks whether the node from the path is the parent of a right child. Somehow this didn't cause a problem for full traversals with tree-begin; at least the existing test cases don't expose an issue. It caused a problem for tree-begin-at, though. (tn_find_low): New static function. This finds the low-key node in the tree, priming the iterator object with the correct state and path content to continue the traversal from that node on . We need the tr_find_low_prepared state in the iterator in order to visit the low node itself that was found. (tree_begin_at): New function. (tree_init): Register tree-begin-at intrinsic. * tree.h (tree_begin_at): Declared. * tests/010/tree.tl: New test cases for tree-begin-at. * txr.1: Documented. * share/txr/stdlib/doc-syms.tl: Updated.
* tree: more tests.Kaz Kylheku2021-04-292-100/+141
| | | | | | * tests/010/tree.tl: New tests, broadening coverage. * share/txr/stdlib/doc-syms.tl: Regenerated.
* doc: wrong heading for tree-insertKaz Kylheku2021-04-291-1/+1
| | | | * txr.1: Fix tree-insert being under tree-insert-node heading.
* tree: incorrect lookup function.Kaz Kylheku2021-04-292-1/+32
| | | | | | | * tree.c (tn_lookup): The right case is incorrectly chasing the left pointer. * tests/010/tree.tl: New file.
* tree: debug massive gc problems.Kaz Kylheku2021-04-292-55/+62
| | | | | | | | | | | | | | | | | | | | | | | | | | | The tree module doesn't observe generational GC correctness; it assigns objects into other objects using ordinary assignment. * tests/010/tree.tl (tree_iter): New member, tree. This is initialized to null for iterators on the stack. dynamic iterator, we need this to be a back-pointer to the dynamic iterator. (tree_iter_init): Add parameter to initializer to set up the back-pointer. (set_left, set_right, set_key): Use set macro instead of ordinary assignment. (tn_find_next): Use set macro to add node to path. (tn_flatten, tn_build_tree): Use set macro. (tr_rebuild, tr_rebuild_scapegoat, tr_insert, tr_do_delete), tr_delete): Use set macro. Take a tree argument so we can use set macro on tr->root. (tree_insert): Use set macro. Pass 0 to tree_iter_init initializer macro. (tree_delete_node): Pass tree to tr_delete. (tree_equal_op, tree_print_op, tree_hash_op): Pass 0 to tree_iter_init initializer macro. (tree-begin): Rearrange construction for GC correctness: avoid storing pointers into not-yet-reachable structure.
* macros: lexical-var-p: don't report t for specials.Kaz Kylheku2021-04-282-12/+82
| | | | | | | | | | | | | | | | | | | | The lexical-var-p function wrongly reports true for locally rebound special variables, which are not lexical. * eval.c (special_var_p): Static function moved to avoid forward declaration. (lexical_var_p): Bail if sym satisfies special_var_p. (old_lexical_var_p): New function, copy of old lexical_var_p before this bugfix. (eval_init): Conditionally register lexical-var-p as either lexical_var_p or old_lexical_var_p depending on the compat value. * txr.1: Update documentation for lexical-var-p to clarify that it doesn't report true for specials. Also make note that it doesn't report true for global lexicals, and likewise that lexical-fun-p doesn't report global functions. Added compat note.
* doc: document seq-iter type and redocument iter-beginKaz Kylheku2021-04-281-10/+30
| | | | | | * txr.1: mention seq-iter in the type hierarchy diagram. The documentation for iter-begin is revised, and now mentions that the returned value is of this type in some cases.
* lib: document gc problem related to seq-begin.Kaz Kylheku2021-04-281-0/+20
| | | | | | | | | | | | | | | | | | | | | If seq-begin is used on an object that supports the iter-begin method, there is a gc problem. This does not seem worth fixing for the following reasons. 1. The seq-begin function is marked obsolescent. I removed its one and only internal use in the previous commit, so it won't be called unless application code uses it. 2. Objects supporting the iter-begin function are clearly developed as part of the new iteration protocol. It makes no sense to be newly developing such an object, along with new code which applies seq-begin to it. There is likely zero code in the wild which uses either of these mechanisms. * lib.c (seq_iter_get_oop, seq_iter_peek_oop, seq_iter_get_fast_oop, seq_iter_peek_fast_oop): Add comments documenting the issue.
* lib: remove internal use of seq_begin.Kaz Kylheku2021-04-281-12/+16
| | | | | | | | | | The where function is the only place where seq-begin is used internally. The seq-begin mechanism is marked obsolescent in the documentation; let's not use it internally. * lib.c (lazy_where_func, where): Convert to iter_begin. Also, use us_lcons_fun and us_func_set_env. This seems to be the only place where lcons_fun and func_set_env are used.
* seq-iter: gc issue.Kaz Kylheku2021-04-281-1/+1
| | | | | | | | * lib.c (seq_iter_mark): The default case checks the type of the wrong object. The seq_iter object is necessarily a cobjp, and necessarily not a obj_struct_p so the test is always false, and we do not call gc_mark(si->ui.iter). The check must be applied to the object being iterated.
* match-str: tests with negative pos.Kaz Kylheku2021-04-281-1/+29
| | | | * tests/015/match-str.tl: Tests added.