BrainFuck part 10 - RPN calc tool

DPAmar
13.9K views

Open Source Your Knowledge, Become a Contributor

Technology knowledge has to be shared and made accessible for free. Join the movement.

Create Content

First operators

Let's add 3 operators to our system now :

  • addition (code 43)
  • subtraction (code 45)
  • multiplication (code 42)

Let's start

  • Memory: empty
  • Cursor: first cell
  • Input: space separated integers and operators

Process

  • Leave an empty space (current number on stack is null)
  • While there is a char to read
    • subtract 32 and set else flag
    • if char is null : it's space
      • reset else flag, move to the right
    • subtract 10 (total 42), if char is null : it's multiply
      • reset else flag, multiply the 2 operands
    • subtract 1 (total 43), if char is null : it's addition
      • reset else flag, sum the 2 operands
    • subtract 2 (total 45), if char is null : it's subtraction
      • reset else flag, subtract the 2 operands
    • otherwise
      • subtract 3 (to get the digit value), and not 16 anymore (target total is 48, so 45+3 and not 32+16)
      • add current number 10 times to current digit to get new current number
  • loop

Code

>,[                     leave empty space and read char
  let's track our target values here
  space 32
  multiply 42
  add 43
  subtract 45
  digit 48 to 57

  >++++[-<-------->]+<  subtract 32
  [----------           subtract 10
  [-                    subtract 1
  [--                   subtract 2
  [                     it's a digit
    --->-<              subtract 3 to get digit value (and reset else flag)
    <[->++++++++++<]    add current number 10 times to current digit
    >[-<+>]             replace current number by current digit
  ]>[-                  now unwind cases: it's subtraction
    <<<[-<->]>          do the subtraction
  ]<]>[-                next case : it's add
    <<<[-<+>]>          do the addition
  ]<]>[-                next case : it's multiply
    <<<[->>+<<]>>[-<<<  do the multiplication
    [->+>+<<]>[-<+>]>>    ** part 2 **
    ]<<<[-]>>[-<<+>>]     ** part 3 **
  ]<]>[-                next case : it's space
    >                   move to next stack entry
  ]                     end of switch/case
<,]                     read char and loop

Final state

  • Memory: stack of integers
  • Cursor: after stack
  • Input: empty (read)
  • Output: unchanged

Note: We can see how to add cases now:

  • get the target code
  • put somewhere in cases switch the code to match
  • add implementation when we unwind the cases stack

Note 2: as all the digits are processed the same way, we will continue to process them as the default case (avoids 10 different implementations for 10 codes)

Test program

This programs reads integers and the 3 operands, all space-separated, and then prints values on the stack as chars

>                                                           add empty cell
>,[>++++[-<-------->]+<[----------[-[--[--->-<<[->+++++++   calc tool
+++<]>[-<+>]]>[-<<<[-<->]>]<]>[-<<<[-<+>]>]<]>[-<<<[->>+<     ** part 2 **
<]>>[-<<<[->+>+<<]>[-<+>]>>]<<<[-]>>[-<<+>>]]<]>[->]<,]       ** part 3 **
<[<]>[.>]                                                   print stack as chars

You can try with input 6 8 * 7 7 * 1 7 7 * + for example. 6x8 = 48, char 0; then 7x7=49, char 1; and finally 1+(7x7)=50, char 2; so it prints 012

Open Source Your Knowledge: become a Contributor and help others learn. Create New Content