| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
| |
* share/txr/stdlib/termios.tl (termios go-raw):
Fix call to nonexistent method.
|
|
|
|
|
|
|
|
|
|
|
|
| |
When tracing for two or more functions is enabled in a single
trace form, the the function tracing hooks print the wrong
name for all but the rightmost function.
* share/txr/stdlib/trace.tl (sys:trace): Fix code which
assumes that the each operator binds fresh lexical variables
on each iteration. Bind a fresh lexical variable lex-n which
copies the current value of the loop variable n, and refer
to this lexical out of the tracing lambda.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Implementing warning for the situaton when the qref, uref, usl
and umeth macro operators are asked to refer to a slot that
doesn't exist in any struct type. This won't catch errors
referencing a slot on the wrong type, but it will catch slots
that are misspelled in such a way that the typo doesn't land
on any slot.
* share/txr/stdlib/struct.tl (defstruct): Register tenative
slot definitions for all slots to nuke warnings.
(sys:check-slot): New function.
(qref, usl, umeth): Check slots with sys:check-slot.
(uref): Drop :whole argument, which is unused.
(defmeth): Register tentative definition for slot.
* struct.c (slot_s, static_slot_s): New symbol variables.
(slot_type_hash, static_slot_type_hash): New hash tables,
associating symbols with lists of struct type names
in which they are defined.
(struct_init): Initialize and gc-protect hashes.
Initialize new symbols, interning in system package.
Register new intrinsic funtions sys:slot-types and
sys:static-slot-types.
(make_struct_type): Register slots in new hashes.
(static_slot_ens_rec): Register new slow in static
slot hash.
(slot_types, static_slot_types): New functions,
registered as intrinsics.
(slot_type_reg, static_slot_type_reg): New functions.
* struct.h (print_s): Declared.
(slot_s, static_slot_s): Declared.
(slot_types, static_slot_types, slot_type_reg,
static_slot_type_reg): Declared.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The tracing module should warn when traced functions or
methods are being redefined, and stop tracing the original
methods.
* eval.c (trace_check): New function. Calls
sys:trace-redefined-check if the trace module has been
loaded, otherwise does nothing.
(op_defun, op_defmacro): Call trace_check to have a warning
issued for a redefined traced function or macro.
* eval.h (trace_check): Declared.
* lisplib.c (trace_loaded): New global variable.
(trace_instantiate): Flip trace_loaded to t.
* lisplib.h (trace_loaded): Declared.
* share/txr/stdlib/trace.tl (sys:trace-redefine-check): New
function. Checks two situations: traced function or method
is redefined (neither old nor new is traced any longer),
and traced method is overridden (base method continues to be
traced, override is not traced).
* struct.c (static_slot_ensure): Do a trace check here,
taking care of defmeth.
|
|
|
|
|
|
|
|
|
|
|
|
| |
When a method is traced that is actually derived from
another struct type, we convert the (meth ...) name
to refer to that type and issue a warning.
* share/txr/stdlib/trace.tl (sys:trace-canonicalize-name): New
function.
(sys:trace): Canonicalize name, and trace the canonicalized
name. Warn if it is different from the original name.
(sys:untrace): Likewise for untracing.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Now it is possible to use a leading dot on the referencing
dot syntax. This is the is the "unbound reference dot". It
expands to the uref macro, which denotes an unbound-reference:
it produces a function which takes an object as the argument,
and curries the reference implied by the remaining arguments.
* eval.c (uref_s): New global symbol variable.
(eval_init): Intern uref symbol and init uref_s.
* eval.h (uref_s): Declared.
* lib.c (simple_qref_args_p): A qref expression is now
also not simple if it contains an embedded uref, meaning
that it cannot be rendered into the dot notation without
ambiguity.
(obj_print_impl): Support printing (uref a b c) as .a.b.c.
* lisplib.c (struct_set_entries): Add uref to the list of
autoload triggers for struct.tl.
* parser.l (DOTDOT): Consume any leading whitespace as part
of recognizing the DOTDOT token. Otherwise the new rule
for UREFDOT, which matches (mandatory) leading space
will take precedence, causing " .." to be scanned wrong.
(UREFDOT): Rule for new kind of dot token, which is
preceded by mandatory whitespace, and isn't consing
dot (which has mandatory trailing whitespace too,
matched by an earlier rule).
* parser.y (UREFDOT): New token type.
(i_dot_expr, n_dot_expr): New grammar rules.
(list): Handle a leading dot on the first element of a list as
a special case. Things are done this way because trying to
work a UREFDOT into the grammar otherwise causes intractable
conflicts.
(i_expr): The ^, ' and , punctuators are now followed by
an i_dot_expr, so that the expression can be an unbound
dot.
(n_expr): Same change as in i_expr, but using n_dot_expr.
Plus new UREFDOT n_expr production.
* share/txr/stdlib/struct.tl (uref): New macro.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
| |
* 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.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Deferrable warnings now get their own subtype, defr-warning.
The tag is a regular argument: no funny dotted argument list.
* eval.c (eval_defr_warn): Throw new style deferrable warning.
(me_op, no_warn_expand): Catch defr-warning rather than
warning. Use uw_muffle_warning to suppress it.
(gather_free_refs): Parse new representation of deferrable
warning.
(expand_with_free_refs): Catch defr-warning rather than
warning.
* lib.c (defr_warning_s): New symbol variable defined.
(obj_init): Initialize defr_warning_s.
* lib.h (defr_warning_s): Declared.
* share/txr/stdlib/error.tl (compile-defr-warning): Throw
new-style deferrable warning.
* unwind.c (uw_muffle_deferrable_warning): Function removed.
(uw_throw): Bugfix: handle warnings by checking by subtype
rather than exactly for the warning type. Distinguish
deferrable warnings by subtype rather than argument list
shape.
(uw_defer_warning): Take the new style args and reconstruct
the (msg . tag) representation for a deferred warning, so
the other functions don't have to change.
(uw_late_init): Register defr-warning as exception subtype
of warning.
* unwind.h (uw_muffle_deferrable_warning): Decl removed.
* txr.1: Adjusted all documentation touching on the subject
of the representation of deferrable warnings.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Improving the new feature to handle functions also,
and improve the diagnostic by reporting the specific
to or from subform of which contains the reference.
* share/txr/stdlib/awk.tl (sys:awk-code-move-check): Take a
an argument indicating the kinds of bindings being checked,
symbols or functions, and an extra form argument.
(sys:awk-mac-let): Pass new arguments to
sys:awk-code-move-check and also call it two more times
to report on functions also.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The awk macro abruptly relocates rng forms out of their
apparent scope. Therefore, code like this is wrong:
(awk ((let ((x t))
(rng t x))
(action)))
The rng form is transformed and relocated to a scope in which
the let is not visible. This is a problem worth warning about.
In the above case, there will also be a warning about the
variable x being unbound, which might alerts the programmer
to the problem. However, in cases where there is yet another
binding of x introduced via :let or outside of awk, that
warning wll not occur: the code motion will silently cause
x to refer to the wrong x:
(awk (:let (x nil))
((let ((x t))
(rng 1 x)) ;; refers to the (x nil) binding!!!
(action)))
(let ((x nil))
(awk ((let ((x t))
(rng 1 x)) ;; refers to the (x 4) binding!!!
(action))))
Now there is a warning for this situation.
* share/txr/stdlib/awk.tl (sys:awk-compile-time): New slot,
outer-env.
(sys:awk-expander): Takes an env parameter, which is stored
into the new slot of the awk-compile-time structure.
(sys:awk-code-move-check): New function.
(sys:awk-mac-let): Use sys:expand-with-free-refs to expand
the rng forms, capturing the extra information which enables
the implementation of the warning. The rng variants are
refactored to pass the original form to the sys:rng
expander. This allows the diagnostic to display the original
rng form.
(awk): Parameter e renamed to outer-env, and passed to
sys:awk-expander.
|
|
|
|
|
|
| |
* share/txr/stdlib/error.tl (compile-warning): Wrap throw in a
catch with a continue handler to properly implement the
warning protocol.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
|
|
| |
We have ifa and conda; whena is conspicuously absent.
* lisplib.c (ifa_set_entries): Add autoload entry for whena.
* share/txr/stdlib/ifa.tl (whena): New macro.
* txr.1: Documented whena.
|
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/place.tl (call-update-expander,
call-clobber-expander, call-delete-expander): On entry into
these functions, propagaet the ancestry info to the original
unexpanded body, not only into the final expanded body. This
way, if errors go off during the expansion of the original,
the diagnostic will have access to the info.
Test case: (flet ((f ())) (set (fun f) 4)). With this patch
we trace to (fun 4) and its location.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
sys:cp-origin blindly propagates macro origin into a
tree structure, and has to perform a complicated circularity
check to avoid introducing cycles
We replace it with a new function which looks only for
invocations of the local setter, getter or deleter macros
within the tree structure and sets the macro origin only
into those forms.
* share/txr/stdlib/place.tl (sys:cp-origin): Function removed.
(sys:propagate-ancestor): New function.
(call-update-expander, call-clobber-expander,
call-delete-expander): Use new function.
|
|
|
|
|
|
|
|
| |
* eval.c (eval-exception): Call uw_dump_deferred_warnings
before throwing exception. The warnings could provide valuable
clues about the cause of the error.
* share/txr/stdlib/error.tl (compile-error): Likewise.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Instead of using a special variable hack to pass down the
request to treat a form as Lisp-1 if it happens to be a
symbol, we now wrap the form in ^(sys:l1-val ,form). We
define sys:l1-val as a place. In the case when form is a
symbol with no lexical binding, requiring the special Lisp-1
treatment, sys:l1-val produces ^(sys:lisp1-value, form).
We define that as a place also, and that takes care of
everything.
* share/txr/stdlib/place.tl (sys:*lisp1*): Special variable
removed.
(sys:sym-update-expander, sys:sym-clobber-expander): Do not
test sys:*lisp1*; just produce a sys:setq form for updating a
symbolic place.
(call-update-expander, call-clobber-expander,
call-delete-expander): Drop the bugfix in the previous commit:
re-binding of sys:*lisp1* to nil
(defplace sys:l1-val, defplace sys:lisp1-value): New places.
(defplace dwim): Do not bind sys:*lisp1*. Wrap obj-place
in a sys:l1-val form, thereby annotating it so that it
receives the right sort of place expander.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This underscores why sys:*lisp1* is so hacky and should be
removed. When we obtain the update, clobber or delete expander
of a place which is the argument of a DWIM, requiring Lisp-1
treatment, we bind the sys:*lisp1* special. This alters the
behavior of obtaining an expander for a symbolic place.
Unfortunately, because call-update-expander (and friends)
use sys:expand, all levels of the form are subject to place
expansion with sys:*lisp1* bound to t.
Example:
(set [(car (inc a 2)) 10] "foo")
Here, the (car ...) form is the place operand of the DWIM
operator, and so sys:*lisp1* is set up around getting its
expander. But then, oops, the a in (inc a 2) is also treated
as Lisp-1, wrongly.
These changes band-aid the situation.
* share/txr/stdlib/place.tl (call-udpate-expander,
call-clobber-expander, call-delete-expander): After retrieving
the expander, bind sys:*lisp1* to nil so that its effect does
not spill over into the sys:expand call which we apply to the
expansion; i.e. reset sys:*lisp1* to nil around recursive
expansion so that the Lisp-1 treatment is confined to depth 1.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/awk.tl (sys:awk-state loop): Allow an input
source to be a list of strings, which is converted to a
stream.
* txr.1: Documented.
|
|
|
|
|
|
|
| |
* share/txr/stdlib/except.tl (catch): Expand the parameters
and body of each clause with sys:expand-params to get
rid of parameter macros. Then insert the leftmost gensym.
This now allows parameter macros to be used in cach clauses.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/awk.tl (sys:awk-state): New slot, file-name.
(sys:awk-state loop): Set file-name from current input name,
or else from the stream name property if the current input
is a stream object.
(sys:awk-mac-let): New awk macro, fname.
* txr.1: Documented fname.
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/awk.tl (sys:awk-state loop): Instead of
using the lexical variable stin, use *stdin*, so that
the standard input stream is re-bound.
* txr.1: Documented binding and scope of *stdin*.
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/build.tl (sys:list-builder-macrolets): Function
renamed to sys:list-builder-flets. Builds local functions
instead of macrolets.
(build): Follow rename of sys:list-builder-macrolets.
* txr.1: Documentation updated and example added of
use of add as a higher order function.
|
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/except.tl (sys:expand-handle): New
function.
(handle): Use sys:expand-handle to expand arguments. The
previously unused :whole form argument is now put to use,
and correctly captured using :form rather than :whole.
(handle*): New macro.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (op_catch): The sys:catch operator now passes the
exception symbol as the first argument of each clause.
This means the catch macro must be adjusted.
* share/txr/stdlib/except.tl (catch): Macro now inserts
a gensym dummy first argument into each clause to take the
symbol passed by the sys:catch operator.
(catch*): New macro, which is identical to the previous
catch macro, and thus exposes the symbol passed as the
first argument.
* txr.1: Documented catch*.
* tests/012/struct.tl: Some gensym numbers need adjusting
in one test case.
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/keyparams.tl (sys:extract-keys,
sys:extract-keys-p): Use the brand new memp function rather
than memq. memq is not correct for plist lookup because of
ambiguities like (:foo :bar :bar 3) where memq retrieves (:bar
:bar 3) for :bar rather than (:bar 3).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (expand_param_macro): Use lisplib_try_load to retry
failed parameter macro lookup, thereby supporting auto-loading
of modules that define parameter macros.
* lisplib.c (keyparams_set_entries, keyparams_instantiate): New static
functions.
(lisplib_init): Support autoloading of keyparams.tl via new
functions.
* share/txr/stdlib/keyparams.tl: New file.
* txr.1: Documented :key param list macro.
* checkman.txr: Support "Parameter list macro" documentation
section type.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* LICENSE, LICENSE-CYG, METALICENSE, Makefile, args.c, args.h,
arith.c, arith.h, cadr.c, cadr.h, combi.c, combi.h, configure,
debug.c, debug.h, eval.c, eval.h, filter.c, filter.h, ftw.c,
ftw.h, gc.c, gc.h, glob.c, glob.h, hash.c, hash.h, jmp.S,
lib.c, lib.h, lisplib.c, lisplib.h, match.c, match.h,
parser.c, parser.h, parser.l, parser.y, rand.c, rand.h,
regex.c, regex.h, signal.c, signal.h, stream.c, stream.h,
struct.c, struct.h, sysif.c, sysif.h, syslog.c, syslog.h,
termios.c, termios.h, txr.1, txr.c, txr.h, unwind.c, unwind.h,
utf8.c, utf8.h, share/txr/stdlib/awk.tl,
share/txr/stdlib/build.tl, share/txr/stdlib/cadr.tl,
share/txr/stdlib/conv.tl, share/txr/stdlib/except.tl,
share/txr/stdlib/getopts.tl, share/txr/stdlib/getput.tl,
share/txr/stdlib/hash.tl, share/txr/stdlib/ifa.tl,
share/txr/stdlib/package.tl, share/txr/stdlib/path-test.tl,
share/txr/stdlib/place.tl, share/txr/stdlib/socket.tl,
share/txr/stdlib/struct.tl, share/txr/stdlib/tagbody.tl,
share/txr/stdlib/termios.tl, share/txr/stdlib/txr-case.tl,
share/txr/stdlib/type.tl, share/txr/stdlib/with-resources.tl,
share/txr/stdlib/with-stream.tl, share/txr/stdlib/yield.tl:
Add 2017 to all copyright headers and strings.
|
|
|
|
|
| |
* share/txr/stdlib/struct.tl (defstruct): Making
nonexistent base type a deferrable warning.
|
|
|
|
|
|
|
| |
* share/txr/stdlib/struct.tl (sys:bad-slot-syntax): Takes form
argument. Uses compile-error function.
(defstruct): Use modified form of sys:bad-slot-syntax
and compile-error instead of throw.
|
|
|
|
|
|
|
| |
* share/txr/stdlib/struct.tl (sys:defmeth): Removing checks
from here.
(defmeth): Add checks here with new functions which provide
location info and warning deferral/supression.
|
|
|
|
|
| |
* share/txr/stdlib/struct.tl (defstruct): Register the struct
ame as a tentative definition.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (eval_init): Register sys:ctx-form and sys:ctx-name
intrinsics.
* lisplib.c (error_set_entries, error_instantiate): New static
functions.
(lisplib_init): Register autoloading of error.tl via
new functions.
* share/txr/stdlib/error.tl: New file.
* struct.c (make_struct_type): Purge deferred warnings.
* unwind.c (uw_late_init): Register purge-deferred-warning
intrinsic.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* eval.c (pm_table): New static variable.
(expand_param_macro): New static function.
(expand_params): Expand parameter list macros via
expand_param_macro.
(eval_init): gc-protect pm_table and initialize it.
Register *param-macro* variable.
* lisplib.v (pmac_set_entries, pmac_instantiate): New static
functions.
(lisplib_init): Register autoloading of pmac.tl via new
functions.
* share/txr/stdlib/pmac.tl: New file.
* txr.1: Notes under defun, lambds, flet/labels and defmacro
about the existence of parameter macros which add to
the syntax. New Parameter List Macros section.
Documented *param-macro* and define-param-expander.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
It turns out we have a silly problem: catch is a special
operator, which undergoes a macro-like expansion which alters
its syntax, but uses the same operator symbol.
We turn catch into a macro which expands to a sys:catch
operator.
* eval.c (sys_catch_s): New symbol variable.
(expand_catch): Function now expands sys:catch forms
without altering any syntax.
(do_expand): Check for sys:catch rather than catch.
Call expand_catch differently: it takes the form now
instead of just the arguments, so it can return the
original form if no expansion takes place.
(eval_init): Initialize sys_catch_s variable. Change
registration of op_catch to sys:catch symbol.
* lisplib.c (except_set_entries): Add catch to the
list of autoload symbols for except.tl.
* share/txr/stdlib/except.tl (catch): New macro for
transforming catch to sys:catch.
* txr.1: Reclassify catch operator as a macro.
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/awk.tl (sys:awk-state): New
slots fw, fw-prev and fw-ranges.
(sys:awk-state rec-to-f): New logic to handle
self.fw.
(sys:awk-let): New local fw symacro.
* txr.1: Documented fw.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
| |
* share/txr/stdlib/tagbody.tl (tagbody): When calling
sys:expand, env was left out due to wrong parenthesis
placement.
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/awk.tl (sys:awk-mac-let): Local macro
sys:rng generalized to support code generation for ranges that
exclude either endpoint. Local rng macro adjusted to target
this new form. Local macros rng-, -rng, and -rng- added.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
| |
* lisplib.c (tagbody_set_entries): Add prog and prog* to
autoload list.
* share/txr/stdlib/tagbody.tl (prog, prog*): New macros.
* txr.1: Documented.
|
|
|
|
|
|
|
|
|
|
| |
* RELNOTES: Updated.
* configure, txr.1: Bumped version and date.
* share/txr/stdlib/ver.tl: Likewise.
* txr.vim, tl.vim: Regenerated.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/awk.tl (sys:awk-let): Renamed to
sys:awk-mac-let. Macrolet prn removed from here.
(sys:awk-fun-let): New macro, provides awk functions.
The prn function removed from sys:awk-mac-let is generated
here.
(sys:awk-fun-shadowing-env): New function.
(awk): Follow rename of sys:awk-let. When expanding p-action
forms, use only sys:awk-mac-let; do not include the awk
functions, which do not "vaporize" unlike local macros. To
compensate for not including the functions, extend the macro
environment with one that shadows the functions, so that
during this expansion, any global macros of the same name as
awk local functions are properlly hidden. In the final
expansion, include the awk functions.
* txr.1: Updated documentation to consistently call
prn an awk function everywhere.
|