DirectBrainFUCK
DirectBrainFUCK is a brainfuck-like programming language, but you can directly move the pointer.
Peculiarity
DirectBrainFUCK is derived from brainfuck; however, the number of cells has to be limited to 64, accessible by a one-based index.
Also, its nearly impossible to change the value of a cell that the memory pointer is pointing at, unless you use the input instruction to let the user press a key corresponding to an ASCII value.
The language lacks the control flow commands [
and ]
, excluding it in particular from offering conditional and iterative facilities.
Instructions
Character | What it does |
---|---|
< |
Moves the memory pointer one cell to the left. |
> |
Moves the memory pointer one cell to the right. |
mv |
Moves the memory pointer to the cell with the one-based index v , for which must hold: 1 ≤ v ≤ 64.
|
, |
Prompts the user for an input character and stores its ASCII code in the current cell. |
. |
Prints the ASCII character associated with the value of the current cell. |
Examples
The following example provides a one-time cat program:
,.
This cat program demonstrates the utilization of direct cell access using the dedicated m
instruction:
>>,<<m3.
Implementations
A very simple implementation in Common Lisp is provided:
(defun interpret-DirectBrainFUCK (code &aux (position 0)) (declare (type string code) (type fixnum position)) (symbol-macrolet ((token (the character (char code position)))) (let ((memory (make-array 64 :element-type 'integer :initial-element 0)) (pointer 0)) (declare (type (vector integer 64) memory) (type (integer 0 63) pointer)) (loop while (< position (length code)) do (case token (#\< (decf pointer)) (#\> (incf pointer)) (#\m (incf position) (setf pointer (loop with start of-type fixnum = position while (and (< position (length code)) (digit-char-p token)) do (incf position) finally (return (1- (parse-integer code :start start :end position))))) (decf position)) (#\, (format T "~&Please input a character: ") (setf (aref memory pointer) (char-code (read-char))) (clear-input)) (#\. (write-char (code-char (aref memory pointer)))) (T NIL)) (incf position)))))