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