Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
# ============================================================================== # # RubyFORTH -- Copyright (C) 2007-8, Marc Simpson (GPL). # # Inspection and introspection methods. # # ============================================================================== require 'kernel.rb' # --[ Inspection ]-------------------------------------------------------------- $do_headers = /^do[CV].*/ # do{CREATE, COLON, CONSTANT, VARIABLE} def ds_print i = 0 0.upto($here-1) do |i| c = $data_space[i] if c if c.class == String if c.match($do_headers) print "\n" printf("%3i) ", i) end end print "#{c}, " end i += 1 end print "\n\n" end def lookup_name(xt) if $context == "compiler" header = compiler_header(xt) end header = forth_header(xt) if header == nil header = 0 if header == nil header end def lookup_local_name(xt) header = nil header = compiler_words.index(xt) if $context == "compiler" header = forth_words.index(xt) if ! header header = 0 if ! header header end def inspect_ip contents = fetch($ip) header = lookup_name(contents) if contents == "lit" $ip += 1 contents = fetch($ip) if contents.class == String print "'#{contents}'" else print "#{fetch($ip)}" end elsif header == "branch" or header == "?branch" print "#{header} #{fetch($ip + 1)}" $ip += 1 elsif contents == "dodoes" print "does>" $ip += 2 elsif contents.class == String print contents else print(header) if header end end def see_docol # From $ip while fetch($ip) != "exit" inspect_ip print " " $ip += 1 end puts "exit" end def see_docreate print "Primitive ==> 'doCREATE'" if ($ip + 2) != 0 print "/does> " $ip = fetch($ip + 2) see_docol end end def _see(xt) header = fetch(xt) if header == "doCOL" $ip = xt return see_docol end if header == "doCREATE" $ip = xt return see_docreate end puts "Primitive ==> '#{header}'" return nil end def see xt = xt(parse_word) if xt == 0 puts "Error: word not found." return nil end _see(xt) end