Upload
activestate
View
1.144
Download
6
Embed Size (px)
Citation preview
Smooth Transitions:Using Tcl 8.5 and upgrading to Tcl 8.6
Jeff HobbsDirector of EngineeringActiveState Software Inc.
Agenda
About ActiveStateTcl 8.5 overviewTcl 8.5 features in depthTcl 8.6 overview
ActiveState Solutions
ActiveState and Tcl
ActiveState provides the Tcl community with…Improvements to open source Tcl coreHost of the Tcl Developer XchangeEnterprise support infrastructure
ActiveTcl Business and Enterprise EditionsProfessional services for TclHigh quality development tools
ActiveTcl: batteries-Included free distributionKomodo IDE: professional IDE with extensive Tcl supportTcl Dev Kit: essential tools for Tcl programmersActiveTcl Pro Studio: Bundle with Tcl Dev Kit, Komodo IDE, Safari Online
Tcl 8.5
Finished after almost 4 years in development8.5a1 released March 20048.5.0 final December 20078.5.8 released November 20098.5.9 release ETA September 2010
Change in state of stable and beta8.4.19 last community-based released in April 20088.6a1 development initiated April 2008
Tcl 8.5 changes
Over 90 new TIPs included in Tcl 8.58.5 is 99.99% backwards compatible with 8.4 at the Tcl level
Exceptions are in error casesincr auto-initializeNo more integer overflow
Bytecodes have changed - watch version compatibilityActiveTcl tbcload can load 8.4 bytecodes in 8.5
Tcl 8.5 expand and dict
New {*}$aList expansion operatorReplacement for oft-misused eval eval exec [auto_execok start] [list $url]=> exec {*}[auto_execok start] $url
New dict data structureOrder-preserving key/value pairs kept as Tcl_ObjsMore efficient and nestableClose pairing with [array get] and listsCan replace any use of TclX keyed listsNumerous subcommands for filtering, updating dataSome operations byte-coded8.4 emulated version in ActiveTcl
Tcl 8.5 expr
New expr operators** (exponentation), min, max, isqrt, bool, entierin (in list) expr {“b” in {a b c}} => 1ni (not in list), replaces use of lsearch != -1
New ::tcl::mathfunc namespace for functionsDefine expr functions at the Tcl level
New ::tcl::mathop namespace for operationsAllows importing as commands for prefix mathAll functions are byte-compiled
No more integer overflow because of bignums
Tcl 8.5 bignumsexpr 2 ** 1024179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216
Every single bit hand-verified by Kevin KennyWork continuing on performance of bignumsBignums available for all expressions, but most indexing is still limited to 32-bit values (ie: string index, lindex)Floating point handling improved to reduce rounding errors
Tcl 8.5 list ops
Added lrepeat, lassign, lreverselassign is as taken from TclXlrepeat number element1 ?element2 element3 ...?
Extended lsort, lsearchlsearch -index -nocase -subindiceslsort -nocase -indices
List indices now support int[+-]int and end[+-]int syntax
Tcl 8.5 namespaces
namespace ensemble (ensemble commands)Adopted from [incr Tcl], useful for subcommand-style procedures[::carrot::foo] == [::carrot foo]
namespace unknown (per-namespace unknown control)namespace path (name resolution control)namespace upvar (namespace var efficiency)
Tcl 8.5 clock
Completely revamped clock command64-bit, new parser, ensemble-basedNo more Y2038 issues, even on 32-bit systemsFull localization support
Several new subcommandsclock add
Simplifies date math operationsclock microseconds|milliseconds
Improved resolutionClock scan and format updated
User-specifiable scan formatsFull set of Olsen timezone data
Tcl 8.5 interp
Resource limiting with interp limit commandTime and command count based
Improved background error handling with interp bgerrorEnhanced debugging with info frame
Returns current command location and informationUnderstands origin (source, proc, eval, precompiled)
New chan command to consolidate channel operations
Subsumes most f* file id manipulation commandsChannel reflection exposed at the Tcl level (chan create)chan truncate added
Tcl 8.5 packaging
Enhanced package versioningUnderstand a, b designation in version number (8.5a5)Allow for bounded version rangesControl preference for stable or latest version available
Tcl Modules (.tm) package handlingIntended to improve packaging long term
tclsh and source -encoding optionencoding dirs
Tcl level control of where to find encodings
Tcl 8.5 extras
Enhanced catch and returnMake pure Tcl control structures more powerful
New apply operator for anonymous procedures (lambda)apply {x {expr {$x*$x}}} 5 => 25
Several new binary format codes and improved unsigned value support%t (tiny/short), %n (normal/int), %m (wide), %r/R (single precision real), %q/Q (double precision real), %u (unsigned)
scan and format have %llx modifiersNew tcl_platform(pointerSize) element
Tcl 8.5 switch and string
switch -regexp can provide submatch information
switch -matchvar foo -indexvar bar -regexp -- $string { {\w*(e)\w*} { puts "matched [lindex $foo 0] with 'e' at \
[lindex $bar 1 0]" } ...
switch added a -nocase optionNew string is list|wideinteger classificationsNew string reverse subcommand
Tcl 8.5 gotchas
global varName(elemName) raises an error nowAlso for upvar 0 x(1) y(1)Was previously an impotent operation that created inaccessible variables
Don’t rely on integer overflow - shouldn’t happenlist properly quotes the # chartcl_precision now defaults to 0Auto-initialize for incr
Previously an undefined var would cause an errorGains semantic parity with append, lappend
Tcl 8.6
Currently in active development8.6a1 development initiated April 20088.6b1 released December 20088.6b2 release ETA October 2010
Release schedule marching towards final8.6.0 targeted for 2011
Over 40 TIPs implemented for 8.6Community driven input
Tcl‘2010, October 2010 in Chicagohttp://www.tcl.tk/community/tcl2010/
Tcl 8.6 OO
Core OO! (TIP#257,#320)Major effort by Donal FellowsFoundational OO system inspired by XOTcl and snitProvided in core (no package)oo::class, oo::define, oo::copy, oo::object, ...Class-based object system with dynamic redefinition allowedPer-object customization with filters, mixins and moreHas C API to create and manage classes, instances and methods
% oo::class create example { variable foo constructor {{value 10}} { set foo 0 my bar $value } destructor { } method bar {input} { incr foo $input }}=> ::example% example create b 4=> ::b% b bar 3=> 7
Tcl 8.6 highlights
Next version of [incr Tcl] (v4) uses TclOONew non-recursive bytecode engine
Enables coroutines, aka generatorsTcl level coroutines in development
Proper tailcallsLess stack hammeringC API to allow user commands to be restartable
Simplified Tcl prefix matchingC API for option parsing taken from Tk as well
Thread extension to be included with core sourcesOther extensions being considered
Tcl 8.6 features
New binary encode|decode with base64binary is now a namespace ensemble
Ability to cancel script evaluation via interp cancelFind insertion point in sorted list lsearch -bisectAdded tcl_platform(pathSeparator) keyUnicode aware string trim*Grouped sort with lsort -strideAllow lset to extend listslset myList end+1 foo equivalent to lappend myList foo
More 8.6 stuff!
Many commands accept nothing gracefully (TIP#323)Base-2 support in format and scan with %bNew file tempfile ?nameVar? ?template?
Creates tempfile and returns a channelNew try/finally syntaxtry body ?handler...? ?finally script?
set f [open $file a]try { puts $f "oops ..." # ...} finally { close $f}
try { set f [open $file]} trap {POSIX EISDIR} {} { puts "failed to open $file: it's a directory"} trap {POSIX ENOENT} {} { puts "failed to open $file: it doesn't exist"}
But wait, there’s more!
Zlib compression included with new core zlib command
Builds on standard zlib sourcesFull zip and unzip support for gzip and zlib formatsSupports channel streaming for transformsIncludes adler32 and crc32 checksummingIncludes Tcl_Zlib* C API
Enhanced chan commandclose can close only read or write sideAnonymous pipes with chan pipeTcl level channel transformations chan push|pop
And on the C side of 8.6
Make Tcl_Interp opaqueNo more interp->result
Use Tcl_GetStringResult(interp) insteadAPI for interp->errorLine
Access to startup scripts from CTcl_Obj *Tcl_GetStartupScript(const char **encodingNamePtr)void Tcl_SetStartupScript(Tcl_Obj *pathPtr, const char *encodingName)
Portable Tcl_StatBuf accessTcl_Get*FromStat
Tcl 8.6 TDBC
Standard interface for database connectorsCurrently has drivers for sqlite, mysql, odbc and postgres
Leverages TclOO frameworkpackage require tdbc::sqlite3
tdbc::sqlite3::connection create db "phonebook.sqlite3"
set statement [db prepare {
SELECT phone_num FROM directory
WHERE first_name = :firstname
AND last_name = :lastname
}]
db transaction { set firstname "Fred" set lastname "Flintstone"
$statement foreach row { puts [dict get $row phone_num] }}
$statement closedb close
In summary ...
8.5 is 99% compatible with 8.4 at Tcl levelStable and ready for all task loads
8.6 currently in betaFinal release ETA 2011Lots of new features, with more to comeFurther discussion at Tcl‘2010, October 2010 in Chicago
http://www.tcl.tk/community/tcl2010/
Tcl Dev Kit and Komodo support both 8.5 and 8.6Later 8.6 changes may require further updates
Q & A
Twitter: @activestate
Thank You!
Get Tcl Dev Kit 5:Use code ATBE to get $40 off until Sept.15, 2010
Get ActiveTcl Business Edition:Use code ATBE to get $200 off until Sept.15, 2010
Speak to a representative about ActiveTcl Enterprise or OEM: 1-866-510-2914