[Richard Suchenwirth] 2013-11-26 - No matter how much you give to people, they will always want more. Take me for example. Just yesterday I found out that Tcl 8.6 comes with an experimental tcl::unsupported::assemble command (see [TAL] (Tcl Assembly Language) for many details), and after playing with it for a while, I already wanted to change things. For example: in TAL, you put a constant to the top of stack with push myconst Fair enough. But to push the value of a local variable, you are supposed to use load myvar Also simple, but somehow not in the simple spirit of Tcl... % set myvar 42 42 % asm {push $myvar} assembly code may not contain substitutions But if [everything is a string], can't I just do the substitutions in the string myself? After some experimentation, here comes.. the smallest macro-assembler in the world. First, just to reduce typing, interp alias {} asm {} ::tcl::unsupported::assemble Then, I thought macro definition and substitution should be in separate places. Makes two lines of code. set masm_subs {"push $" "load "} proc masm code {uplevel 1 [list asm [string map $::masm_subs $code]]} #-- Testing... (equivalent to: proc lempty lst {expr {[llength $lst] == 0}} ) proc lempty lst {masm {push $lst;listLength;push 0;eq}} puts [lempty {}] puts [lempty a] returns 1 resp. 0, as desired. Now as I continue learning TAL, I may run into more useful substitutions.. and just [lappend] them to '''masm_subs''' ... ---- '''[RFox] - 2013-11-27 10:55:41''' Given that you want assembly time substitution can't you just quote the assembly with "'s rather than {} and let the interpreter do the rest? e.g. not: asm {push $myvar} but: asm "push $myvar" In the end that's what you are doing but with much more work. <>Example