This release makes the utility much nicer to use by reducing the size of tarcels and improving the error reporting from tarcel.tarcel. It also corrects a bug that meant that the args variable couldn’t be used as effectively as possible within a .tarcel called using the tarcel command from within another .tarcel. Finally this release adds support for specifying a hashbang line.

Proper Handling of args Variable

You can now use the args variable within a .tarcel without having to worry if it isn’t passed as in this case it will be an empty list. This allows you to create a .tarcel such as the following, adapted from a previous article, to package the Tclx module:

set loadCommands [get packageLoadCommands Tclx {*}$args]
lassign $loadCommands loadCommand version
set outputFilename "Tclx-$version.tm"
set baseDir "Tclx-$version.vfs"
set filesLibDir [file join $baseDir tclx$version]


if {[regexp {^load[^;]+$} $loadCommand]} {
  set libFilename [regsub {^(load\s+)(.*?) (.*?)$} $loadCommand {\2}]
  set libDirname [file dirname $libFilename]
  set tclxFilenames [glob -tails -directory $libDirname *.so *.tcl]

  foreach filename $tclxFilenames {
    fetch $filesLibDir \
          [file join $libDirname $filename]
  }
} else {
  error "Can't find package: Tclx"
}

set initScript {
  lappend auto_path [file normalize @baseDir]
  load [file join @filesLibDir @libTailFilename] Tclx
}

config set init [string map [list @baseDir $baseDir \
                                  @filesLibDir $filesLibDir \
                                  @libTailFilename [file tail $libFilename]] \
                            $initScript]

config set outputFilename $outputFilename

From the calling .tarcel you can choose to restrict the version numbers of Tclx:

tarcel modules [file join tarcels tclx.tarcel 8.3-8.5]

or you can call it without specifying the version requirements and it will use the latest:

tarcel modules [file join tarcels tclx.tarcel]

Adding a Hashbang Line

So that you can make a script executable within Unix you can now specify a hashbang line within an applications .tarcel:

config set hashbang "/usr/bin/env tclsh"