Execute HQ9+/Tcl

Revision as of 19:57, 22 July 2009 by rosettacode>Dkf (Added a compiler that is, if anything, shorter than the interpreter...)

This implementation has the feature that if you feed itself in as the program, it prints itself out. So the implementation of a language with a quine operation is a quine in the language implemented. This feels rather appropriate...

Execute HQ9+/Tcl is part of RCHQ9+. You may find other members of RCHQ9+ at Category:RCHQ9+.
Execute HQ9+/Tcl is an implementation of HQ9+. Other implementations of HQ9+.
Works with: Tcl version 8.4


Interpreter

<lang tcl>set d [read [expr {$argc?[open [lindex $argv 0]]:"stdin"}]] for {set i [set a 0]} {$i<[string len $d]} {incr i} {

   switc\u0068 -- [string index [string tolower $d] $i] \u0068 {

puts "\u0048ello, world!"

   } q {puts -nonewline $d} [expr 10-1] {

for {set b [expr 100-1]} 1 {} { puts "$b bottle[expr {$b-1?{s}:{}}] of beer on t\u0068e wall" puts "$b bottle[expr {$b-1?{s}:{}}] of beer" incr b -1 puts "take one down and pass it around" puts "$b bottle[expr {$b-1?{s}:{}}] of beer on t\u0068e wall" if {$b} {puts ""} else break }

   } \x2b {incr a}

}</lang>

Compiler

To be fair, this compiler then immediately executes the code. Replace the eval with puts to see what it generates. <lang tcl>set d [read [expr {[set a $argc]?[open [lindex $argv [set a 0]]]:"stdin"}]] eval [string map [list \u0068 {puts "\u0048ello, world!";} q \

   [list puts -nonewline $d]\n \071 {for {set b [expr 100-1]} 1 {} {
   puts "$b bottle[expr {$b-1?{s}:{}}] of beer on t\u0068e wall"
   puts "$b bottle[expr {$b-1?{s}:{}}] of beer"
   incr b -1
   puts "take one down and pass it around"
   puts "$b bottle[expr {$b-1?{s}:{}}] of beer on t\u0068e wall"
   if {$b} {puts ""} else break
   };} \x2b {incr a;}

] [regsub -all {[\u0000-*,-8:-gi-pr-\uffff]*} $d {}]]</lang>