I'm trying to implement the -> word for setting variables, but it is not working as I hoped. Everything seems find until I reach the first eval word. At that point the evaluated string should make a new word. For some reason, the eval word says that the word can't be found. Here is the code:

\ compile time: 4 -> cat
\ run time:   4 set-cat
\ : set-cat cat ! ;


\ sets values for local variables
: -> ( x - )
parse-word

\ creates a copy of the variable's name
2dup
strdup
2dup
strdup
2dup
strdup

\ creates the new variable setting word
" : set-"
2swap
$cat2

2swap
"  ! ;"
$cat2

"  "
2swap
$cat2

$cat2
eval

\ sets up the new word to be called in place of ->
" set-"
2swap
$cat2

" postpone "
2swap
$cat2
eval
; immediate


\ combines two strings together
: $cat2  ( $1 $2 -- $3 )
   2 pick over +  dup >r alloc-mem >r
   2swap tuck  r@ swap move           ( $2 $1-len )
   r@ + swap move                     ( )
   r> r>
;


Anybody know what I could be doing wrong?