Is
Jump to navigation
Jump to search
Is is an esoteric programming language invented by User:A which operates on two separate memory components: a scalar bit value and a potentially infinite bit array.
Commands
i |
Increment the current bit, contingently wrapping around. |
s |
Set the whole array into the pointed bit's value. At the program's start, all array elements are set to 0. If the modification repeats forever, then it will overflow. |
Examples
Truth-machine
For input = 1, the code is:
is
Set into:
111111111111.......(which is the normal print 1 forever)
For input = 0, the code is:
s
set into:
000000000000.......(which is 0.It is impossible to only make one 0, unless the array only had 1 bit)
Computability
It can implement a Truth-machine. But, it has no if statements! And repetition! And I/O! But, it even passed the test!!! I am sure the Truth-machine is useless for testing all those characteristics.
Interpreter
An interpreter in the programming language Common Lisp shall be adduced:
(defclass Memory () () (:documentation "Establishes an interface for all classes pursuing the modeling of an Is program memory's cell array component.")) ;;; ------------------------------------------------------- (defclass Infinite-Memory (Memory) ((cells :initform (make-array 0 :element-type 'bit :initial-element 0 :adjustable T :fill-pointer T) :type bit-vector :documentation "A resizable bit vector which simulates an \"infinite\" binary array.")) (:documentation "Simulates an infinite vector of bits utilizing a dynamically resizing array.")) ;;; ------------------------------------------------------- (defclass Fixed-Size-Memory (Memory) ((cells :initarg :cells :type simple-bit-vector :documentation "A fixed-size array of bits.")) (:documentation "Realizes a fixed-size vector of bits.")) ;;; ------------------------------------------------------- (defun make-infinite-memory () "Creates and returns a fresh ``Infinite-Memory instance." (the Infinite-Memory (make-instance 'Infinite-Memory))) ;;; ------------------------------------------------------- (defun make-fixed-size-memory (size) "Creates and returns a fresh ``Fixed-Size-Memory of the desiderated SIZE." (declare (type fixnum size)) (the Fixed-Size-Memory (make-instance 'Fixed-Size-Memory :cells (make-array size :element-type 'bit :initial-element 0 :adjustable NIL :fill-pointer NIL)))) ;;; ------------------------------------------------------- (defgeneric set-memory-cells-to (memory new-value) (:documentation "Stores the NEW-VALUE in all of the MEMORY's cells, concomitantly printing each cell's new state, and returns no value.") (:method ((memory Infinite-Memory) (new-value integer)) (declare (type Infinite-Memory memory)) (declare (type bit new-value)) (with-slots (cells) memory (declare (type bit-vector cells)) (loop for cell-index of-type fixnum = 0 then (mod (1+ cell-index) array-total-size-limit) do (when (>= cell-index (length cells)) (vector-push-extend 0 cells)) (setf (bit cells cell-index) new-value) (format T "~d" (bit cells cell-index)))) (values)) (:method ((memory Fixed-Size-Memory) (new-value integer)) (declare (type Fixed-Size-Memory memory)) (declare (type bit new-value)) (with-slots (cells) memory (declare (type simple-bit-vector cells)) (loop for cell-index of-type fixnum from 0 below (length cells) do (setf (sbit cells cell-index) new-value) (format T "~d" (sbit cells cell-index)))) (values))) ;;; ------------------------------------------------------- (defun interpret-Is (code &optional (memory (make-infinite-memory))) "Interprets the piece of Is source CODE, potentially deploying a bespoke MEMORY model, and returns no value." (declare (type string code)) (let ((ip 0) (current-bit 0)) (declare (type fixnum ip) (type bit current-bit)) (symbol-macrolet ((current-character (the character (char code ip))) (program-has-completed-p (the boolean (not (array-in-bounds-p code ip))))) (declare (type character current-character) (type boolean program-has-completed-p)) (loop until program-has-completed-p do (case current-character ((#\Space #\Tab #\Newline #\Return) NIL) (#\i (setf current-bit (- 1 current-bit))) (#\s (set-memory-cells-to memory current-bit)) (otherwise (error "Invalid character \"~c\" at position ~d." current-character ip))) (incf ip)))) (values)) ;;; ------------------------------------------------------- ;; Simulate a truth-machine with an input of "1": (interpret-is "is") ;; Simulate a truth-machine with an input of "0": (interpret-is "s" (make-fixed-size-memory 1))