Warning: this is an htmlized version!
The original is across this link,
and the conversion rules are here.
# ==============================================================================
# 
# 	RubyFORTH -- Copyright (C) 2007-8, Marc Simpson (GPL). 
# 
#	Vocabularies -- composed of Forth and Compiler wordlists.
# 
# ==============================================================================

require 'stack.rb'

# --[ Vocabulary Class ]--------------------------------------------------------

class Vocabulary < Array

  def initialize(name)
    @vocab_name = name
    super()
    self[0] = {} ; self[1] = {}
    self
  end
    
  def to_s
    "vocab{" + @vocab_name + "}"
  end
    
end

# --[ Vocabulary Storage ]------------------------------------------------------

$vocabularies = Stack.new(16)

# --[ Core words ]--------------------------------------------------------------

def current_vocab    ; $vocabularies.tos      ; end
def vocabulary_order ; $vocabularies.contents ; end
def push_vocab(v)    ; $vocabularies.push(v)  ; end  
def pop_vocab        ; $vocabularies.pop      ; end  

# Search for 'name' in all vocabularies, with the specified wordlist index.
# 
def find_word(name, wordlist_type)
  found_xt = nil
  0.upto($vocabularies.depth()-1) do |i|
    vocab = $vocabularies.nth(i)
    wid = vocab[wordlist_type]
    found_xt = wid[name]
    break if found_xt
  end
  found_xt
end

def find_xt(xt, wordlist_type)
  found_name = nil
  0.upto($vocabularies.depth()-1) do |i|
    vocab = $vocabularies.nth(i)
    wid = vocab[wordlist_type]
    found_name = wid.index(xt)
    break if found_name
  end
  found_name
end


def    forth_words      ; current_vocab[0] ; end
def compiler_words      ; current_vocab[1] ; end

def    forth_word(name) ; find_word(name, 0) ; end
def compiler_word(name) ; find_word(name, 1) ; end

def    forth_header(xt) ; find_xt(xt, 0) ; end
def compiler_header(xt) ; find_xt(xt, 1) ; end

# ------------------------------------------------------------------------------