Beta

Beta is a new language still under development. It is similar to SIMULA, in that it was created in a Scandinavian country and is not used widely anywhere else.

Beta is the underlying language used in the Mjolner ("er" is correct) system. Although the Mjolner system appears to be well documented, it is quite difficult to get the tutorial examples to work. The primary difficulty I had is that no matter what name I chose for my programs Mjolner would reply with "Invalid File Name." The problem is this: No component of the path name of any Mjolner file can contain spaces. This bug (yes BUG) is undocumented and very difficult to diagnose. I was initially trying to create my files on the Windows XP desktop which contains the component "Documents and Settings". You will notice that the Win32 installer for Mjolner does not put the Mjolner files into "Program Files." Now you know why.

The dialect of Beta used by Mjolner is different from the dialect in the documentation. I had to remove all comments from the following code to get it to compile. Furthermore, the documentation states that to create a standalone program you start with "SieveE: @". This doesn't work. The @ causes Mjolner to treat the file as an attributes-only file. Whatever that is.

The on-line Mjolner editor is either very counter-intuitive or virtually non-functional, I can't decide which. I would vote for counter-intuitive, because I can't believe that someone would go to this much trouble to create an inoperative pile of junk.

To give you some idea of how bad it is, I tried to type in the "Hello World" program from the tutorial. After getting rid of the automatically inserted junk like "<<PrefixOpt>>" and "<<AttributeDeclOpt>>" I was left with "(# #)", which is the correct set of delimiters for the Hello World program. Unfortunately, the editor would not allow me to type anything in between the two delimiters. I deleted the delimiters, and it automatically inserted a new set of delimiters "[[ ]]". I could type in between these, but it would not acknowledge the (# #) I typed inside as valid program delimiters, and it would not allow me to delete the "[[ ]]" delimiters. I never did get "Hello World" to work.

Another example is my efforts to fix SieveE.bet in the editor. When I realized that the @ was wrong in my code, I attempted to delete it, however the editor decided that the entire rest of my program was an integral part of the @ sign and refused to let me delete it without erasing my entire program. I was forced to edit the code in the notepad and reload it into Mjolner. Although I could be wrong, I don't think that's how it's supposed to work.

The Beta language, as it stands today (or at least as the documentation stands today), needs some work. There are no looping structures other than the (for for) construct. This construct always does a fixed number of iterations. There is no corresponding (while while) construct, although it certainly wouldn't harm the language any to add it. To do a non-fixed number of iterations, one must use the leave L1 (jump to end of statement labeled L1) or restart L1 (jump to start of statement labeled L1).

As nearly as I can determine, the Mjolner system is something like Visual Basic with Beta serving as the glue language. The documentation is a bit hard to follow, so I can't be absolutely certain of this.

Despite all of this I think it's a really cool looking language.

The following code compiles and runs under the Mjolner system. Open it from the file menu, click the "Build" and "Run" buttons and then check the output in the auxilliary shell window that opened when you opened Mjolner.

(# SieveE: (# candidates: [1000] @integer; i: @integer; j: @integer; do (for i: candidates.range repeat 1->candidates[i] for); 0->candidates[1]; 1->i; L1: (# do (if i>1000 then leave L1; if); L2: (# do (if (i>1000) or (candidates[i] <> 0) then leave L2; if); i + 1 -> i; restart L2; #); (if i>1000 then 2->j; L3: (# do (if i*j > 1000 then leave L3; if); 0->candidates[i*j]; j + 1 -> j; restart L3; #); i + 1 -> i; if); restart L1; #); (for i: candidates.range repeat (if candidates[i] <> 0 then i -> PutInt; ' is prime'->PutLine; if); for); #) do SieveE #)

Click Here for the actual code.