Alphuck
Jump to navigation
Jump to search
Alphuck is a joke esoteric programming language. It is identical to brainfuck, except that alphabetic characters are used; i.e. it is a member of the trivial brainfuck substitution family of programming languages.
Commands
| Brainfuck | Alphuck | Description |
|---|---|---|
>
|
a
|
Move the pointer to the right |
<
|
c
|
Move the pointer to the left |
+
|
e
|
Increment the memory cell under the pointer |
-
|
i
|
Decrement the memory cell under the pointer |
.
|
j
|
Output the character signified by the cell at the pointer |
,
|
o
|
Input a character and store it in the cell at the pointer |
[
|
p
|
Jump past the matching s if the cell under the pointer is 0
|
]
|
s
|
Jump back to the matching p if the cell under the pointer is not 0
|
Examples
Hello, World! program
eeeeeeeepaeeeepaeeaeeeaeeeaeccccisaea eaiaaepcscisaajaiiijeeeeeeejjeeejaajcijcjeeej iiiiiijiiiiiiiijaaejaeej
Cat program
This cat program repeats until the user issues a null character input:
opjos
See also
Implementation
This implementation in Common Lisp exploits the language's goto facility to realize its telos:
(deftype octet ()
"Defines an unsigned byte composed of eight accolent bits, and thus
a commorant in the integral range [0, 255]."
'(unsigned-byte 8))
(deftype memory ()
"Defines the program memory as a sparse vector of unsigned bytes,
amenable to signed integer cell indices."
(let ((predicate (gensym)))
(declare (type symbol predicate))
(setf (symbol-function predicate)
#'(lambda (candidate)
(declare (type T candidate))
(and (hash-table-p candidate)
(loop
for key of-type T being the hash-key in candidate
using (hash-value value)
always (and (integerp key) (typep value 'octet))))))
`(satisfies ,predicate)))
(defun interpret-Alphuck (code)
"Interprets the piece of Alphuck source CODE and returns no value."
(declare (type string code))
(prog ((ip 0)
(memory (make-hash-table :test #'eql))
(cell-pointer 0))
(declare (type fixnum ip))
(declare (type memory memory))
(declare (type integer cell-pointer))
000 (case (when (array-in-bounds-p code ip) (char code ip))
((NIL) (go 100))
(#\a (go 010))
(#\c (go 020))
(#\e (go 030))
(#\i (go 040))
(#\j (go 050))
(#\o (go 060))
(#\p (go 070))
(#\s (go 080))
(otherwise (go 090)))
010 (incf cell-pointer)
(go 90)
020 (decf cell-pointer)
(go 90)
030 (setf (gethash cell-pointer memory 0)
(mod (1+ (gethash cell-pointer memory 0)) 256))
(go 90)
040 (setf (gethash cell-pointer memory 0)
(mod (1- (gethash cell-pointer memory 0)) 256))
(go 90)
050 (write-char (code-char (gethash cell-pointer memory 0)))
(go 90)
060 (format T "~&>> ")
(finish-output)
(setf (gethash cell-pointer memory) (char-code (read-char)))
(clear-input)
(go 90)
070 (when (zerop (gethash cell-pointer memory 0))
(loop
initially (incf ip)
with nesting of-type fixnum = 0
do (cond
((not (array-in-bounds-p code ip))
(error "Unmatched jump end point."))
((and (char= (char code ip) #\s)
(zerop nesting))
(loop-finish))
((and (char= (char code ip) #\s)
(not (zerop nesting)))
(decf nesting)
(incf ip))
((char= (char code ip) #\p)
(incf nesting)
(incf ip))
(T (incf ip)))))
(go 90)
080 (unless (zerop (gethash cell-pointer memory 0))
(loop
initially (decf ip)
with nesting of-type fixnum = 0
do (cond
((not (array-in-bounds-p code ip))
(error "Unmatched jump end point."))
((and (char= (char code ip) #\p)
(zerop nesting))
(loop-finish))
((and (char= (char code ip) #\p)
(not (zerop nesting)))
(decf nesting)
(decf ip))
((char= (char code ip) #\s)
(incf nesting)
(decf ip))
(T (decf ip)))))
(go 90)
090 (incf ip)
(go 000)
100 (values)))