ZISC ultra

ZISC ultra is an esolang by User:Yourusername which uses a command that changes the brainfuck command the other command runs.
== Commands ==
Command	Description
% 	increment accumulator by 1 then mod it by 8
  	index into this string and run the corresponding brainfuck command: ><+-.,[]
== brainfuck to ZISC ultra ==
brainfuck	ZISC ultra
> 	 
< 	% %%%%%%%
+ 	%% %%%%%%
- 	%%% %%%%%
. 	%%%% %%%%
, 	%%%%% %%%
[ 	%%%%%% %%
] 	%%%%%%% %
== Examples ==
=== Cat program ===
 %%%%% % %%%%%% % %% 
=== Hello, World! ===
The following program prints the message “Hello, World!” to the standard output:
 %% %%%% %%%%% %%%%% %%% %%% %% %% %%%%%% %%% %%%%%% %%%%%% %% %% %%%%%% %% %%%% % %%% % %%%% %% %% %%%% %%%% %%%%%% %%%% %%%%%% %%%% %%%%%%% %% %%% %%%%%% %% %%%%%%% % %%%%% %% % %%%% %% %% 
== See also ==
* Braincrash
==Implementation==
The following Common Lisp code provides functions dedicated to the transcription
from ZISC ultra to brainfuck, and vice versa:
 (deftype accumulator-state ()
 "Defines the accumulator's range."
 '(integer 0 7))
 
 (deftype destination ()
 "Defines a sink for printing operations."
 '(or null (eql T) stream string))
 
 
 (declaim (type (simple-string 8) +BRAINFUCK-IDENTIFIERS+))
 
 (defparameter +BRAINFUCK-IDENTIFIERS+ "><+-.,[]"
 "Associates the recognized brainfuck commands with their ZISC ultra
 paregals in a bidirectional fashion by adminiculum of their
 zero-based positions inside of the sequence.")
 
 
 (defun convert-ZISC-to-brainfuck (zisc-code &optional (destination NIL))
 "Converts the ZISC-CODE into a brainfuck equivalent and prints the
 result to the DESTINATION, yielding for the same being non-NIL the
 NIL value, otherwise producing a fresh string comprehending the
 output."
 (declare (type string zisc-code))
 (declare (type destination destination))
 (let ((accumulator 0))
 (declare (type accumulator-state accumulator))
 (the (or null string)
 (if destination
 (loop for zisc-token of-type character across zisc-code do
 (case zisc-token
 (#\% (setf accumulator (mod (1+ accumulator) 8)))
 (#\Space (format destination "~c"
 (schar +BRAINFUCK-IDENTIFIERS+ accumulator)))
 (otherwise NIL)))
 (with-output-to-string (brainfuck-code)
 (declare (type string-stream brainfuck-code))
 (convert-ZISC-to-brainfuck zisc-code brainfuck-code))))))
 
 
 (defun get-accumulator-difference (start-value desired-value)
 "Returns the number of incrementations required in order to change
 from the accumulator START-VALUE into the DESIRED-VALUE."
 (declare (type accumulator-state start-value))
 (declare (type accumulator-state desired-value))
 (the accumulator-state
 (cond
 ((< start-value desired-value) (- desired-value start-value))
 ((> start-value desired-value) (+ (- 8 start-value) desired-value))
 ((= start-value desired-value) 0)
 (T (error "Invalid combination of accumulator start value ~d ~
 and desired value ~d." start-value desired-value)))))
 
 (defun convert-brainfuck-to-ZISC (brainfuck-code &optional (destination NIL))
 "Converts the BRAINFUCK-CODE into a ZISC ultra equivalent and prints
 the result to the DESTINATION, yielding for the same being non-NIL
 the NIL value, otherwise producing a fresh string comprehending the
 output."
 (declare (type string brainfuck-code))
 (declare (type destination destination))
 (let ((current-accumulator 0))
 (declare (type accumulator-state current-accumulator))
 (the (or null string)
 (if destination
 (loop for bf-token of-type character across brainfuck-code do
 (let ((new-accumulator
 (position bf-token +BRAINFUCK-IDENTIFIERS+
 :test #'char=)))
 (declare (type (or null accumulator-state) new-accumulator))
 (when new-accumulator
 (format destination "~v@{~a~:*~} "
 (get-accumulator-difference current-accumulator new-accumulator)
 #\%
 (setf current-accumulator new-accumulator)))))
 (with-output-to-string (zisc-code)
 (declare (type string-stream zisc-code))
 (convert-brainfuck-to-ZISC brainfuck-code zisc-code))))))
Category:Languages
Category:Turing tarpits
Category:Turning tarpits
Category:Cell-based
Category:Low-level
Category:Brainfuck derivatives
Category:Unimplemented