Added programs/bf.grnd
This commit is contained in:
24
packages/lists/lists.grnd
Normal file
24
packages/lists/lists.grnd
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Converts list to string
|
||||||
|
fun -string !ltos -list &inlist
|
||||||
|
getlistsize *inlist &listlen
|
||||||
|
set &idx 0
|
||||||
|
set &ans ""
|
||||||
|
add $ans '[' &ans
|
||||||
|
@stdoutloop
|
||||||
|
getlistat *inlist $idx &store
|
||||||
|
add $ans $store &ans
|
||||||
|
add $idx 1 &idx
|
||||||
|
equal $idx $listlen &store
|
||||||
|
if $store %trueend
|
||||||
|
add $ans ", " &ans
|
||||||
|
jump %stdoutloop
|
||||||
|
|
||||||
|
@trueend
|
||||||
|
add $ans "]" &ans
|
||||||
|
return $ans
|
||||||
|
endfun
|
||||||
|
|
||||||
|
setlist *store 4 2 "Hello"
|
||||||
|
pusharg *store
|
||||||
|
call !ltos &store
|
||||||
|
stdlnout $store
|
1
packages/lists/readme.md
Normal file
1
packages/lists/readme.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
### Due to the current limitations of ground, this package is not ready for use.
|
225
programs/bf.grnd
Normal file
225
programs/bf.grnd
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
stdout "Brainf*ck Code: "
|
||||||
|
stdin &str
|
||||||
|
stdout "Input: "
|
||||||
|
stdin &input
|
||||||
|
set &idx 0
|
||||||
|
setlist *cells 0
|
||||||
|
setlist *startloop
|
||||||
|
set &loopdepth 0
|
||||||
|
set &ignore false
|
||||||
|
set &selectedcell 0
|
||||||
|
set &inputidx 0
|
||||||
|
getstrsize $str &len
|
||||||
|
|
||||||
|
setlist *ascii ' ' '!' '"' '#' '$' '%' '&' "'" '(' ')' '*' '+' ',' '-' '.' '/' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' ':' ';' '<' '=' '>' '?' '@' 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' '[' '\' ']' '^' '_' '`' 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' '{' '|' '}' '~'
|
||||||
|
|
||||||
|
@loop
|
||||||
|
equal $idx $len &store
|
||||||
|
if $store %end
|
||||||
|
|
||||||
|
getstrcharat $str $idx &idxchar
|
||||||
|
|
||||||
|
equal $idxchar '+' &store
|
||||||
|
if $store %plus
|
||||||
|
|
||||||
|
equal $idxchar '-' &store
|
||||||
|
if $store %minus
|
||||||
|
|
||||||
|
equal $idxchar '>' &store
|
||||||
|
if $store %right
|
||||||
|
|
||||||
|
equal $idxchar '<' &store
|
||||||
|
if $store %left
|
||||||
|
|
||||||
|
equal $idxchar '[' &store
|
||||||
|
if $store %leftbracket
|
||||||
|
|
||||||
|
equal $idxchar ']' &store
|
||||||
|
if $store %rightbracket
|
||||||
|
|
||||||
|
equal $idxchar ',' &store
|
||||||
|
if $store %input
|
||||||
|
|
||||||
|
equal $idxchar '.' &store
|
||||||
|
if $store %output
|
||||||
|
|
||||||
|
jump %increment
|
||||||
|
|
||||||
|
@plus
|
||||||
|
if $ignore %increment
|
||||||
|
lesser $selectedcell 0 &store
|
||||||
|
if $store %rangeerror
|
||||||
|
getlistat *cells $selectedcell &store
|
||||||
|
add $store 1 &store
|
||||||
|
setlistat *cells $selectedcell $store
|
||||||
|
inequal $store 256 &store
|
||||||
|
if $store %increment
|
||||||
|
setlistat *cells $selectedcell 0
|
||||||
|
jump %increment
|
||||||
|
|
||||||
|
@minus
|
||||||
|
if $ignore %increment
|
||||||
|
lesser $selectedcell 0 &store
|
||||||
|
if $store %rangeerror
|
||||||
|
getlistat *cells $selectedcell &store
|
||||||
|
subtract $store 1 &store
|
||||||
|
setlistat *cells $selectedcell $store
|
||||||
|
inequal $store -1 &store
|
||||||
|
if $store %increment
|
||||||
|
setlistat *cells $selectedcell 255
|
||||||
|
jump %increment
|
||||||
|
|
||||||
|
@right
|
||||||
|
if $ignore %increment
|
||||||
|
add $selectedcell 1 &selectedcell
|
||||||
|
|
||||||
|
# Check if new cell needs to be added
|
||||||
|
getlistsize *cells &store
|
||||||
|
lesser $selectedcell $store &store
|
||||||
|
if $store %increment
|
||||||
|
listappend *cells 0
|
||||||
|
jump %increment
|
||||||
|
|
||||||
|
@left
|
||||||
|
if $ignore %increment
|
||||||
|
subtract $selectedcell 1 &selectedcell
|
||||||
|
jump %increment
|
||||||
|
|
||||||
|
@leftbracket
|
||||||
|
if $ignore %customignoreleft
|
||||||
|
listappend *startloop 0
|
||||||
|
setlistat *startloop $loopdepth $idx
|
||||||
|
set &ignoreidx $loopdepth
|
||||||
|
add $loopdepth 1 &loopdepth
|
||||||
|
|
||||||
|
getlistat *cells $selectedcell &store
|
||||||
|
inequal $store 0 &store
|
||||||
|
if $store %increment
|
||||||
|
|
||||||
|
# If selected cell is 0, jump to the matching right bracket (by ignoring all other instructions)
|
||||||
|
set &ignore true
|
||||||
|
jump %increment
|
||||||
|
|
||||||
|
@customignoreleft
|
||||||
|
add $loopdepth 1 &loopdepth
|
||||||
|
jump %increment
|
||||||
|
|
||||||
|
@rightbracket
|
||||||
|
subtract $loopdepth 1 &loopdepth
|
||||||
|
if $ignore %continue
|
||||||
|
getlistat *startloop $loopdepth &store
|
||||||
|
set &idx $store
|
||||||
|
# Don't increment
|
||||||
|
jump %loop
|
||||||
|
|
||||||
|
@continue
|
||||||
|
inequal $loopdepth $ignoreidx &store
|
||||||
|
if $store %increment
|
||||||
|
set &ignore false
|
||||||
|
jump %increment
|
||||||
|
|
||||||
|
@input
|
||||||
|
if $ignore %increment
|
||||||
|
lesser $selectedcell 0 &store
|
||||||
|
if $store %rangeerror
|
||||||
|
|
||||||
|
getstrsize $input &store
|
||||||
|
equal $inputidx $store &store
|
||||||
|
if $store %inputzero
|
||||||
|
|
||||||
|
getstrcharat $input $inputidx &inputstore
|
||||||
|
tostring $inputstore &store
|
||||||
|
equal $store "'" &store
|
||||||
|
if $store %singlequote
|
||||||
|
set &asciiidx 0
|
||||||
|
@findascii
|
||||||
|
getlistsize *ascii &store
|
||||||
|
equal $store $asciiidx &store
|
||||||
|
if $store %noascii
|
||||||
|
|
||||||
|
equal $asciiidx 7 &store
|
||||||
|
if $store %asciiincrement
|
||||||
|
getlistat *ascii $asciiidx &store
|
||||||
|
equal $store $inputstore &store
|
||||||
|
if $store %exitascii
|
||||||
|
@asciiincrement
|
||||||
|
add $asciiidx 1 &asciiidx
|
||||||
|
jump %findascii
|
||||||
|
|
||||||
|
@exitascii
|
||||||
|
add $asciiidx 32 &asciiidx
|
||||||
|
setlistat *cells $selectedcell $asciiidx
|
||||||
|
|
||||||
|
add $inputidx 1 &inputidx
|
||||||
|
jump %increment
|
||||||
|
|
||||||
|
@singlequote
|
||||||
|
setlistat *cells $selectedcell 39
|
||||||
|
add $inputidx 1 &inputidx
|
||||||
|
jump %increment
|
||||||
|
|
||||||
|
@inputzero
|
||||||
|
setlistat *cells $selectedcell 0
|
||||||
|
add $inputidx 1 &inputidx
|
||||||
|
jump %increment
|
||||||
|
|
||||||
|
@noascii
|
||||||
|
error "Error: Invalid ASCII output code"
|
||||||
|
|
||||||
|
@output
|
||||||
|
if $ignore %increment
|
||||||
|
lesser $selectedcell 0 &store
|
||||||
|
if $store %rangeerror
|
||||||
|
|
||||||
|
# 0-31 is not doing anything, except for 10 which is newline
|
||||||
|
getlistat *cells $selectedcell &store
|
||||||
|
equal $store 10 &store
|
||||||
|
if $store %newline
|
||||||
|
|
||||||
|
getlistat *cells $selectedcell &store
|
||||||
|
lesser $store 32 &store
|
||||||
|
if $store %blank
|
||||||
|
|
||||||
|
getlistat *cells $selectedcell &store
|
||||||
|
greater $store 126 &store
|
||||||
|
if $store %blank
|
||||||
|
|
||||||
|
getlistat *cells $selectedcell &store
|
||||||
|
subtract $store 32 &store
|
||||||
|
getlistat *ascii $store &store
|
||||||
|
stdout $store
|
||||||
|
jump %increment
|
||||||
|
|
||||||
|
@newline
|
||||||
|
stdlnout ""
|
||||||
|
jump %increment
|
||||||
|
|
||||||
|
@blank
|
||||||
|
stdout " "
|
||||||
|
jump %increment
|
||||||
|
|
||||||
|
|
||||||
|
@increment
|
||||||
|
add $idx 1 &idx
|
||||||
|
jump %loop
|
||||||
|
|
||||||
|
@rangeerror
|
||||||
|
error "Cannot edit garbage data (negative cell index)"
|
||||||
|
@end
|
||||||
|
|
||||||
|
# Output list
|
||||||
|
stdlnout ""
|
||||||
|
getlistsize *cells &listlen
|
||||||
|
set &idx 0
|
||||||
|
stdout "["
|
||||||
|
@stdoutloop
|
||||||
|
getlistat *cells $idx &store
|
||||||
|
stdout $store
|
||||||
|
add $idx 1 &idx
|
||||||
|
equal $idx $listlen &store
|
||||||
|
if $store %trueend
|
||||||
|
stdout ", "
|
||||||
|
jump %stdoutloop
|
||||||
|
|
||||||
|
@trueend
|
||||||
|
stdout "]"
|
1
programs/test.grnd
Normal file
1
programs/test.grnd
Normal file
@@ -0,0 +1 @@
|
|||||||
|
'\''
|
Reference in New Issue
Block a user