This was one of the GSoC 2009 Projects
The Jacl Modernization project efforts have been incorporated into the JTcl Interpreter.
Jacl Modernization Project
Google Summer of Code 2009
Draft 2009/03/31
Jacl Modernization Release Notes - Weekly reports on project work and comments. Any suggestions should be placed there since this page is large enough.
This project intends to modernize the Jacl interpreter's support of core Tcl commands. We set a goal of implementing Tcl 8.4 level commands. 8.4 is targeted as the last Tcl version before major changes to the Tcl parser, which supports the "list expansion" syntax in version 8.5 (e.g., {*}). The TJC compiler also does not currently support list expansion syntax.
Should time permit, selective features of Tcl 8.5 may be implemented as well. Tcl 8.5 commands to be considered include "apply", "chan", "dict", "lassign", "lrepeat", "lreverse", as well as number of new subcommands affecting many existing commands. See: [L1 ].
Jacl will remain Java JDK version 1.4 API compliant.
We examine each Tcl command using man pages and source code, and compare the existing Jacl source code implementation of that command. Only Tcl core commands are compared; standard library procs (e.g., "auto_execok", "auto_import", etc.) are not considered. Some of these standard library procs are implementation dependent, others may be used directly from Tcl 8.4
For each command, each option invocation is listed. Jacl support will either be noted as "Supported" or "**Unsupported**". Also, for commands that have switches, options, format specifiers, etc., we examine those for conformity. Where these match Tcl, we note those as "Supported", otherwise if not implemented or differing in funcionality, we note as "**Unsupported**".
The Tcl test suite should be considered the standard by which Jacl should comply. Notable exception include those commands that expect to interact with operating system API's, such as "exec". JVM limitations may prevent full Tcl compliance for some commands.
Tasks to modernize Jacl range from easy to difficult. Firstly, easy tasks, such as adding options to existing commands to help familiarize with the Jacl code base before tackling more difficult tasks.
File event processing is likely to require substantial changes to Jacl file handling and event structures.
after ms
Supported
after ms ?script script script ...?
Supported
after cancel id
Supported
after cancel script script ...
Supported
after idle script ?script script ...?
Supported
after info ?id?
Supported
append varName ?value value value ...?
Supported
array anymore arrayName searchId
Supported
array donesearch arrayName searchId
Supported
array exists arrayName
Supported
array get arrayName ?pattern?
Supported
array names arrayName ?mode? ?pattern?
Supported
array nextelement arrayName searchId
Supported
array set arrayName list
Supported
array size arrayName
Supported
array startsearch arrayName
Supported
array statistics array‐name
**Unsupported**
Notes:
Implementation details between C and Java are likely the root
of this option. Jacl implementation shoud accept this option,
but not necessarily return useful information.
array unset arrayName ?pattern?
Supported
binary format formatString ?arg arg ...?
Supported
binary scan string formatString ?varName varName ...?
Supported
Format characters: a A b B h H c s S i I w W f d x X @
Supported
break
Supported
case string ?in? patList body ?patList body ...?
Supported
case string ?in? {patList body ?patList body ...?}
Supported
catch script ?varName?
Supported
cd ?dirname?
Supported
clock clicks ?-milliseconds?
Supported
clock format clockValue ?-format string? ?-gmt boolean?
Supported
clock scan dateString ?-base clockVal? ?-gmt boolean?
Supported
clock second
Supported
Format specifiers: %% %a %A %b %B %c %C %d %D %e %H %I %j %k %l %m %M
%n %p %r %R %s %S %t %T %u %U %V %w %W %x %X %y %Y %Z %Q
Supported
%g %G %h
**Unsupported**
close channelId
Supported
concat ?arg arg ...?
Supported
continue
Supported
encoding convertfrom ?encoding? data
Supported
encoding convertto ?encoding? string
Supported
encoding names
Supported
encoding system ?encoding?
Supported
eof channelId
Supported
error message ?info? ?code?
Supported
eval arg ?arg ...?
Supported
exec ?switches? arg ?arg ...?
Supported
Switches: -- -keepnewline
Supported Supported
| |& < fileName <@ fileId << value > fileName
2> fileName >& fileName >> fileName 2>> fileName
>>& fileName >@ fileId 2>@ fileId >&@ fileId
**Unsupported**
Note: JVM process control is limited compared to Tcl, so
some special arguments may not be able to be implemented.
Threads may be useful to read a process output in order to
pipe (write) into another process.
See also "open" command.
exit ?returnCode?
Supported
expr arg ?arg arg ...?
Supported
Operators: ( ) * / % + - << >> < > <= >= == != & ^ | && || ? :
eq ne - + ! ~
Supported
Functions: abs asin atan2 cos cosh exp fmod int log pow round sinh sqrt
tan acos atan double floor ceil log10 rand hypot srand tanh sin
Supported
wide
**Unsupported**
Note:
Tcl supports "wide" 64 bit integer internally. "expr" stores
values as 32 bit integers if the results of an expression is
an integer and fits in 32 bits, otherwise a 64 bit value is
returned. The "wide" function forces a return value into a
64 bit value. Significant internal changes may be required
to fully support 64 bit integers.
fblocked channelId
Supported
fconfigure channelId
Supported
fconfigure channelId name
Supported
fconfigure channelId name value ?name value ...?
Supported
Options:
-blocking boolean
-buffering type (full | line | none)
-buffersize size
-encoding encoding
-eofchar char
-eofchar {inchar outchar}
-translation mode (auto | binary | cr | crlf | lf)
-translation {inmode outmode}
Supported
fcopy inchan outchan ?-size size? ?-command callback?
**Unsupported**
Notes:
The asynchronous version of this command (-command) will
require much of the same internal work as fileevent.
See also: fileevent
file option name ?arg arg ...?
Supported
Options: copy, delete, dirname, exists, extension, isdirectory,
isfile, join, mtime, mkdir, nativename, owned, pathtype,
readable, rename, rootname, size, split, stat, tail, type,
volumes, writable
Supported
atime, attributes, link, lstat, readlink, system
**Unsupported**
Notes:
JVM does not support these optons
channals, executable, normalize, separator
**Unsupported**
Notes:
These options are likely supportable, but currently
unimplemented in Jacl.
fileevent channelId readable ?script?
fileevent channelId writable ?script?
**Unsupported**
Notes: Will likely require use of Java NIO, or a thread-based
solution.
flush channelId
Supported
for start test next body
Supported
foreach varname list body
Supported
foreach varlist1 list1 ?varlist2 list2 ...? body
Supported
format formatString ?arg arg ...?
Supported
Format strings: d u i o x X c s f e E g G %
Supported
gets channelId ?varName?
Supported
glob ?switches? pattern ?pattern ...?
Supported
Switches: -nocomplain --
Supported
-directory -join -path -tails -types
**Unsupported**
Notes: See Tcl man page for option usage
global varname ?varname ...?
Supported
history ?option? ?arg arg ...?
Supported
Options: add, change, clear, event, info, keep, nextid, or redo
Supported
if expr1 ?then? body1 elseif expr2 ?then? body2 elseif .. ?else? ?bodyN?
Supported
incr varName ?increment?
Supported
info option ?arg arg ...?
Supported
Options: args, body, cmdcount, commands, complete, default, exists,
globals, hostname, level, library, loaded, locals,
nameofexecutable, patchlevel, procs, script,
sharedlibextension, tclversion, or vars
Supported
functions
**Unsupported**
Notes: "info tclversion" and "info patchlevel" should report "8.4" and "8.4.0",
respectively. interp alias srcPath srcToken
Supported
interp alias srcPath srcToken {}
Supported
interp alias srcPath srcCmd targetPath targetCmd ?arg arg ...?
Supported
interp aliases ?path?
Supported
interp create ?-safe? ?--? ?path?
Supported
interp delete ?path ...?
Supported
interp eval path arg ?arg ...?
Supported
interp exists path
Supported
interp expose path hiddenName ?exposedCmdName?
Supported
interp hide path exposedCmdName ?hiddenCmdName?
Supported
interp hidden path
Supported
interp invokehidden path ?-global? hiddenCmdName ?arg ...?
Supported
interp issafe ?path?
Supported
interp marktrusted path
Supported
interp recursionlimit path ?newlimit?
**Unsupported**
interp share srcPath channelId destPath
Supported
interp slaves ?path?
Supported
interp target path alias
Supported
interp transfer srcPath channelId destPath
Supported
Slave commands:
aliases alias eval expose hide hidden invokehidden
issafe marktrusted
Supported
recursionlimit
**Unsupported**
join list ?joinString?
Supported
lappend varName ?value value value ...?
Supported
lindex list ?index...?
Supported
linsert list index element ?element element ...?
Supported
list ?arg arg ...?
Supported
llength list
Supported
load filename
load fileName packageName
load fileName packageName interp
**Unsupported**
Note: This command is designed to load C coded extensions into
Tcl. Jacl instead uses specialized commands to load Java extensions,
"jaclloadjava", "jaclloaditcl", etc.
lrange list first last
Supported
lreplace list first last ?element element ...?
Supported
lsearch ?options? list pattern
Supported
Options: -ascii, -decreasing, -dictionary, -exact, -increasing,
-integer, -glob, -real, -switch, -regexp, -sorted
Supported
-all, -inline, -not, -start,
**Unsupported**
lset varName ?index...? newValue
**Unsupported**
lsort ?options? list
Supported
Options: -ascii, -command, -decreasing, -dictionary, -increasing,
-index, -integer, -real
Supported
-unique, -index end-$i
**Unsupported**
Note: Jacl honors "-index end", but does not honor a position
relative to end, such as "-index end-1".
namespace ?option? ?arg ...?
Supported
Options: children, code, current, delete, eval, export, forget,
import, inscope, origin, parent, qualifiers, tail, which
Supported
exists
**Unsupported**
open fileName
Supported
open fileName access
Supported
open fileName access permissions
Supported
access options: r r+ w w+ a a+ RDONLY WRONLY RDWR APPEND CREAT
EXCL TRUNC
Supportred
NOCTTY NONBLOCK
**Unsupported**
Command pipelines
**Unsupported**
Note: Pipelines, at least simple ones, should be possible.
Threads may be useful to read output of one process and
write into another.
See also: exec, fileevent
Serial port device
**Unsupported** package forget ?package package ...?
Supported
package ifneeded package version ?script?
Supported
package names
Supported
package present ?-exact? package ?version?
Supported
package provide package ?version?
Supported
package require ?-exact? package ?version?
Supported
package unknown ?command?
Supported
package vcompare version1 version2
Supported
package versions package
Supported
package vsatisfies version1 version2
Supported
pid ?fileId?
**Unsupported**
See also: exec, open
proc name args body
Supported
puts ?-nonewline? ?channelId? string
Supported
pwd
Supported
read ?-nonewline? channelId
Supported
read channelId numChars
Supported
regexp ?switches? exp string ?matchVar? ?subMatchVar subMatchVar ...?
Supported
Switches: -indices, -nocase, --
Supported
-about, -expanded, -line, -linestop, -lineanchor, -all,
-inline, -start
**Unsupported**
RE syntax: significant changes
Notes: Jacl implements "basic" RE syntax, via the package
sunlabs.brazil.util.regexp.Regexp. This should be replaced with
Java 1.4 java.util.regex.* which supports most "advanced"
RE syntax (i.e., POSIX syntax) with a few exceptions.
Some Tcl RE syntax could be supported via substituion, e.g.
character classes such as "[[:alpha:]]" could potentially be
replaced with the Java regexp syntax "\p{Alpha}"
RE engine changes also affect other commands that can
accept a '-regexp re' argument (regsub, lsearch, switch, etc.) regsub ?switches? exp string subSpec ?varName?
Supported
Switches: -all, -nocase, --
Supported
-expanded, -line, -linestop, -lineanchor, -start
**Unsupported**
See also: regexp
rename oldName newName
Supported
return ?-code code? ?-errorinfo info? ?-errorcode code? ?string?
Supported
scan string format ?varName varName ...?
Supported
format characters: * d o x c s e f g [chars] [^chars] width
Supported
u i
**Unsupported**
Notes: If wide integers are supported (64 bit), then the
modifiers "l" and "L" should be supported.
seek channelId offset ?origin?
Supported
origin options: start, current, end
Supported
set varName ?value?
Supported
socket ?options? host port
Supported
socket -server command ?options? port
Supported
options: -myaddr, -myport,
-async
**Unsupported**
Notes: Lack of fileevent support limits functionality
of the socket command to
source fileName
Supported
source -rsrc resourceName ?fileName?
source -rsrcid resourceId ?fileName?
**Unsupported** Mac specific
Notes: Jacl source can also source files from a CLASSPATH
resource.
split string ?splitChars?
Supported
string bytelength string
Supported
string compare ?-nocase? ?-length int? string1 string2
Supported
string equal ?-nocase? ?-length int? string1 string2
Supported
string first string1 string2 ?startIndex?
Supported
string index string charIndex
Supported
string is class ?-strict? ?-failindex varname? string
Supported
string last string1 string2 ?lastIndex?
Supported
string length string
Supported
string map ?-nocase? mapping string
Supported
string match ?-nocase? pattern string
Supported
string range string first last
Supported
string repeat string count
Supported
string replace string first last ?newstring?
Supported
string tolower string ?first? ?last?
Supported
string totitle string ?first? ?last?
Supported
string toupper string ?first? ?last?
Supported
string trim string ?chars?
Supported
string trimleft string ?chars?
Supported
string trimright string ?chars?
Supported
string wordend string charIndex
Supported
string wordstart string charIndex
Supported
string is classes: alnum, alpha, ascii, control, boolean, digit,
double, false, graph, integer, lower, print, punct, space,
true, upper, wordchar, xdigit
Supported
subst ?-nobackslashes? ?-nocommands? ?-novariables? string
Supported
switch ?options? string pattern body ?pattern body ...?
Supported
switch ?options? string {pattern body ?pattern body ...?}
Supported
options: -exact, -glob, -regexp, --
Supported
Notes: see regexp
tell channelId
Supported
time script ?count?
Supported
trace add command name ops command
**Unsupported**
trace add execution name ops command
**Unsupported**
trace add variable name ops command
**Unsupported**
trace remove type name opList command
**Unsupported**
trace info type name
**Unsupported**
trace variable name ops command
Supported
trace vdelete name ops command
Supported
trace vinfo name
Supported
trace ops: r w u
Supported
a
**Unsupported**
Notes: Jacl supports an older form of trace, which is
considered deprecated in Tcl. Jacl trace currently only
supports variable tracing, not command tracing.
unset ?options? name ?name name ...?
Supported
option: -nocomplain --
**Unsupported**
Notes: -nocomplain cause the unset commang to ignore any
errors, such as unsetting an non-existent variable.
update ?idletasks?
Supported
uplevel ?level? arg ?arg ...?
Supported
upvar ?level? otherVar myVar ?otherVar myVar ...?
Supported
variable ?name value...? name ?value?
Supported
vwait varName
Supported
while test body
Supported