Execute HQ9+/Tcl: Difference between revisions

From Rosetta Code
Content added Content deleted
(Added an implementation in Tcl; see page for why this is interesting)
 
(Added a compiler that is, if anything, shorter than the interpreter...)
Line 2: Line 2:


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...
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...

{{works with|Tcl|8.4}}
<br clear=right>
<br clear=right>
==Interpreter==
<lang tcl>set d [read [expr {$argc?[open [lindex $argv 0]]:"stdin"}]]
<lang tcl>set d [read [expr {$argc?[open [lindex $argv 0]]:"stdin"}]]
for {set i [set a 0]} {$i<[string len $d]} {incr i} {
for {set i [set a 0]} {$i<[string len $d]} {incr i} {
Line 18: Line 21:
} \x2b {incr a}
} \x2b {incr a}
}</lang>
}</lang>
==Compiler==
To be fair, this compiler then immediately executes the code. Replace the <code>eval</code> with <code>puts</code> 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>

Revision as of 19:57, 22 July 2009

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+.

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...

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>