*** IMPLEMENTATION ADDENDUM TO THE Z PROGRAMMING LANGUAGE AS DEFINED BY RANDY ROZ ON 08/08/2004 BY RANDY ROZ *** THIS DOCUMENT WILL CLARIFY AMBIGUITIES IN THE OFFICIAL SPECIFICATION TO CREATE A STANDARD Z PROGRAMMING LANGUAGE. THE ORIGINAL SPECIFICATION IS PRESENTED HERE ON LINES BEGINNING WITH A SEMICOLON (";"). IT IS INTERSPERSED WITH COMMENTS TO AID THOSE WISHING TO IMPLEMENT AN INTERPRETER OR COMPILER. THE ORIGINAL SPECIFICATION & THIS MODIFIED VERSION ARE BOTH COPYRIGHT 2004 RANDY COMPTON. ALL RIGHTS RESERVED. YOU HAVE MY PERMISSION TO COPY VERBATIM THIS DOCUMENT. HOWEVER, YOU MAY NOT MODIFY IT, EXCEPT AS NECESSARY TO VIEW IT ON A PARTICULAR PLATFORM (SUCH AS CHANGING THE LINE TERMINATION SEQUENCE). ;*** Z PROGRAMMING LANGUAGE BY RANDY ROZ *** I ALSO MADE THE ORIGINAL SPECIFICATION. ;CREATED 04/11/2004 ;BRACKETS FIXED 04/12/2004 ;MEMSIZE FORMAT & BINARY # EXAMPLE & WHITESPACE & \() CHANGED 08/08/2004 THE SPECIFICATION WENT THOUGH SOME REVISIONS BEFORE REACHING ITS CURRENT STATE. ;WHITESPACE (SPACE,TAB,NL,CR,VT,FF) IS TOTALLY IGNORED (EVEN IN STRINGS) ;PROGRAMS & STRINGS ARE \0-TERMNIATED ;MEMORY IS INITIALLY ZEROED, EXCEPT CELL 0=NUMBER OF CELLS OF MEMORY-1 ;POINTER INITIALLY POINTS AT CELL 1 ;CELLS WITH NEGATIVE INDEX ARE IMPLEMENTATION-DEFINED CELLS WITH NEGATIVE INDEX NEED NOT BE ZEROED INITIALLY, BUT MAY BE. ;\0 RETURN TO CALLING LOCATION (OR QUIT IF AT MAIN LEVEL) THE FOLLOWING 8 INSTRUCTIONS COMPRISE A BRAINF***-COMPATIBLE SUBSET: ;[ JUMP TO JUST AFTER MATCHING ] IF ZERO ;] JUMP TO JUST AFTER MATCHING [ IF NONZERO ;+ INCREMENT ;- DECREMENT ;< DECREMENT POINTER ;> INCREMENT POINTER ;. DISPLAY CHARACTER ;, INPUT CHARACTER ANY FILE CONTAINING UNCOMMENTED BRAINF*** CODE WILL THEREFORE EXECUTE PROPERLY IN Z. IT MUST BE UNCOMMENTED BECAUSE THE COMMENTS MIGHT OTHERWISE CONTAIN OTHER VALID Z CODE. ;( ((X)(Y)Z) REPLACES ALL COPIES OF X IN Y WITH COPIES OF Z ;) SAME NOTES AS ) (EQUIVALENT TO RANDY'S NOTATION) RN IS A SCRIPTABLE SEARCH & REPLACE ENGINE WHICH IS TURING-COMPLETE. ANY FILE CONTAINING UNCOMMENTED RN CODE WILL THEREFORE EXECUTE PROPERLY IN Z. ;@ CURRENT CONTINUATION (NOTE THAT THIS DOES NOT INCLUDE THE CODE STACK) ;# EXECUTE CODE AT POINTER THESE TWO BEHAVE SOMEWHAT LIKE SETJMP/LONGJMP OR CALL-WITH-CURRENT-CONTINUATION, BUT WITHOUT STACK MODIFICATION. ;` QUOTE BEGIN ;' QUOTE END, STORE POINTER STRINGS MUST BE COPIED, AS THEY MUST BE \0-TERMINATED BUT THE ORIGINAL CODE CANNOT BE CORRESPONDINGLY MODIFIED. ;~ CALL CODE AT POINTER (USES HIDDEN CODE STACK) CAN BE USED WITH `' TO IMPLEMENT CALLABLE FUNCTIONS. IT USES THE DATA STACK (NOT SOME HIDDEN CODE STACK). ;\ ESCAPE CHARACTER (ONLY WHEN READING CODE FROM OUTSIDE) ; NEWLINE,RETURN,\BACKSLASH,TAB,SPACE,0NULL,VERTICALTAB,FORMFEED THE WHITESPACE CHARACTERS MUST BE ESCAPED SINCE THEY ARE NOT EVEN READ IN. BACKSLASH MUST BE ESCAPED BECAUSE IT IS THE ESCAPE CHARACTER. NULL IS ALLOWED TO BE ESCAPED BECAUSE SOME PROGRAMS WILL NOT SAVE NULLS IN FILES. ;* GET DATA AT ADDRESS ;& GET ADDRESS OF DATA (CURRENT POINTER VALUE) ;; SET POINTER TO VALUE AT POINTER SIMPLE IMPLEMENTATION OF DATA POINTERS. NOTHING SPECIAL HERE. ;^ PUSH ;_ POP ;% DELETE TOP STACK ELEMENT: `^/__'^`%'*! ;/ SWAP TOP 2 STACK ELEMENTS ;{ POP TOP 2 STACK ELEMENTS & PUSH DIFFERENCE ;| POP TOP 2 STACK ELEMENTS & PUSH NAND ;} POP TOP 2 STACK ELEMENTS & PUSH GREATER THAN TRUTH VALUE ;= POP TOP 2 STACK ELEMENTS & PUSH EQUALITY TRUTH VALUE ;$ DUPLICATE TOP STACK ELEMENT: `^/_^/^/_'^`$'*! ;: POP ADDRESS, STORE DATA AT ADDRESS, RETURN DATA STACK-BASED SUBSET. NOTHING SPECIAL HERE. ;! DEFINE SYMBOL: `CODE'^`S'*! RETURNS CHARACTER CODE FOR S ;? GET SYMBOL DEFINITION: `S'*? RETURNS `CODE' ! SHOULD BE ABLE TO REDEFINE BUILT-IN SYMBOLS & ? SHOULD BE ABLE TO GET DEFINITIONS FOR BUILT-IN SYMBOLS. IF THE DEFINITION GIVEN BY ? IS ASSIGNED USING !, THE RESULTING SYMBOL SHOULD STILL WORK THE SAME WAY. ;" DISPLAY \0-TERMINATED STRING: `^*[._+^*]_'^`"'*! THIS GOES WITH THE `' STRINGS. NOTHING SPECIAL HERE EITHER. ;ALL ELSE NOP UNLESS THEY ARE DEFINED BY CODE. ;EXAMPLES: ;+[,.^[-]-^=$|_] CAT ;+[-,.+] ANOTHER CAT ;`HELLO,\SWORLD!'" HELLO WORLD ;@-" CHEAT QUINE ;@# INFINITE LOOP ;`~'~ CAUSES CODE STACK OVERFLOW ;`^^[-]^{/{_'^`0'*!`0+'^`1'*! BINARY NUMBERS CODE STACK DOES NOT HAVE TO OVERFLOW UPON `~'~ (OR THE SIMPLER @~) IF IT IS INFINITELY LARGE. RANDY'S NOTATION IN Z ALTHOUGH RN IS A SCRIPTABLE SEARCH & REPLACE ENGINE, IT CAN BE USED AS A FUNCTIONAL PROGRAMMING LANGUAGE. ((X)(Y)Z) => EXPRESSION WITH ALL X'S IN Y REPLACED WITH Z'S IF THERE ARE NOT AT LEAST TWO INNER ()-EXPRESSIONS FOLLOWED BY SOME Z CODE, THE INNER CODE SHOULD BE EVALUATED. EXPRESSIONS ARE EVALUATED AT THE LEFTMOST, THEN OUTERMOST, LEVEL POSSIBLE. PLEASE NOTE THAT THERE IS THE POSSIBILITY OF A RN-EXPRESSION RETURNING ANY VALID Z CODE. IF A PROGRAM CONTAINS ONLY RN CODE, THEN ITS OUTPUT SHOULD BE THE FINAL RESULT OF EVALUATING THAT CODE. OTHERWISE, IF EVER USES AN OUTPUT INSTRUCTION, IT SHOULD NOT OUTPUT ITS CODE AS THE RESULT. INTERESTINGLY ENOUGH, Z CONTAINS PROCEDURAL, FUNCTIONAL, & STACK-BASED SUBSETS. FINALLY, ANY IMPLEMENTATION OF Z SHOULD BE ABLE TO RUN MY EXAMPLES CORRECTLY.