HISTORY
This was originally written as a perl5 script. Rather than doing bootstrapping, I foolishly decided it would be fun to write the parser IN parrot assembly, esp. as this would help implementing "eval" and "proc" (Of course, in retrospect, I really wish I had kept with the bootstrapping effort, as I think it would have generated usable results sooner. Ah well, I now know more than I want to about PIR.
OVERVIEW
This is a from-scratch implementation, based primarily on the tcl man page(s), and the cvs-current test suite for tcl.
Another interesting project would have been to modify the tcl source and have it generate parrot directly. Many people smarter than I am have declared this hard, so I'm rather happy I'm working on it this way. (Apparently Tcl's bytecode engine is very optimized for Tcl (big surprise). So, converting the tcl-specific bytecodes there to parrot would be a big deal.)
RUNNING TCL
Generated Files
When you make tcl, you're generating several files:
- lib/tcllib.pbc
-
This file is used to load all the various commands, ops, etc. into the appropriate namespaces, as well as declare and register the TCL compiler for the
compile
opcode.This file is actually built in two steps. The first step uses
tcl.pl
to generatelib/tcllib.imc
, usingtcl.imc_template
as a template. The file is basically passed through unchanged, except for a few${ }
-style substitutions.INCLUDES
make sure all the required.imc
files are included properly. It adds aHEADER
, and removes anyXXX
comments. - tcl.pbc
-
This is roughly equivalent to
tclsh
- It takes the command line arguments (currently, the name of the file you wish to parse), and reads in the file, and uses the tcl library to parse those contents as tcl.
Classes
The classes are not user-visible, but are internal helper classes designed to simplify the parser/interpreter. They are written in PIR and are in lib
. All the helper classes provide an interpret
method, which can be called to calculate its value. For TclConst
, this is a very straightforward return, while for TclCommandList
does dynamic lookup on the various commands, executing each in turn, returning the value of the last command.
- TclCommand
-
A class representing a Tcl command made up of a name and arguments.
- TclCommandList
-
A list of TclCommands used to represent a body of code. This returns the value of the last command.
- TclConst
-
A constant Tcl value created during parsing.
- TclVar
-
A class representing Tcl variables.
- TclWord
-
A TclWord handles the concatenation of arguments. For instance, given
puts ab$c
the parser will generate a word containing an "ab" TclConst and a "$c" TclVar. The values of these segments are concatenated together and passed to the puts command.
PMCS
The Tcl PMCs (Parrot Magic Cookies) are the user visible data types. These live in the *.pmc
files in classes/
. They are compiled into a dynamically loadable library. Most of the functionality associated with these pmcs is derived from the base parrot classes.
- TclString
-
Scalar string, with an override for the boolean truth values.
- TclInt
-
Scalar integer, with an override for various math. (For example, parrot automatically promotes to float division, while Tcl should not.)
- TclFloat
-
Scalar float, with an override of the stringification: Tcl floats are somewhat unusual in that integer-valued floats stringify with a trailing
.0
. - TclList
-
Ordered container, corresponding to
[list]
values. Overrides the default stringification provided by parrot Arrays. - TclArray
-
Hash like container, corresponding to
[array]
values. - TclObject
-
A virtual type, which is used to provide some shimmer (aka morph) methods common to all the scalar value types.
TESTS
To run the test suite, make test
. If you want to also get output from the TODO tests, make devtest
instead. This is NOT the tcl test suite. No failures are expected.
To run the tcl test suite, type "make tcl-test". This will checkout the latest cvs copy of the tests from the tcl repository and run them. Warning:
- 1 Sloooow
- 2 Buggy
-
several of the tests hang, you may have to run
killall parrot
several times during the run. - 3 Incomplete
-
We convert the tests to use Perl's TAP instead of running them natively. The conversion process is flawed, and we don't claim to implement 100% of Tcl yet anyway. Expect a low pass rate.
EXAMPLES
There are examples in the examples
directory that are vaguely more interesting. To run one of the foo.tcl
files in that directory, type make foo
.