Lead Your Turtle by a String
Groovy (357 Bytes)

No external turtle libs were used and no turtles were harmed.

R={s-&gt;s[0]?[0,-1*s[0]]:[s[1],0]}
L={s-&gt;s[0]?[0,s[0]]:[-1*s[1],0]}
def y(s){l=s.length()*2;z(new String[l][l],[l/4,l/4],s,null,[0,1])}
def z(g,l,w,p,h){if(w.length() &amp;&amp; !g[(int)(l[0]+h[0])][(int)(l[1]+h[1])]){c=w.getAt(0);w=w.substring(1);if(p &amp;&amp; p&lt;c){h=R(h)}else if(p&gt;c){h=L(h)};g[(int)l[0]+h[0]][(int)l[1]+h[1]]=c;z(g,[l[0]+h[0],l[1]+h[1]],w,c,h)}else{g}}


Try it here:
https://groovyconsole.appspot.com/edit/5115774872059904



Previous Attempts

Groovy (397 Bytes)

rotR={s-&gt;s[0]!=0?[0,-1*s[0]]:[s[1],0]}
rotL={s-&gt;s[0]!=0?[0,s[0]]:[-1*s[1],0]}
def y(s){z(new String[s.length()][s.length()],[s.length()/2,s.length()/2],s,null,[0,1])}
def z(g,l,w,p,h){if(w.length() &amp;&amp; !g[(int)(l[0]+h[0])][(int)(l[1]+h[1])]){c=w.getAt(0);w=w.substring(1);if(p &amp;&amp; p&lt;c){h=rotR(h)}else if(p &gt; c){h=rotL(h)};g[(int)l[0]+h[0]][(int)l[1]+h[1]]=c;z(g,[l[0]+h[0],l[1]+h[1]],w,c,h)}else{g}}


https://groovyconsole.appspot.com/script/5179465747398656