| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
| |
scanning environment.
(open_data_source): Regression: was not setting c->curfile when opening
anything.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* eval.h (apply_intrinsic, lazy_mapcar): Declarations added.
* stream.c (open_files, open_file_star): New functions.
(stream_init): Registered new functions as intrinsics.
* txr.1: Documented open-files and open-files*. Added to make-catenated-stream documentation.
* genvim.txr: Replace bunch of code with open-files.
* txr.vim: Regenerated.
|
|
|
|
| |
can occur from an interactive/real-time stream.
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (env_k): Duplicate global variable definition removed.
* lib.c (vector, vec_set_length): Fixed signed/unsigned comparison
warnings.
* stream.h (stdin_s, stdout_s, stddebug_s, stderr_s, stdnull_s):
Declarations were definitions due to missing extern.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
issue ...").
* match.c (open_data_source): if c->data is t, but c->files
is nil, set c->data to nil: we cannot possibly open anything later.
(match_files): We need to call open_data_source one more time just
before processing a line with horizontal material. The previous
call(s) to open_data_source might not have opened anything. Before
accesing car(c.data) the correct test is consp(c.data), not c.data. In
the else clause, we now specificially check for nilp(c.data) which is
the correct indicator of no more data. If c.data is any other atom at
that point, we have an internal error, for which an assertion is added
now.
|
|
|
|
|
|
|
|
|
|
|
|
| |
precision (i.e. given by *). The simplest way to do this is to add a
state vf_star which is similar to vf_digits, and reuses much of the
logic via a goto. Fixing forgotten --fmt (push back char) when moving
from vf_precision to vf_spec state due to unhandled character.
Also, allowing a leading zero before a precision given as *
so that computed precisions can be combined with zero padding.
* txr.1: Documented leading zero better so it is clear it
combines with *. Restructured documentation.
|
|
|
|
|
|
|
| |
(stream_init): Change how put_line is registered to take advantage of
new optional parameter.
* txr.1: Updated.
|
|
|
|
|
|
|
|
| |
* eval.c (eval_init): logten registered as intrinsic.
* lib.h (logten): Declared.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
of identifiers to rule this out from being the first character of a
symbol which has no prefix. Recognize the ^ character as a token in the
NESTED state.
* lib.c (obj_print, obj_pprint): Render sys:qquote as ^.
* parser.y (choose_quote): Function removed.
(n_expr): Recognize '^' as quasiquote. Removed all the "smart quote"
hacks that try to make quote behave as quote or quasiquote, or try to
cancel out unquotes and quotes.
* tests/009/json.txr: Fixed to ^ quasiquote.
* tests/010/reghash.txr: Likewise.
* tests/011/macros-2.txr: Likewise.
* tests/011/mandel.txr: Likewise.
* tests/011/special-1.txr: Likewise.
* txr.1: Updated docs.
* genvim.txr: Revamped definitions for txr_ident and txl_ident so that
unqualified identifiers cannot start with # or ^, but ones with @ or :
in front can start with these characters.
* txr.vim: Regenerated.
|
|
|
|
|
|
| |
(y.tab.c, y.tab.h): Remove y.tab.c before running yacc. Write-protect
y.tab.c, not $@, which could expand to the y.tab.h target if that is
what triggered the rule.
|
| |
|
|
|
|
|
|
| |
(eval_init): Register new intrinsics make-env, env-fbind and env-vbind.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* txr.c (version): Bumped.
* txr.1: Bumped version, set date.
* configure (txr_ver): Bumped.
* RELNOTES: Updated
* dep.mk: Updated.
|
|
|
|
|
|
| |
the variable as special at expansion time. Without this, binding
forms in other parts of the tree won't be expanded properly
to bring about the special semantics.
|
|
|
|
|
|
|
|
|
| |
which breaks backquote, caught by tests/010/reghash.txr.
I thought fixed this already! But I must have made the change to y.tab.c
rather than parser.y.
* Makefile (lex.yy.c, y.tab.c): Make these files readonly to prevent
unintended edits.
|
|
|
|
| |
* txr.vim: Regenerated.
|
|
|
|
|
|
|
| |
causing premature collection of the catenated stream list.
* stream.c (cat_mark): new function.
(cat_stream_ops): use cat_mark for gc mark function.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
expander. One macro based on sys:qquote, sys:unquote and sys:splice,
and the other based on qquote, unquote and splice in the user package.
The read syntax puts out the sys: one.
* eval.c (expand_qquote): Takes three additional arguments: the
qquote, unquote and splice symbols to recognize.
The invalid splice diagnostic is adjusted based on which backquote
we are expanding.
(me_qquote): Look at the symbol in the first position of the form
and then expand either the internal quasiquote macro or the public one,
passing the right symbols into expand_qquote.
(eval_init): Register error-throwing stub functions
for the sys_qquote_s, sys_unquote_s and sys_splice_s symbols.
Register a macro for sys_qquote_s.
* lib.c (sys_qquote_s, sys_unquote_s, sys_splice_s): New symbol
variables.
(obj_init): Initialize new variables. Change qquote_s,
unquote_s and splice_s to user package.
(obj_print, obj_pprint): Convert only sys_qquote_s,
sys_unquote_s and sys_splice_s to the read syntax.
The quote_s, unquote_s and splice_s symbols are not
treated specially.
* lib.h (sys_qquote_s, sys_unquote_s, sys_splice_s): Declared.
* parser.y (n_expr): Use sys_qquote_s, sys_unquote_s and
sys_splice_s rather than qquote_s, unquote_s and splice_s.
(unquotes_occur): Likewise.
* txr.1: Documented.
|
|
|
|
| |
swapping around the consequent and alternative clauses.
|
|
|
|
|
|
| |
Use functions throughout tests instead of repeated code for removing
target, invoking make with redirection and testing for existence of
target.
|
|
|
|
|
|
| |
of a re-bound special under the Lisp-1 evaluation of the [ ]
notation. This test case would have failed three commits
back.
|
|
|
|
|
|
| |
atom that comes out of recursive call, wrapped in (quote ...),
resulting in '(,a . b) expanding to (append 'a . quote b)
rather than (append (list 'a) (quote b)); i.e. (append (list 'a) 'b).
|
|
|
|
|
| |
environment at all, and still had vestiges of support for the the old
cptr based global variables.
|
|
|
|
|
| |
to suppress TXR_DBG_OPTS for tests under tests/011.
The --gen-gc makes mandel.txr run too slow.
|
|
|
|
|
| |
(expand): Use maybe-quote form macro-time, to not quote
result unnecessarily.
|
|
|
|
| |
* tests/011/mandel.txr: New file.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (eval_init): Save *gensym-counter* symbol in gensym_counter_s
symbol variable right after interning, and use zero as the inital value
rather than the gensym_counter variable which is removed now.
* lib.c (gensym_counter_s): New symbol variable.
(gensym_counter): Variable removed.
(gensym): Slight refactoring to avoid a double variable lookup.
Also, for generational GC correctness, use the set macro to update it,
since the variable could live inside heap object and the counter
could overflow to bignums which are heap objects.
(obj_init): Remove initialization of gensym_counter.
* lib.h (gensym_counter_s): Declared.
(gensym_counter): Declaration removed, replaced by macro.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
re-binding. C code now has to go through the dynamic environment lookup
to access things like *random-state*, or *stdout*. As part of this,
I'm moving some intrinsic variable and function initializations out of
eval.c and into their respective modules. Macros are are used to make
global variables look like ordinary C variables. This is very similar
to the errno trick in POSIX threads implementations.
* eval.c (looup_var, lookup_var_l): Restructured to eliminate silly
goto, the cobjp handling is gone.
(reg_fun, reg_var): Internal function becomes external.
reg_var registers a simple cons cell binding now, without any
C pointer tricks to real C global variables.
(c_var_mark): Static function removed.
(c_var_ops): Static struct removed.
(eval_init): Numerous initializations for streams, syslog, rand,
signals and others moved to their respective modules.
The new symbol variables user_package_s, keyword_package_s
and system_package_s are interned here, and the variables are
created in a special way.
* eval.h (reg_var, reg_fun): Declared.
* gc.c (prot1): Added assert that the loc pointer isn't null.
This happened, and blew up during garbage collection.
* lib.c (system_package, keyword_package, user_package): Variables
removed these become macros.
(system_package_var, keyword_package_var, user_package_var): New
global variables.
(system_package_s, keyword_package_s, user_package_s): New
symbol globals.
(get_user_package, get_system_package, get_keyword_package): New
functions.
(obj_init): Protect new variables. Initialization order of modules
tweaked: the modules sig_init, stream_init, and rand_init are moved
after eval_init because they register variables.
* lib.h (keyword_package, system_pckage, user_package): Variables
turned into macros.
(system_package_var, keyword_package_var, user_package_var): Declared.
(system_package_s, keyword_package_s, user_package_s): Declared.
(get_user_package, get_system_package, get_keyword_package): Declared.
* rand.c (struct random_state): Renamed to struct rand_state to
avoid clash with new random_state macro.
(random_state): Global variable removed.
(random_state_s): New symbol global.
(make_state, rand32, make_random_state, random_fixnum, random):
Follow rename of struct random_state.
|
|
|
|
|
|
|
|
|
|
|
|
| |
variable is defined.
(op_defsymacro): Remove the same-named variable when a symbol macro is
defined.
(op_defun): Throw excpetion if an attempt is made to define a
special operator as a function. Remove the same-named macro when a
function is defined.
(op_defmacro): Throw excpetion if an attempt is made to define a
special operator as a macro. REmove the same-named function
when a macro is defined.
|
|
|
|
|
|
|
|
| |
is generating (append (list x) . y) instead of (append (list x) y).
Also, added a nil case which is now necessary to prevent
'(,x) from generating (append (list x) nil), though this is
effectively an optimization, which is pointless, since
the expander isn't optimizing overall.
|
|
|
|
| |
* tests/010/output-clauses.txr: New file.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* tests/011/macros-1.expected: New file.
* tests/011/macros-1.txr: New file.
* tests/011/macros-2.expected: New file.
* tests/011/macros-2.txr: New file.
* tests/011/special-1.expected: New file.
* tests/011/special-1.txr: New file.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (expand_vars): Expand vars needs to know whether it's
handling a sequential (let*-like) or parallel (let-like) binding.
The init form of a variable sees the previous macro environment,
but that variable must, for the remaining variables, shadow any
previous symbol macro.
(expand): In expand we must inform expand_vars whether we have
a sequential or parallel binding construct. Moreover, there was
a huge bug here: the new_menv (with the shadows) was passed to
expand_vars, so that all the variables were hiding same-named
symbol macros from all their initforms.
|
|
|
|
|
|
|
|
| |
(eval_init): Initialiation of delay_s removed.
Symbol now interned in reg_mac call for registering me_delay .
* genvim.txr: Updated to recognize a reg_mac call
with intern.
|
| |
|
| |
|
|
|
|
| |
by Roman Mishin.
|
|
|
|
|
| |
as having trailing junk. The fix is to put the junk-matching rule after
the valid rules.
|
|
|
|
|
|
|
|
| |
* lib.h (copy): Declared.
* eval.c (eval_init): Registered copy function as intrinsic.
* txr.1: Added missing documentation for length. Documented copy.
|
|
|
|
|
|
|
| |
in eval_init. Also, scans reg_mac registrations now.
* txr.vim: Refreshed. The previously missed "delay" operator is now
listed, thanks to reg_mac.
|
|
|
|
|
| |
(expand_macrolet, expand_symacrolet): Use maybe_progn
to eliminate unnecessary progn wrapping.
|
|
|
|
|
|
|
|
| |
(me_gun): New static function.
(eval_init): New gun symbol interened, me_gun registered
as intrinsic macro.
* txr.1: Documented gun.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
formal macros that are in the top_mb table, make their symbols
fboundp and can be expanded with macroexpand.
* eval.c (mefun_t): New typedef name.
(expand_macro): If the expander is a cobj, then pull out the C function
and call it, otherwise realize the interpreted macro as before.
(me_gen, me_delay): New static functions, replace expand_gen
and expand_delay.
(expand_qquote): Renamed to me_quote.
(expand_gen, expand_delay): Renamed to me_gen and me_delay,
with an interface adjustment and moved.
(expand_op): Renamed to me_op.
(expand): Removed qquote, gen, delay, op, and do handling, since
these operators are now macros.
Removed the unnecessary expansion of with-saved-vars.
(reg_op, reg_fun): Assert that the symbol is not nil, to catch
initialization order issues. One just showed up: op_do was
interned in match.c, which is initialized later.
(reg_mac): New static function
(eval_init): Intern do_s, because match.c hasn't done it yet
at this point. Register me_gen, me_delay, me_op (twice) and me_qquote
as intrinsic macros.
* txr.1: Documented those operators as macros.
|
|
|
|
|
| |
(eval_init): Register operators with reg_op instead of direct sethash
calls.
|
|
|
|
|
|
| |
a character, then don't try to make it into a string;
keep it as a list. This allows [mapcar list "abc" "def"]
to work intuitively rather than blow up.
|
|
|
|
|
|
|
| |
(code2type): Return lit_s for LIT type.
(typeof): Return lit_s for TAG_LIT.
(replace_str): Error message wording.
(obj_init): lit_s interned.
|
|
|
|
| |
dispatching function, so it is not clobbered by argument evaluations.
|
|
|
|
|
|
|
|
|
|
|
|
| |
dwim_body, since the append2 copies list structure.
* parser.y (n_exprs): propagate source loc info from both
constituents, giving precedence to the left one, rather than just taking
it from the left one and ignoring the second constituent. This fixes
cases of missing location info. The left constituent n_expr is often
a symbol, and those do not have location info. We want a case like
like ((x) y) to take from (x), and (x (y)) to take it from (y),
and so on.
|
|
|
|
|
|
|
| |
from the @ token.
(n_expr): Bugfix: do not attribute a symbol with location info.
(quasilit): Obtain location info from quasi_items, and only
if that is unavailable, then from lineno.
|