Sashleyfuck
Jump to navigation
Jump to search
Sashleyfuck is just like Brainfuck, but it uses the letters S, A, H, L, E, and Y, in addition to the conditional constructs [ and ]. It was made after MiroslavRD being the biggest Sashley hater.
Commands
Most of the commands utilize a letter from the term Sashley. Since the word sashley has 2 S's, sahley is used. That means [ and ] can be still used.
| Command | Description |
|---|---|
s
|
moves the pointer to the right, but it gives you a fake syntax error while it does the command anyway. It was referenced from Sashley's right eye, which is black with a purple X in it. |
a
|
Moves the pointer to the left. |
h
|
Increments the memory cell under the pointer. |
l
|
Decrements the memory cell under the pointer. |
e
|
Outputs the character signified by the cell at the pointer. |
y
|
Inputs a character and stores it in the cell at the pointer. |
[
|
Jumps past the matching ] if the cell at the pointer is 0.
|
]
|
Jumps back to the matching [ if the cell at the pointer is nonzero.
|
"Hello World!"
shhhhhhhh[ahhhhhhhhsl]ahhhhhhhheshhhhh[ahhhhhsl]ahhhhehhhhhhheehhheshhhhhhhhh[alllllllllsl]ahheshhhhhhh[ahhhhhhhsl]ahhhhhheshhhhh[ahhhhhsl]alehhhellllllelllllllleshhhhhhhh[allllllllsl]alllele
Output
Syntax error - JUST KIDDING: Hello World!
Cat program
The infinite cat program amounts to:
ye[ye]
Implementation
A very simple interpreter implementation in Common Lisp constitutes the following:
(defun interpret-Sashleyfuck (code &aux (position 0))
"Interprets the Sashleyfuck CODE and returns NIL."
(declare (type string code) (type fixnum position))
(symbol-macrolet ((character (the character (char code position))))
(let ((pointer 0)
(memory (make-hash-table :test #'eql))
(error-printed-p NIL))
(declare (type integer pointer) (type hash-table memory) (type boolean error-printed-p))
(loop while (< position (length code)) do
(case character
(#\s (incf pointer)
(unless error-printed-p
(format T "Syntax error - JUST KIDDING: ")
(setf error-printed-p T)))
(#\a (decf pointer))
(#\h (incf (gethash pointer memory 0)))
(#\l (decf (gethash pointer memory 0)))
(#\e (write-char (code-char (gethash pointer memory 0))))
(#\y (format T "~&Please input a character: ")
(setf (gethash pointer memory)
(prog1 (char-code (read-char))
(clear-input))))
(#\[ (when (zerop (gethash pointer memory 0))
(loop with level of-type fixnum = 0 do
(incf position)
(when (>= position (length code))
(error "No matching ']' found."))
(case character
(#\[ (incf level))
(#\] (if (zerop level)
(loop-finish)
(decf level)))
(otherwise NIL)))))
(#\] (unless (zerop (gethash pointer memory 0))
(loop with level of-type fixnum = 0 do
(decf position)
(when (minusp position)
(error "No matching '[' found."))
(case character
(#\] (incf level))
(#\[ (if (zerop level)
(loop-finish)
(decf level)))
(otherwise NIL)))))
(otherwise NIL))
(incf position)))))