summaryrefslogtreecommitdiffstats
path: root/txr.1
Commit message (Collapse)AuthorAgeFilesLines
* doc: FFI string types map null pointer to nil.Kaz Kylheku2022-04-261-3/+7
| | | | | | * txr.1: Document the existing behavior that the various FFI string types map between the null pointer and the nil object.
* doc: ffi: document the array-of-1 trick.Kaz Kylheku2022-04-261-0/+62
| | | | | * txr.1: Document the (ptr (array 1 <type>)) trick needed for out or in-out parameters.
* New: load can search multiple directories.Kaz Kylheku2022-04-251-5/+87
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * eval.c (load_search_dirs_s): New symbol variable. (load): Initialize the name variable whose address is passed as the third argument of open_txr_file, which is now an in-out parameter. Pass t for the new search_dirs parameter, so that load benefits from the searching. (eval_init): Initialize load_search_dirs_s and register the *load-search-dirs* special variable. * eval.h (load_search_dirs_s): Declared. (load_search_dirs): New macro. * match.c (v_load): Initialize the variable passed as third argument of open_txr_file. * parser.c (open_txr_file): Take a new argument, search_dirs. If this is t, it tells the function "if the path is not found, then recurse on the *load-search-dirs* variable. Otherwise, if the value is not t, it is a list of the remaining directories to try. The existing parameter orig_in_resolved_out must now point to a location which is initialized. It is assumed to hold the original target that was passed to the load function. The first_try_path is a the path to actually try, derived from that one. Thus, the caller of open_txr_file gets to determine the initial try path using its own algorithm. Then any recursive calls that go through *load-search-dirs* will pass a first argument which is made of the original name, combined with a search dir. (load_rcfile): Pass pointer to initialized location as third argument of open-txr_file, and pass a nil value for search_dirs: no search takes place when looking for that file, which is at a single, fixed location. * parser.h (open_txr_file): Declaration updated. * txr.c (sysroot_init): Initialize *load-search-dirs*. (txr_main): Ensure third argument in all calls to open_txr_file points to initialized variable, with the correct value, and pass t for the search_dirs argument. * txr.1: Documented. * stdlib/doc-syms.tl: Updated. New: load can search multiple directories. * eval.c (load_search_dirs_s): New symbol variable. (load): Initialize the name variable whose address is passed as the third argument of open_txr_file, which is now an in-out parameter. Pass t for the new search_dirs parameter, so that load benefits from the searching. (eval_init): Initialize load_search_dirs_s and register the *load-search-dirs* special variable. * eval.h (load_search_dirs_s): Declared. (load_search_dirs): New macro. * match.c (v_load): Initialize the variable passed as third * argument of open_txr_file. * parser.c (open_txr_file): Take a new argument, search_dirs. If this is t, it tells the function "if the path is not found, then recurse on the *load-search-dirs* variable. Otherwise, if the value is not t, it is a list of the remaining directories to try. The existing parameter orig_in_resolved_out must now point to a location which is initialized. It is assumed to hold the original target that was passed to the load function. The first_try_path is a the path to actually try, derived from that one. Thus, the caller of open_txr_file gets to determine the initial try path using its own algorithm. Then any recursive calls that go through *load-search-dirs* will pass a first argument which is made of the original name, combined with a search dir. (load_rcfile): Pass pointer to initialized location as third argument of open-txr_file, and pass a nil value for search_dirs: no search takes place when looking for that file, which is at a single, fixed location. * parser.h (open_txr_file): Declaration updated. * txr.c (sysroot_init): Initialize *load-search-dirs*. (txr_main): Ensure third argument in all calls to open_txr_file points to initialized variable, with the correct value, and pass t for the search_dirs argument. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
* doc: cross reference eval and file compilation.Kaz Kylheku2022-04-011-2/+33
| | | | | | | * txr.1: The Top-Level Forms and File Compilation Model sections now reference back to eval, noting its similar treatment of top-level forms. Without this, it looks like top-level forms are just a compilation concept.
* loading: bugfix: try specified path before suffixes.Kaz Kylheku2022-03-311-40/+72
| | | | | | | | | | | | | | | | | | | | This is a partial revert of the May 1, 2019 commit 065dde19dfbe50e91e313e5b3ccc033cfbe47f74, titled "loading: try unsuffixed files directly last". Test cases added in prior commit now pass. * parser.c (open_txr_file); Like before the 2019 commit, we try the exact path that is specified first. Only if that is not found do we try adding suffixes to a file which has no recognizable suffix. This does mean that (load "foo") will probe the filesystem twice in order to find "foo.tl" or "foo.tlo" there is no obvious way around that that doesn't cause a problem. * txr.1: Update documentation that is outdated, incomplete, incorrect, or that is has become incorrect because of this fix.
* New function: isecp.Kaz Kylheku2022-03-301-1/+11
| | | | | | | | | | | | | | | | | * eval.c (eval_init): Register isecp intrinsic. * lib.c (isecp): New function. * lib.h (isecp): Declared. * stdlib/compiler.tl (lambda-apply-transform, dump-compiled-objects): Use isecp instead of isec, since the actual intersection of symbols isn't needed, only whether it exists. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
* New FFI types str-s, bstr-s and wstr-s.Kaz Kylheku2022-03-211-47/+99
| | | | | | | | | | | | | | | | | These types actually make it possible to receive a string by pointer from a C function, without trying to free it. It is now possible to write a FFI wrapper for strtol or wcstol, which is done in the new test case. * ffi.c (str_s_s, bstr_s_s, wstr_s_s): New symbol variables. (ffi_init_types): Register the types str-s, bstr-s and wstr-s. (ffi_init): Intern the new symbols. * tests/017/str-s.tl: New file. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
* doc: sort-group: unnecessary copyKaz Kylheku2022-03-161-1/+1
| | | | | * txr.1: Remove copy operation partition-by expression; this was needed when sort was destructive.
* ffi: support intmax-t and uintmax-t types.Kaz Kylheku2022-03-151-1/+15
| | | | | | | | | | | | | * configure: detect intmax_t and place HAVE_INTMAX_T into config.h. * ffi.c (ffi_init_extra_types): register intmax-t and uintmax-t types. If HAVE_INTMAX_T is missing, then make them aliases for longlong and ulonglong. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
* New function: group-map.Kaz Kylheku2022-03-021-6/+39
| | | | | | | | | | | | * hash.c (group_map): New function. (hash_init): group-map intrinsic registered. * hash.h (group_map): Declared. * tests/010/hash.tl: New test case. * txr.1: Documented together with group-by. Extra paren removed from group-by example.
* Version 274.txr-274Kaz Kylheku2022-02-241-3/+3
| | | | | | | | | | | | | | * RELNOTES: Updated. * configure (txr_ver): Bumped version. * stdlib/ver.tl (lib-version): Bumped. * txr.1: Bumped version and date. * txr.vim, tl.vim: Regenerated. * protsym.c: Likewise.
* opip: pass through forms in the op family.Kaz Kylheku2022-02-241-4/+21
| | | | | | | | | | | | | | * stdlib/op.tl (sys:opip-expand): Add op, do, lop, ldo, ap, ip, ado, ido, ret and aret to the operators whose forms are passed through untransformed. This is important because it lets us override the implicit (op ...) and (do ...) chosen by the expander. When a pipeline element produces a list, for instance, we want to be able to use (ap ...) in the next element to spread the list into arguments. * tests/012/op.tl: Add bellied numbers test case. * txr.1: Documented.
* doc: revisit partition-ifKaz Kylheku2022-02-231-7/+26
| | | | | * txr.1: Add introductory paragraph, and fine-tune the rest of the documentation.
* doc: make-like can take an iterators.Kaz Kylheku2022-02-231-0/+10
| | | | | | * txr.1: A December 2021 change that went into TXR 273 allows iterators from iter-begin to be the object argument to the make-like function. This is now documented.
* New list-builder method: oust.Kaz Kylheku2022-02-231-1/+52
| | | | | | | | | | | | | | | | * autoload.c (build_set_entries): Add oust symbol. * stdlib/build.tl (list-builder postinit): Call the self argument self instead of bc, for consistency with other methods. (list-builder oust): New method. (list-builder-flets): Add local function oust. * tests/012/seq.tl: New tests. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
* New function: partition-if.Kaz Kylheku2022-02-231-0/+113
| | | | | | | | | | | | | | | | * eval.c (eval_init): Register partition-if intrinsic. * lib.c (partition_if_countdown_funv, partition_if_func): New functions. (partition_if): New function. * lib.h (partition_if): Declared. * tests/012/seq.tl: New test cases. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
* find-max: convert to seq_info iteration.Kaz Kylheku2022-02-221-23/+6
| | | | | | | | | | | | * lib.c (find_max): Simplify into a single loop rather than handling various sequence types specially. This means it works for all iterable objects now. * txr.1: find-max documentation updated; discussion of hash tables removed, since the described behavior is the one expected for hash tables as iterables. * tests/012/seq.tl: Add some test coverage.
* New functions: find-max-key and find-min-key.Kaz Kylheku2022-02-211-0/+40
| | | | | | | | | | | | | * eval.c (eval_init): Register find-max-key and find-min-key intrinsics. * lib.c (find_max_key, find_min_key): New functions. * lib.h (find_max_key, find_min_key): Declared. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
* doc: or-semantics misformatted.Kaz Kylheku2022-02-191-1/+1
| | | | | * txr.1: In description of make-hash, fix bungled typesetting of "or-semantics".
* doc: extend fboundp dialect note.Kaz Kylheku2022-02-171-2/+10
| | | | | | * txr.1: Mention that ANSI CL's fboundp doesn't yield true for lambda expressions, and how that affects the example expression's fidelity.
* time: fix missing day-of-week and day-of-year.Kaz Kylheku2022-02-161-4/+9
| | | | | | | | | | | | | | | | | | | | The time code entirely neglects the tm_wday and tm_yday fields of struct tm; they are missing from the Lisp time structure, and not referenced anywhere. * time.c (wday_s, yday_s): New symbol variables. (tm_to_time_struct): Transfer tm_wday and tm_yday values to Lisp struct. (time_fields_to_tm): Take wday and yday parameters, convert these and store in the given struct tm. (time_struct_to_tm): Retrieve wday and yday slots, and pass these values to time_fields_to_tm. (make_time_impl): Pass nil for wday and yday arguments of time_fields_to_tm, which is OK since mktime doesn't use those. (time_init): Intern the wday and yday symbols. Add those slots to the time structure. * txr.1: Documented new slots.
* doc: fix name of unique's equality function.Paul A. Patience2022-02-151-2/+2
| | | | | | | * txr.1: The unique function defaults to using an :equal-based hash table, in which case it considers elements to be equal under the equal function, rather than the eql function. Correct this typo, and also adjust the spacing of the .mets line.
* doc: document catenated .tlo files.Kaz Kylheku2022-02-131-0/+35
| | | | | * txr.1: Under load and compile-file, mention the support for loading catenated .tlo files.
* New function: cat-files.Kaz Kylheku2022-02-131-0/+20
| | | | | | | | | | | * lisplib.c (copy_file_instantiate): Trigger autoload on cat-files. * stdlib/copy-file.tl (cat-files): New function. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
* doc: add missing < and << in some .mets lines.Paul A. Patience2022-02-121-13/+13
| | | | | * txr.1: Add < and << in the signatures of various stream methods.
* getopts: forbid :bool in list/cumul types.Paul A. Patience2022-02-121-7/+15
| | | | | | | * stdlib/getopts.tl (list-type-p): Return nil if subtype is :bool. (cumul-type-p): Same. * txr.1: Documented, reworded some sentences, fixed some typos.
* macro-time: special op becomes a macro.Kaz Kylheku2022-02-121-135/+119
| | | | | | | | | | | | | * eval.c (me_macro_time): New static function (do_expand): Remove handling of macro_time_s. (eval_init): Remove special operator registration of macro-time; add macro registration. * txr.1: Documentation of macro-time updated, revised and moved from the top the Macros section to be adjacent to equot. * stdlib/doc-syms.tl: Updated.
* doc: fix references to inexistent handler macro.Paul A. Patience2022-02-091-4/+4
| | | | * txr.1: Correct "handler" to "handle".
* doc: fix issues in arguments to .I macros.Paul A. Patience2022-02-091-11/+11
| | | | | | | * txr.1: Correct .I to .IR when the arguments include trailing punctuation. Add quotes around multiword .I and .IR arguments to be consistent everywhere. Unitalicize "de facto". Fix accidental trailing sentence.
* doc: fix pad's argument list.Paul A. Patience2022-02-091-1/+6
| | | | * txr.1: Document pad's object parameter as optional.
* getopts: uniformize opthelp newlines and headers.Paul A. Patience2022-02-081-4/+2
| | | | | | | | | | | | | | | | The documented options and type legend both end in a blank line, unlike the undocumented options and option conventions. * stdlib/getopts.tl (opthelp): Print a blank line after the undocumented options. (opthelp-conventions): Print a blank line after the conventions. Also, change the header from "Option Conventions" to "Option conventions" to follow the style of the undocumented options and type legend. * txr.1: Remove superfluous (as of now) put-line calls in the --extra-help example of getopts. While here, correct o.extrahelp to o.extra-help.
* doc: fix a few more typos.Paul A. Patience2022-02-071-10/+11
| | | | * txr.1: Fix typos.
* doc: fix various typos and stylistic issues.Paul A. Patience2022-02-061-70/+78
| | | | | | * txr.1: Fix typos and stylistic issues. * stdlib/doc-syms.tl: Updated.
* doc: no such thing as -Da,b,cKaz Kylheku2022-02-051-2/+4
| | | | | * txr.1: Fix the example -Da,b,c to -Dvar=a,b,c. Reported by Paul A. Patience.
* getopts: break up help into three functions.Kaz Kylheku2022-02-031-20/+60
| | | | | | | | | | | | | | | | * lisplib.c (getopts_set_entries): Autoload for opthelp-conventions and opthelp-types. * stdlib/getopts.tl (opthelp): Remove incnotes parameter. Entirely trim out the code for notes about conventions and use of types. (opthel-conventions, opthelp-types): New functions. (option-base opthelp-conventions, option-base opthelp-types): New methods. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
* getopts: make detailed help notes optional.Joe Bloggs2022-02-031-7/+11
| | | | | | | | | | * stdlib/getopts.tl (opthelp): New incnotes parameter. If specified as false, disables the detailed Notes and Type legend. (sys:option-base opthelp): Same new parameter on this method, passed down to opthelp. * txr.1: Documented.
* doc: fix in amb macro.Kaz Kylheku2022-02-031-2/+3
| | | | | | | | | | | | | | * txr.1: when the amb macro detects that the continuation has succeeded, it should return that successful value from the amb-scope, rather than returning the local successful argument a from the amb function. Although it works both ways, it is inefficient when it returns from the function. The reason is that each call to amb executes the successful future twice: once via (call cont a) and then again by returning the a value. This then causes an exponential cascade in calls: each successive amb call sthe successful future twice, so for instance if the solution has a sequence of 8 amb calls, the successful case is reached 256 times.
* doc: window-mappend typo.Kaz Kylheku2022-02-021-1/+1
| | | | | * txr.1: The window-mapdo function is analogous to mapdo, not window-mappend. Reported by vapnik spaknik.
* New function: random-sample.Kaz Kylheku2022-01-291-0/+31
| | | | | | | | | | | | | | | | Implements reservoir sampling. * rand.c (radom_float_impl): New static function, made out of random_float. Returns double, giving us access to the unboxed result (random_float): Now a wrapper around random_float_impl: boxes the result of random_float. (elrd, flrd, random_sample): New static functions. (rand_init): Register random-sample intrinsic. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
* New function: copy-cptr.Kaz Kylheku2022-01-281-1/+19
| | | | | | | | | | | | | | | * eval.c (eval_init): copy-cptr intrinsic registered. * lib.c (copy_cptr): New function. (copy): Use copy_cptr for CPTR objects. * lib.h (copy_cptr): Declared. * tests/017/ffi-misc.tl: New test cases. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
* lib: new functions nand, nor, nandf and norf.Paul A. Patience2022-01-221-32/+127
| | | | | | | | | | | | | | * eval.c (me_nand, me_nor, nor_fun, nand_fun): New functions. (eval_init): Register new intrinsics. * lib.c (nandv, norv): New functions. * lib.h (nandv, norv): Declared. * txr.1: Documented, along with trivial fixes to the descriptions of and, or, andf, orf and notf. * stdlib/doc-syms.tl: Updated.
* type: new macro etypecase.Paul A. Patience2022-01-211-0/+36
| | | | | | | | | | * lisplib.c (type_set_entries): Add etypecase to autoload list. * stdlib/type.tl (etypecase): New macro. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
* doc: mention each-match and while-match in overview.Kaz Kylheku2022-01-181-0/+6
| | | | | * txr.1: In the Pattern-Matching macros overview section, mention while-match and each-match.
* quasiquote: support @,expr hack.Kaz Kylheku2022-01-181-0/+30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For better or worse, TXR Lisp has a dichotomy of representation that @<atom> produces sys:var syntax, whereas @<compound> produces sys:expr. This can cause an issue in backquoting. Suppose you want to use backquote to generate sytax like (a @b) where the b comes from a variable. The problem is that (let ((x 'b)) ^(a @,x)) doesn't do what you might expect: it produces (sys:expr b) rather than (sys:var b). This patch adds a hack into the quasiquote expander which causes it to generate code to do what you expect. Old behavior: 1> (expand '^(a @,x)) (list 'a (list 'sys:expr x)) New behavior: 1> (expand '^(a @,x)) (list 'a (let ((#:g0012 x)) (if (atom #:g0012) (list 'sys:var #:g0012) (list 'sys:expr #:g0012)))) In other words, x will be evaluted, and the based on the type of the object which emerges, either sys:var or sys:expr syntax is generated. * eval.c (expand_qquote_rec): Implement the above hack. We are careful to only do this when this exact shape occurs in the syntax: (sys:expr (sys:unquote item)). * tests/010/qquote.tl: New file. * txr.1: Documented.
* doc: introduce meta-atom terminology.Kaz Kylheku2022-01-181-23/+31
| | | | | | * txr.1: the @expr syntax is not just for numbers, symbols and compound expressions. Most atom syntax can follow @, and produces sys:var.
* New function: match-fboundp.Kaz Kylheku2022-01-171-0/+15
| | | | | | | | | | | | | | | | | | User vapnik spaknik was asking in the mailing list whether there is an existence test for TXR pattern functions. Now there is. * eval.c (eval_init): Register match-fboundp intrinsic. * match.c (match_fbound): New function. * match.h (match_fbound): Declared. * tests/011/txr-case.txr: New test cases. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
* cptr-int: allow full unsigned range.Kaz Kylheku2022-01-131-1/+14
| | | | | | | | | | | | | | The cptr-int function requries an address to be expressed as a signed integer, which is incovenient. E.g. -2147483648 to 2147483647 in a 32 bit address space. Let's fix it to accept an extended range. * lib.c (cptr_int): Convert the argument value to a ucnum if it is positive according to plusp, otherwise to cnum. Then either one to the mem_t * pointer. Thus we can accept either signed or unsigned values. * txr.1: Document the extended range of cptr-int.
* doc: clarify example in copy-struct description.Paul A. Patience2022-01-121-1/+6
| | | | | | * txr.1: The sample copy method given in the description of copy-struct looks like it could be a special structure function that would be taken into account by the copy function. It is not.
* New macros: each-true, some-true, each-false, some-false.Kaz Kylheku2022-01-121-0/+126
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * lisplib.c (arith_each_set_entries): Trigger autoload on new symbols. * stdilb/arith-each.tl (sys:arith-each): Generalize macro to handle short-circuiting logical operations. The op-iv parameter, which is a cons, is spread into two op and iv parameter. One new argument appears, short-circ. This specifies a code for short-circuiting behavior: t means iteration continues while the result is true; nil means it continues while it is nil, and + means iteration continues while the accumulator is nonzero. A new convention is in effect: the operator has to be specified as a list in order to request accumulating behavior, e.g (+) or (*). Otherwise the operator specifies a predicate that is applied to the forms, without taking into account the prior value. (sum-each, sum-each*, mul-each, mul-each*): Spread the op-iv arguments. Wrap the op argument in a list to request accumulation. In the case of mul-each and mul-each*, specify + for the short-circ argument, which means that iteration stops when the accumulator becomes zerop. sum-each and sum-each* specify : for the short-circ argument which is unrecognized, and so ther is no short-circuiting behavior. (each-true, some-true, each-false, some-false): New macros. * tests/016/arith.tl: New tests. * txr.1: Documented new macros and added note about possible short-circuiting in mul-each and mul-each*. * stdlib/doc-syms.tl: Updated.
* sum-each, mul-each: handle no vars case.Kaz Kylheku2022-01-111-1/+36
| | | | | | | | | | | | | | | * stdlib/arith-each.tl (sys:arith-each): If there are no vars, then just reduce to the identity element value. This is alreading happening fine for the each-prod family of operators. * tests/016/arith.tl: Test cases covering the no vars and empty iteration identity element cases for sum-each and mul-each, as well as the *-prod variants. * txr.1: Document empty iteration and empty vars behavior for arithmetic each operators as well as the each-prod family.