Objective LOLCODE

Objective LOLCODE is a rewritten version of LOLCODE, created in 2012, rather with an objective than being pointless. Objective LOLCODE uses extensions with names like the C/C++ header names, but all extensions introduce support for more code which looks like LOLSPEAK.
== Basic Code ==
Just like the standard LOLCODE, Objective LOLCODE has these basic commands when no "CAN HAZ [LIBRARY]?" is included.
Code 	Comment
HAI 	In all LOLCODE programs, HAI introduces the program.
BTW Comment 	Introduces a comment.
CAN HAZ [LIBRARY]? 	Includes the library [LIBRARY].
I HAZ A [VAR] ITZ [VALUE]	Declares a variable and assigns a value to it.
LOL [VAR] R [VALUE] 	Another way of assigning a value to the variable.
 IZ [VAR] [OPERATOR] [VALUE]?
 	YARLY
 		...SOMECODE
 		KTHX
 	NOWAI
 		...SOMECODE
 		KTHX	An if statement (spec 1.0). OPERATOR can be BIGR DEN (>), SMALLR DEN (<) or LIEK (==).
 IM IN YR LUP
 	...SOMECODE
 	KTHX
 IM OUTTA YR LUP	Runs the same code in the "IM IN YR LUP" code block until it goes to a "KTHX" instruction in the code block. An "IM IN YR LUP" code block which never goes to a "KTHX" instruction causes an infinite loop.
KTHXBYE 	KTHXBYE terminates the program.
=== Basic arithmetic ===
Like every non-esoteric programming language, basic arithmetic is part of Objective LOLCODE standards. Here is an example which tests all arithmetic functions
 HAI
 CAN HAZ STDIO?
 I HAZ A TEST ITZ 65 + 48
 IZ TEST LIEK 113?
 	YARLY
 		VISIBLE "Addition test passed"
 		KTHX
 	NOWAI
 		COMPLAIN "Addition test failed"
 		KTHX
 I HAZ A TEST ITZ 65 - 48
 IZ TEST LIEK 17?
 	YARLY
 		VISIBLE "Subtraction test passed"
 		KTHX
 	NOWAI
 		COMPLAIN "Subtraction test failed"
 		KTHX
 I HAZ A TEST ITZ 15 * 5
 IZ TEST LIEK 75?
 	YARLY
 		VISIBLE "Multiplication test passed"
 		KTHX
 	NOWAI
 		COMPLAIN "Multiplcation test failed"
 		KTHX
 I HAZ A TEST ITZ 75 / 5
 IZ TEST LIEK 15?
 	YARLY
 		VISIBLE "Division test passed"
 		KTHX
 	NOWAI
 		COMPLAIN "Division test failed"
 		KTHX
 I HAZ A TEST ITZ 10 ^ 2
 IZ TEST LIEK 100?
 	YARLY
 		VISIBLE "Exponentation test passed"
 		KTHX
 	NOWAI
 		COMPLIAN "Exponentation test failed"
 		KTHX
 I HAZ A TEST ITZ 100√
 IZ TEST LIEK 10?
 	YARLY
 		VISIBLE "Square Root test passed"
 		KTHX
 	NOWAI
 		COMPLAIN "Square Root test failed"
 		KTHX
 KTHXBYE
=== Error handling ===
When commands like "CAN HAZ [LIBRARY]?" are performed, there are "AWSUM THX" and "O NOES" code blocks, for example:
 HAI
 CAN HAZ STDIO?
 	AWSUM THX
 		VISIBLE "Hello World!"
 		KTHX
 	O NOES
 		BTW This means that your LOLCODE implementation is rather a completely pointless implementation which doesn't even have STDIO and there is no way to show the error.
 		KTHX
 KTHXBYE
If instructions that support error handling have no error handling code blocks, it will either continue if it would go to "AWSUM THX" or forcefully terminate the program if it would go to "O NOES".
=== Objects ===
In Objective LOLCODE, of course, there are objects. An object class can be defined like this:
 HAI
 THRZ A NEW THNG CALLD OBJTESTZ
 OBJTESTZ HAZ VAL1Z WICH R INTGERZ
 OBJTESTZ HAZ VAL2Z WICH R STRNGZ
 I HAZ A TEST ITZ A NEW OBJTEST
 TESTZ VAL1 IZ 25
 TESTZ VAL2 IZ "Objective LOLCODE"
 KTHXBYE
To test an object's type:
 HAI
 CAN HAZ STDIO?
 THRZ A NEW THNG CALLD OBJTESTZ
 OBJTESTZ HAZ VAL1Z WICH R INTGERZ
 OBJTESTZ HAZ VAL2Z WICH R STRNGZ
 I HAZ A TEST ITZ A NEW OBJTEST
 IZ TEST LIEK A OBJTEST?
 	YARLY
 		VISIBLE "Type test passed"
 		KTHX
 	NOWAI
 		VISIBLE "Type test failed"
 		KTHX
 KTHXBYE
==== Collection Types ====
Objective LOLCODE, just like non-esoteric programming languages, there are collection types.
A basic collection is initialized with any of the following:
* I HAZ A CLECTUN F [VAR] (creates an empty basic collection)
* I HAZ A CLECTUN F [VAR] WID [VAR1] [VAR2] … N [LAST ITEM IN COLLECTION]
To add an item to a basic collection:
 [ITEM] IZ NOW IN MY CLECTUN F [COLLECTION]
An example of getting an item from a collection:
 HAI
 CAN HAZ STDIO?
 I HAZ A CLECTUN F MYCLECTUN WID 1 2 3 4 5 6 7 8 N 9
 I HAZ A TEST ITZ TEH SCUND DING IN MYCLECTUN
 IZ TEST LIEK 2?
 	YARLY
 		VISIBLE "Collection test passed"
 		KTHX
 	NOWAI
 		VISIBLE "Collection test failed"
 		KTHX
 KTHXBYE
A dictionary can be initialized like this:
* I HAZ A [VAR] DICTUNRY (creates an empty dictionary)
* I HAZ A [VAR] DICTUNRY IN WIZ [KEY1] MENS [VALUE1] [KEY2] MENS [VALUE2] … N [FKEY] MENS [FVALUE]
To add a key and value or change a key to another value:
 IN [DICTUNRY] [KEY] MENS [VALUE]
== Code made available with "CAN HAZ STDIO?" ==
If the line "CAN HAZ STDIO?" is in the beginning of the program, these keywords become available.
Code 	Comment
VISIBLE [STRING] 	Prints STRING to the standard output stream.
USR WUT IZ [VAR]? 	Requests a line from the standard input stream and saves it as a string named VAR
USR WUT IZ [VAR] (1 SYMBL)? 	Requests one character (symbol) from the standard input stream and saves it as a string named VAR
COMPLAIN [STRING] 	Displays STRING in the standard error stream.
PLZ OPEN [VAR] [FILENAME]? (error handling) 	Attempts to open a file with the path in the string named [FILENAME]. If [FILENAME] is a valid path according to the host OS and the file exists, it creates a STDIO FILE named [VAR], sets [VAR]Z TEXT to all the data it reads from the file, checks if the file is writable (if it is, the [VAR]Z TEXT string will be changeable for changing all the data in the file and a [VAR]Z STREAM will be created for adding data to the end of the file, otherwise [VAR]Z TEXT will be a constant attribute) and goes to the "AWSUM THX" block. Otherwise, it goes to the "O NOES" block.
PLZ CREATE [VAR] [FILENAME]? (error handling)	Attempts to create a file named [FILENAME]. If [FILENAME] is a valid path according to the host OS, the file will be created, a writable STDIO FILE object named [VAR] will be created (just like a "PLZ OPEN [VAR] [FILENAME]?" after that) and goes to the "AWSUM THX" block. Otherwise, it goes to the "O NOES" block.
TELL [STREAM] [STRING] 	Writes the data in [STRING] to the STDIO STREAM named [STREAM] - for example:
 HAI
 CAN HAZ STDIO?
 PLZ OPEN FILE "code.lol"?
 	AWSUM THX
 		TELL FILEZ STREAM "BTW I added a comment to this program."
 	O NOES
 		COMPLAIN "This is a null program; it's file does not exist."
 KTHXBYE
PLZ RUN [VAR] [COMMAND]? (error handling) 	Attempts to tell the host OS' shell to run [COMMAND]. If the command is valid and any program the shell tries to run before opening the streams has a valid path to a file that exists, a STDIO PROCESS object named [VAR] will be created and the program will go to the "AWSUM THX" code block. Otherwise, it goes to the "O NOES" code block.STDIO PROCESS objects have three attributes:
* PROCESSZ OUT, a variable string, although not changeable by the Objective LOLCODE program, of everything the process wrote to it's standard output stream.
* PROCESSZ IN, an STDIO STREAM where writing to that stream is just like typing any input in the command-line program (meaning the program which is run as a virtual process).
* PROCESSZ ERR, a variable string, although not changeable by the Objective LOLCODE program, of everything the process wrote to it's standard error stream.
== Code made available with "CAN HAZ STDLIB?" ==
Code 	Comment
I HAZ A [VAR] ITZ A NUMBR BLOW [INT]/LOL [VAR] R A NUMBR BLOW [INT]	Creates an integer named [VAR], it's value is a random number from 0 to ([INT] - 1)Note: Regular Objective LOLCODE implementations should always change the seed for their host's random number generator, if the generator does not change it automatically, before every I HAZ A [VAR] ITZ A NUMBR BLOW [INT]/LOL [VAR] R A NUMBR BLOW [INT] instruction
CAN I HAZ [NEW] A [OLD] AZ [TYPE]? (error handling) 	Attempts to convert [OLD] to the object type [TYPE]. if a conversion is possible, the variable [NEW] will be created with [OLD] converted to [TYPE] and the "AWSUM THX" code block will run. Otherwise, the "O NOES" code block will run.
== Code made available with "CAN HAZ TIME?" ==
Code 	Comment
I HAZ A [VAR] ITZ TEH NIX TIMESTMP F YR CMPUTRZ UPTIME/LOL [VAR] R TEH NIX TIMESTMP F YR CMPUTRZ UPTIME	Creates an integer named [VAR], it's value is the Unix timestamp of how long your computer was on since the last power-on/reboot
I HAZ A [VAR] ITZ TEH NIX TIMESTMP F DA DAT N TIME NOW/LOL [VAR] R TEH NIX TIMESTMP F DA DAT N TIME NOW	Creates an integer named [VAR], it's value is the Unix timestamp of the current date and time
Category:Languages
Category:2012
Category:Turing complete