| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This is the existential quantifier to accompany @(all).
* share/txr/stdlib/match.tl (compile-loop-match): Check for
the some symbol in a few places and adjust the output.
We don't need a local binding of the patter's variables,
only the temps. The values go directly to the outer binding of
the variables which are not shadowed now. We also don't need
the nreverse logic to set the outer variables: var-exprs
is nil at the outer level. The polarity of the loop
termination test is reversed: we quit the loop on the first
match, as is the polarity of the return value: if the loop is
aborted early t is returned instead of nil.
(compile-match): Wire in the some operator.
|
|
|
|
|
|
|
|
|
|
|
|
| |
This is in anticipation of using the same function to compile
other patterns that involve iteration.
* share/txr/stdlib/match.tl (compile-all-match): Function
renamed to compile-loop-match. The successful match and loop
termination variables are renamed to different symbols.
Also, test for the usr:all* symbol explicitly rather than
all for making the test consp.
(compile-match): Follow function rename.
|
|
|
|
|
|
|
| |
* share/txr/stdlib/match.tl (compile-all-match): We use a flag
to break out of the loop instead of (return). The loop's block is
thereby later eliminated by the compiler. For this we
re-purpose the same all-match-p-var symbol.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* lisplib.c (match_set_entries): Ensure usr:all* is interned.
* share/txr/stdlib/match.tl (compile-all-match): When the
operator is the existing all, we must listp as a guard, not
consp, because an empty list must match vacuously by virtue of
not containing any counterexample to the pattern. For
situations when a vacuous empty match is not desired, we
support the all* alternative operator, which uses consp.
(compile-match): Wire in the all* operator.
|
|
|
|
|
| |
* share/txr/stdlib/match.tl (compile-all-match): New function.
(compile-match): Hook it in.
|
|
|
|
|
|
|
|
|
|
| |
For instance @(oddp) instead of @(oddp x) to require an
element to satisfy oddp without capturing it to a variable.
* share/txr/stdlib/match.tl (compile-predicate-match): Make
the symbolic argument optional, defaulting to nil.
A nil symbol is already treated as pseudo-variable which
consumes an item without binding to a variable.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
So quick and dirty; you have to love special variables.
* share/txr/stdlib/match.tl (*match-form*): New special
variable.
(compile-var-match, compile-predicate-match,
compile-let-match): Use compile-error instead of error,
passing the value of *match-form* as the context.
(compile-match): Ditto, and eliminate unreachable case from
cond form.
(when-match): Capture form directly into special variable
using :form *match-form*.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/match.tl (match-vars): New struct.
Holds vars and expressions, and provides the method to
zipper them up into the assignments.
(match-guard, compiled-match): Inherit from match vars.
match-guard loses temps and temp-exprs. It now has
vars and var-exprs from the base and those are used
instead.
(compiled-match get-temps): Follow temps vars rename.
(compiled-match wrap-guards): Use assignments method
inherited from base instead of assignments function.
(assignments): Function removed.
(compile-struct-match, compile-vec-match,
compile-cons-structure): Follow vars temps rename in
match-guard struct.
(when-mach): Use assignments method of compiled-match instead
of assignments function.
|
|
|
|
|
|
|
|
| |
* lisplib.c (match_instantiate, match_set_entries): New static
functions.
(lisplib_init): Register autoload using new statics.
* share/txr/stdlib/match.tl: New file.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* METALICENSE: 2020 copyrights bumped to 2021. Added note
about SHA-256 routines from Colin Percival.
* LICENSE, LICENSE-CYG, Makefile, alloca.h, args.c, args.h,
arith.c, arith.h, buf.c, buf.h, cadr.c, cadr.h, chksum.c,
chksum.h, chksums/crc32.c, chksums/crc32.h, combi.c, combi.h,
configure, debug.c, debug.h, eval.c, eval.h, ffi.c, ffi.h,
filter.c, filter.h, ftw.c, ftw.h, gc.c, gc.h, glob.c, glob.h,
hash.c, hash.h, itypes.c, itypes.h, jmp.S, lex.yy.c.shipped,
lib.c, lib.h, linenoise/linenoise.c, linenoise/linenoise.h,
lisplib.c, lisplib.h, match.c, match.h, parser.c, parser.h,
parser.l, parser.y, protsym.c, rand.c, rand.h, regex.c,
regex.h, share/txr/stdlib/asm.tl, share/txr/stdlib/awk.tl,
share/txr/stdlib/build.tl, share/txr/stdlib/cadr.tl,
share/txr/stdlib/compiler.tl, share/txr/stdlib/conv.tl,
share/txr/stdlib/copy-file.tl, share/txr/stdlib/debugger.tl,
share/txr/stdlib/defset.tl, share/txr/stdlib/doloop.tl,
share/txr/stdlib/each-prod.tl, share/txr/stdlib/error.tl,
share/txr/stdlib/except.tl, share/txr/stdlib/ffi.tl,
share/txr/stdlib/getopts.tl, share/txr/stdlib/getput.tl,
share/txr/stdlib/hash.tl, share/txr/stdlib/ifa.tl,
share/txr/stdlib/keyparams.tl, share/txr/stdlib/op.tl,
share/txr/stdlib/package.tl, share/txr/stdlib/param.tl,
share/txr/stdlib/path-test.tl, share/txr/stdlib/place.tl,
share/txr/stdlib/pmac.tl, share/txr/stdlib/quips.tl,
share/txr/stdlib/save-exe.tl, share/txr/stdlib/socket.tl,
share/txr/stdlib/stream-wrap.tl, share/txr/stdlib/struct.tl,
share/txr/stdlib/tagbody.tl, share/txr/stdlib/termios.tl,
share/txr/stdlib/trace.tl, share/txr/stdlib/txr-case.tl,
share/txr/stdlib/type.tl, share/txr/stdlib/vm-param.tl,
share/txr/stdlib/with-resources.tl,
share/txr/stdlib/with-stream.tl, share/txr/stdlib/yield.tl,
signal.c, signal.h, socket.c, socket.h, stream.c, stream.h,
struct.c, struct.h, strudel.c, strudel.h, sysif.c, sysif.h,
syslog.c, syslog.h, termios.c, termios.h, time.c, time.h,
tree.c, tree.h, txr.1, txr.c, txr.h, unwind.c, unwind.h,
utf8.c, utf8.h, vm.c, vm.h, vmop.h, win/cleansvg.txr,
y.tab.c.shipped: Copyright year bumped to 2021.
|
|
|
|
|
| |
* share/txr/stdlib/quips.tl (sys:%quips%): East Van cross and
reference to urban myth regarding Sports Illustrated cover.
|
|
|
|
| |
* share/txr/stdlib/quips.tl (sys:%quips%): Updated.
|
|
|
|
|
| |
* share/txr/stdlib/awk.tl: Load "conv", not "conv.tl", so
that if there is a .tlo present, it is loaded instead.
|
|
|
|
|
|
|
| |
* share/txr/stdlib/conv.tl (sys:conv-let): Use usr: package
prefix on the conversion symbols i, o, x, b. They are
being interned in the system package, which breaks the
awk fconv macro.
|
|
|
|
|
| |
* share/txr/stdlib/quips.tl (quip): Don't bind *random-state*;
pass an argument to shuffle.
|
|
|
|
| |
* share/txr/stdlib/quips.tl (sys:%quips%); New entry.
|
|
|
|
|
|
| |
* share/txr/stdlib/quips.tl (sys:%shuffled-quips%): New variable.
(quip): Pop quips from the new variable. When the list is empty,
populate it by shuffling the quips.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date. Fixed repeated
word in documentation under env-hash.
* share/txr/stdlib/ver.tl: Bumped from incorrect 243
value to 245.
|
|
|
|
| |
* share/txr/stdlib/quips.tl (sys:%quips%): New entry.
|
|
|
|
| |
* share/txr/stdlib/quips.tl (sys:%quips%): Add new quips.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (%tlo-ver%): Bump minor version
from 0 to 1. Because the major version doesn't change, these
files will be loaded by TXR 216 through 243, because those
versions only look at the major number. The upcoming 244 will
continue to do that. What the minor number increase indicates
is that the compiled files do not use the deprecated movi
instruction group. If a future version of TXR removes the
instructions from the VM, it will then insist on only loading
version 5 files if the minor number is at least 1. Version 5.0
files will be rejected, as will version 4 or lower.
|
|
|
|
| |
* share/txr/stdlib/quips.tl (sys:%quips%): Add four quips.
|
|
|
|
| |
* share/txr/stdlib/quips.tl (sys:%quips%): Add two quips.
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add this to your .txr_profile startup file.
* lisplib.c (quips_instantiate, quips_set_entries): New static
functions.
(lisplib_init): Register autoloading of quip.
* share/txr/stdlib/quips.tl: New file.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (comp-atom): Remove the special
case for small fixnums and characters which encodes their
value in a movi instruction as an immediate operand. This
means that now these operands go into D registers, like all
other literals.
* share/txr/stdlib/vm-param.tl (%imm-width%): Remove this
constant, reprensenting the maximum bit width of an immediate
operand.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The movrsi, movrmi and movrbi (move immediate {small, medium,
big} to register) instructions are becoming deprecated.
The reasoning is that character and fixnum operands can just
go into a VM descriptor's data vector (D registers). Then they
can be referenced directly without wastefully issuing an extra
instruction.
* genvmop.txr: Add a deprecated comment next to the enum
constants of deprecated opcodes.
* share/txr/stdlib/asm.tl (oc-base): Add Boolean property
which indicates that an opcode is deprecated. This is a static
class variable, defaulting to nil in the base class.
(op-movrsi, op-movsmi, op-movrbi): Override base class
deprecated property with a true value.
* vmop.h: Regenerated.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
* protsym.c: Likewise.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* lisplib.c (sock_set_entries): Register autoload entries for
inaddr-str and in6addr-str. Register prefix symbol to be
interned.
* share/txr/stdlib/socket.tl (sockaddr-in, sockaddr-in6): Both
structs get a new member, prefix, defaulting to the respective
number of bits in the address.
(inaddr-str, in6addr-str): New functions.
* tests/014/iaddr-str, tests/014/inaddr-str.expected,
tests/014/in6addr-str.tl, tests/014/in6addr-str.expected:
New files
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* lisplib.c (each_prod_instantiate, each_prod_set_entries):
New static functions.
(lisplib_init): Register autoload of each-prod.tl via new
functions.
* share/txr/stdlib/each-prod.tl: New file.
* txr.1: Documented. Also, under the existing collect-each
family of operators, added the equivalence to mapping with
lambda to help clarify the semantics.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The (each ()) form should infinitely loop, and the compiled
version does. The interpreter crashes, when that is a
top-level form. The reason is that the underlying sys:each-op
operator uses an empty list of variable names as an indication
to use the bindings from the parent lexical environment.
And in that particular case, the let is also empty. The
whole thing looks like:
(let () (sys:each-op each nil))
If this is a top-level expression, then op_let receives a null
environment pointer. Since it has no bindings to add, it
doesn't extend the environment chain and passes a null
environment pointer down to op_each, which that tries to use,
because it's told to reach into it for bindings.
Let's use the t symbol for that instead, so then the above
would look like:
;; the t and only the t means "access parent env"
(let () (sys:each-op each t))
And then, let's also fix it so that t is never used in this
case when there are no vars:
;; no t, and so don't access parent env.
(let () (sys:each-op each nil))
* eval.c (op_each): Get the bindings from the parent
environment if vars is t, rather than when it's null.
(me_each): When the symbols are not being inserted into the
sys:each-op form, then insert t to indicate that, rather than
nil. If the source form specifies an empty list of bindings,
then insert nil, not t.
* share/txr/stdlib/compiler.tl (expand-each): Get the list of
variable names from the parent lexical environment when vars
is t, rather than when it's null.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
With this change we can do (each ((x vec)) ...) with
reasonable efficiency, because we are no longer marching
through the vector with cdr, copying the suffix.
* eval.c (get_iter_f): New global variable.
(op_each): Obtain iterators for all the objects with
iter_begin, instead of treating them as lists. Probe the
iterators for termination with iter_more, get the items with
iter_item instead of car and step with iter_step instead of
cdr.
(eval_init): gc-protect the get_iter_f function and initialize
it.
* share/txr/stdlib/compiler.tl (expand-each): Replace the
car/cdr and null testing with iter-init, iter-more, iter-item
and iter-step.
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
|
|
|
|
|
|
|
|
|
|
| |
The compiler's expander for dohash, and for the each family of
operators neglects to add the (block nil ...) around the forms
that are expected to be in a block.
* share/txr/stdlib/compiler.tl (expand-dohash, expand-each):
Generate the (block nil ...) around the sys:for construct
which doesn't produce one.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (eval_init): If opt_compat is 237 or less, make sort
and shuffle destructive.
* share/txr/stdlib/getopts.tl (opthelp): Revert previous
change, restoring use of copy-list and use nsort instead of
sort, so the function is not affected by the 237 compatibility
being turned on.
* txr.1: Add compatibility notes.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
I'm fixing a historic mistake copied from ANSI Lisp,
which trips up language newcomers and sometimes even
experienced users.
The function innocently named sort will now return newly
allocated structure. The function previously called sort will
be available as nsort (non-consing/allocating sort).
The shuffle function also becomes pure, and is accompanied by
nshuffle.
* eval (me_op): Continue to use destructive sort in this
legacy code that is only triggered in very old compat mode.
(eval_init): Registered nsort and nshuffle.
* lib.c (nsort, nshuffle): New functions introduced, closely
based on sort and shuffle.
(sort, shuffle): Rewritten to avoid destructive behavior: work
by copying the input and calling destructive counterparts.
(sort_group): Continue to use destructive sort, which is safe;
the structure is locally allocated. The sort_group function
has pure semantics.
(grade): Likewise.
* lib.h (nsort, nshuffle): Declared.
* share/txr/stdlib/getopts.tl (opthelp): Replace an instance
of the (sort (copy-list ...)) pattern with just (sort ...).
* tags.tl (toplevel): Continue to use destructive sort to sort
tags before writing the tag file; the lifetime of the tags
list ends when the file is written.
* tests/010/seq.txr: Switch some sort calls to nsort to keep
test case working.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Open up the
main caseq statement for handling symbols other than just
special operators. Now we handle the compiler-only special
operator sys:ift here, as well as the special casing for call
and apply. Function calls are handled as the fallback case
here now.
(compiler call-fun-form): Remove the checking for ift, and for
call, apply and usr:apply. Only regular case function calls
are handled here now.
(compiler comp-apply-call): New method dedicated for compiling
calls to the call, apply or usr:apply functions, dispatched
directly out of compiler compile.
|
|
|
|
|
|
|
|
| |
The compile function doesn't need to expand because the input
is a function that has already been expanded.
* share/txr/stdlib/compiler.tl (compile): Pass the second
argument to compile-toplevel to suppress expansion.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This is what the recent load-time changes were grooming the
compiler toward. When we compile a lambda, we can look at the
function and variable refernces it is making. If the lambda
makes no lexical function or variable references, we can lift
that lambda into load time, so that it's instantiated once and
then re-used out of a D register. Effectively, it becomes a
top-level function.
* share/txr/stdlib/compiler.tl (compiler comp-lambda-impl):
New method, formed by renaming comp-lambda.
(compiler comp-lambda): Turned not wrapper for comp-lambda
impl which compiles the lambda, and checks for the conditions
for hoisting it into load time, which is currently done by
generating the sys:load-time-lit form around it and re-compiling.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler comp-for): If a for
loop occurs in the top level, or inside a load-time, then we
don't want to suppress the semantics of load-time for any
parts of the loop that are repeatedly evaluated. The
programmer may be doing that specifically to hoist those
calculations out of the loop. We thus bind *load-time* to nil
after compiling the initializing and test expressions.
* txr.1: New paragraph in Notes for load-time, mentioning
compiler treatment of loops and lambda. The language is
deliberately general rather than being specifically about the
for loop, because several loop constructs compile to the for
loop, and that is also subject to future changes.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compile-toplevel): Bind
*load-time* to t, because of course initially we are in the
top level, where load-time can be eliminated.
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler comp-load-time-lit):
Don't hoist constant expressions into load-time, since they
already get hoisted into a D register. Otherwise we just end
up generating load-time code that moves from one D register to
another.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
load-time forms nested in load-time forms have no special
semantics; it's wasteful to separately hoist them into load
time and store their value in their own D register.
We must be careful: this is not true if a nested form occurs
in a lambda.
* share/txr/stdlib/compiler.tl (*load-time*): New special
variable.
(compiler comp-lambda): Bind *load-time* to nil around
the compilation of the lambda, so load-time forms in the
lambda are hoisted to load time, even if the lambda itself
is wrapped in a load-time form.
(compiler comp-load-time-lit): Bind *load-time* true around
the compilation of the form. If *load-time* is already true,
then skip the special load-time logic and just compile the
enclosed form; the surrounding load-time compilation is taking
care of the load-time hoisting.
* txr.1: Document that load-time forms nested in load-time
forms don't do anything, except in the lambda case.
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler comp-load-time-lit):
When compiling the load-time argument expression, indicate the
allocated D register as the destination, rather than using a
freshly allocated T register. Now we need an instruction to
move into the D reg only if the fragment chose a different
register.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/socket.tl (sys:in6addr-condensed-text):
Rewrite with regex based implementation that formats
the number without condensing. This one has better
semantics in that it finds the longest run of 0.0..0
to replace, rather than the leftmost. Ignoring this
semantic difference, it also has better average performance on
pseudo-random addresses, with similar performance on
addresses with long condensable 0's. The original algorithm
has a significantly poorer average case on random addresses,
but better best case on condensable zeros like 1::1.
The new algorithm could improve further with future work to
make regexes faster.
|
|
|
|
|
|
|
|
| |
The str-in6addr and str-in6addr-net functions mishandle
the zero address, rendering it as ":" instead of "::".
* share/txr/stdlib/socket.tl (sys:in6addr-condensed-text):
Test for the degenerate case and map it to "::" output.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|