You should get in the habit of putting stack diagram comments on every line of code - it will help you keep track of what you are playing with. By convention, a stack diagram starting with $ indicates a addr,len string pointer, which you should use in this code for clarity.
As best I can tell without stack diagrams, you are generating strings of the form "foo: set-foo foo ! ; foo", and it's probably barfing on "foo:" . I'm not sure what this is supposed to accomplish.
Replace the "eval" with a "type" and you should be able to see what it's generating.