Gammapedia is archived. No new edits are allowed and no new accounts can be registered.
User:Abwayax/Abwayax programming language/Optimum.abwayax
/**
* Optimum.abwayax * This is the optimal test case. This abwayax script should run flawlessly. * All work put into the abwayax interpreter now should be to get Optimum.abwayax to run flawlessly. * Author: Abwayax * October 28, 2007 */ #use com.abwayax.abwayax.WindowFunctions #use com.abwayax.abwayax.Math #define Twenty-Seven:27
/* Primer on sigil meanings: $ denotes a scalar variable @ denotes an array % denotes a hash * denotes an object & denotes a function
Everything in abwayax is a first-class value, with the exception of namespaces (note to self: might want to reconsider that decision... but would it do any good?)
- /
namespace Shoop { private *singleton;
&Whoop = { // constructor for a Shoop::Whoop object. // Although many might find this awkward, I quite like the separation of instance and namespace members. // Everything that has to do with Shoop::Whoop objects can thenceforth be found in the Shoop::Whoop constructor // instead of scattered all over the Shoop namespace. It almost simulates true class design.
*obj = Object(); // this statement creates the plain object private *obj->lazor = 0; // this adds an private instance field final *obj->charge = { // methods are added the same way as the fields. This must be marked final to prevent it // from being redefined later on. Marking the object itself as final only prevents foreign // code from adding new members, you have to mark each member as final to prevent it from // being redefined *this->lazor++; // *this refers to the object the method lives in }; final *obj->fire = { print("<"); for($i = 0; $i < *this->lazor; $i++) print("-"); print("[SHOOP DA WHOOP]"); for($i = 0; $i < *this->lazor; $i++) print("-"); println(">"); *this->lazor = 0; }; final *obj; // mark the object as final so no more members can be added return *obj;
// Note: Final is used quite liberally within &Shoop(). There is a reason - objects in abwayax are, upon creation, // mutable - members may be defined and redefined on a whim no matter what namespace or function is doing it. // Final objects cannot be modified in this manner, so if you want to make sure the object's implementation // cannot be changed then make it final. };
&Single = { // returns a singleton lazer object if(*singleton == null) *singleton = Whoop(); return *singleton; }; };
- lazor = Shoop::Whoop(); // :: is the scope operator. When :: is used, abwayax first checks user-defined namespaces, then
// then, imported external namespaces (those included with #use or use()), then any external // namespaces in the com.abwayax.abwayax package, then finally it sees if the namespace name // is a fully qualified class name
- lazor->charge(); // -> is the member access operator
- lazor->charge();
- lazor->charge();
- lazor->fire(); // will print out shoop whoop
namespace MoreStuff { private %digits = [ "0" => "zero", "1" => "one", "2" => "two", "3" => "three", "4" => "four", "5" => "five", "6" => "six", "7" => "seven", "8" => "eight", "9" => "nine" ]; // hashes are created using [ ]
&DigitTranslator($arg) = { // abwayax supports a formal parameter list. If &DigitTranslator is called // with exactly one argument, the call goes to this function. DigitTranslator("1") will work // while DigitTranslator("1","2","fred") will either // look for a &DigitTranslator($arg,$arg2,$arg3) or &DigitTranslator with no arg list // &DigitTranslator() creates a function that will only accept an empty arg list. @digs = String::explode("",$arg); // dynamically loads the com.abwayax.abwayax.String external namespace foreach($digit In @digs) // or foreach(@digs As $digit) print(%digits[$digit] + " "); // both arrays and hashes are accessed with [] }; };
MoreStuff::DigitTranslator("53841259");
@vals = [Twenty-Seven,Twenty-Seven + 1,Twenty-Seven + 2,Twenty-Seven + 3]; // macro Twenty-Seven is expanded to read 27 // so this array contains 27,28,29,30
MsgBox(@vals[0]); // calls the com.abwayax.abwayax.WindowFunctions function MsgBox: Twenty-Seven!