Tcl Source Code

View Ticket
Ticket UUID: 944803
Title: new [apply] command
Type: RFE Version: None
Submitter: msofer Created on: 2004-04-29 18:54:44
Subsystem: 22. [proc] and [uplevel] Assigned To: dgp
Priority: 5 Medium Severity:
Status: Closed Last Modified: 2006-02-02 02:26:51
Resolution: Accepted Closed By: dgp
    Closed on: 2006-02-01 19:26:51
A proposed new [apply] command to apply anonymous
functions, giving one possible (but different)
implementation for the goals of TIP 187 (Functions as
Attaching a patch that provides the command; a possible
manual page is at
User Comments: dgp added on 2006-02-02 02:26:51:
Logged In: YES 

944803.patch committed for Tcl 8.5a4

dgp added on 2006-02-02 02:12:11:

File Added - 165824: 944803.patch

Logged In: YES 

New patch includes all changes
in one (including new files)

msofer added on 2006-01-22 09:03:34:

File Added - 164358: apply.test

msofer added on 2006-01-22 09:02:07:

File Added - 164357: apply5.patch

msofer added on 2006-01-22 09:02:03:
Logged In: YES 

Patch apply4 was buggy-as-hell, sorry. The new apply5 should
be much better. Added a testfile too.

msofer added on 2006-01-19 05:46:16:

File Added - 163955: apply4.patch

msofer added on 2006-01-19 05:46:11:
Logged In: YES 

Updated apply4.patch, with fixes for two bugs noticed by dgp
on tclcore:
* [info level 0] now returns the full command line
* error messages do not refer to "procedures"

Still missing:
* move ::apply to ::tcl::apply (?)
* implement suggestion by jenglish (?): if the first
argument to apply is a single-element list, interpret it as
a command name instead

Coldstore's suggestion (improved) will appear in a
forthcoming patch that replaces 'struct Proc' with 'struct
Lambda', and arranges for proc to create a command that runs
a lambda (instead of apply running a nameless proc, as in
this patch). This cleaner approach will break compat with
(at least) itcl sources: investigating an approach that
avoids that.

msofer added on 2006-01-12 05:47:32:
Logged In: YES 

Comments on coldstore's patches:

(1) the idea is more than sound; we need to check if it
doesn't break common extensions that include tclInt.h (itcl
uses Proc, IIRC).

(2) a Proc has to know its namespace in order to 
(a) cause the body to be compiled in the correct namespace
(b) push a CallFrame for the correct namespace before
eval'ing the body

msofer added on 2006-01-12 05:33:00:

File Added - 163010: apply3.patch

Logged In: YES 

Updated patch apply3.patch, applies to HEAD.

Note that this is still a proof-of-concept: missing tests
and comments, for instance.

coldstore added on 2004-08-23 08:09:31:

File Added - 98735: procns2.patch

coldstore added on 2004-08-23 08:09:30:
Logged In: YES 

Second patch to remove Command* from Proc.

This handles [rename] and properly refcounts Namespace refs
held in Procs.

coldstore added on 2004-08-23 06:41:16:

File Added - 98730: procns.diff

coldstore added on 2004-08-23 06:41:15:
Logged In: YES 

Following discussion on tkchat, it is possible (and
desirable) to simplify struct Proc so that it no longer
requires a Command, but instead directly points to its
defining Namespace ... this will require further
modification to the [rename] command, to preserve rename
semantics (where renaming a command associated with a proc
will change the proc's Namespace) ... to be attached in a
different patch.

Justification: a proc needs to know its own namespace
(although except for the [variable] command, it's hard to
know precisely why ... more analysis work needs to be done)
but the additional requirement, that it possess an
associated command, doesn't seem warranted.

The included patch removes that requirement, and should
enable eventual simplification of Miguel's [apply] patch by
not absolutely requiring it to create a Command to associate
with an anonymous proc.

This simplification is beneficial with, or without, changes
to tcl semantics permitting direct evaluation of a Lambda

msofer added on 2004-04-30 17:28:36:

File Added - 85602: apply2.patch

Logged In: YES 

Addressing only the first issue, new apply2.patch with
manpage at

This version executes the anonymous function in the global
namespace by default, but a different (constant) namespace
can be specified.

The remaining two issues are still unaddressed; this is
experimental code, those matters will definitely be fixed
before applying.

dkf added on 2004-04-30 15:43:29:
Logged In: YES 

Issues, some of which are not serious in demo code:
 * Which is the correct namespace to execute in?
 * The errorInfo messages are misleading
 * Should the guts of TclObjInterpProc be extracted so that
they can be called from [apply]?  IncrTcl (and other
extensions?) might also be a client of such a function, even
if it was internal, so whatever it is ought to go in the
stubs table.

msofer added on 2004-04-30 01:54:45:

File Added - 85535: apply.patch