Last active
April 28, 2016 20:01
-
-
Save mydoghasworms/23fff6e454c3ca8b66f76a7b9421e80a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Red [needs: view] | |
turtle: #() | |
win: layout [ tfield: base 500x500 white draw [] | |
panel [ | |
text "History" return history: text-list 180x350 data [] return | |
panel [ button "Save" [save request-file history/data] | |
button "Load" [commands: load request-file foreach cmd commands [process-cmd cmd]] ] | |
] | |
return | |
text "Command" cmdfield: field 300x25 [process-cmd cmdfield/text] | |
error: text 100x25 ] | |
home: func[] [ | |
turtle/position: 250x250 | |
turtle/color: black | |
turtle/direction: 0 | |
turtle/pen-down: true | |
] | |
reset: func[] [ | |
clear history/data | |
clear tfield/draw | |
home | |
] | |
turn-by: func[degrees [integer!]] [ | |
turtle/direction: turtle/direction + degrees // 360 | |
] | |
move-by: func[distance [integer!]] [ | |
delta: make pair! compose [(to integer! (sine turtle/direction) * distance) (to integer! (cosine turtle/direction) * distance)] | |
if turtle/pen-down [append/only tfield/draw compose [line (translate-loc turtle/position) (translate-loc turtle/position + delta)]] | |
turtle/position: turtle/position + delta | |
] | |
translate-loc: func [loc [pair!]] [loc/y: 500 - loc/y loc] | |
set-color: func [color] [ | |
append/only tfield/draw compose [pen (color)] | |
] | |
draw-turtle: func[] [ | |
headpos: make pair! compose [(to integer! (sine turtle/direction) * 10) (to integer! (cosine turtle/direction) * 10)] | |
append/only tfield/draw compose [fill-pen green circle (translate-loc turtle/position) 10 | |
circle (translate-loc turtle/position + headpos) 3 fill-pen off] | |
] | |
turtle-repeat: func [cnt rblk] [ | |
repeat none! cnt [parse rblk parse-rules] | |
] | |
parse-rules: [ | |
some [ | |
['fd | 'forward] set distance integer! (move-by distance) | | |
['bk | 'back] set distance integer! (move-by distance * -1) | | |
'right set degrees integer! (turn-by degrees) | | |
'left set degrees integer! (turn-by degrees * -1) | | |
['pu | 'penup] (turtle/pen-down: false) | | |
['pd | 'pendown] (turtle/pen-down: true) | | |
'color set value word! (set-color value) | | |
'repeat set value integer! set blk block! (turtle-repeat value blk) | | |
'reset (reset) | | |
'home (home) | | |
'quit (quit) | | |
set word word! (error/text: mold/only compose [Unknown Word (word)]) break | |
] | |
] | |
process-cmd: func[cmd [string!]] [ | |
remove back tail tfield/draw | |
error/text: "" | |
parse load/all cmd parse-rules | |
if empty? error/text [append history/data cmd cmdfield/text: none ] | |
draw-turtle | |
] | |
process-cmd "home" | |
view/no-wait win |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I think that in
turtle-repeat
, the coderepeat none!
can be replaced byloop
.