Put the misc. stuff in the top dir.
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
|
@ -0,0 +1,290 @@
|
|||
#+title: MagicNG
|
||||
#&summary
|
||||
The Next Generation Programming Language
|
||||
#&
|
||||
#+license: bysa
|
||||
#&toc
|
||||
|
||||
* Chapter 1: The Future of Yesterday
|
||||
|
||||
/Software./
|
||||
|
||||
/Magic./
|
||||
|
||||
Two seemingly unrelated words. Yet together they form the essentials of the new
|
||||
programming language which has already changed how computers and humans interact
|
||||
with each other: *MagicNG* (short for Magic: The Next Generation).
|
||||
|
||||
*MagicNG* is not your common programming language; it is not biased towards one
|
||||
or two paradigms, in fact it uses none of the existing ways of programming:
|
||||
|
||||
+ Functional programming is, naturally, much too functional for any magic-based
|
||||
programming language, as magic is not /functional/, but
|
||||
/magical/. Magic-based software does not require functionality as in something
|
||||
being able to do something else, because it depends on magic which /does/
|
||||
stuff instead of making sure that /stuff/ can be done; this makes using a
|
||||
computer much faster.
|
||||
+ Object-oriented programming does not fit very well with the ideas behind
|
||||
*MagicNG* either. While the magic-oriented approach /is/ able to properly
|
||||
emulate object-oriented ways of doing things, such emulations will often
|
||||
require {CMU&abbr='Central Magical Unit'}-expensive conversions from spell
|
||||
scrolls to object-based representations.
|
||||
+ Procedural programming conflicts with the nature of magic; since in the case
|
||||
of magic, advanced heuristics are used run a program, the simple approach of
|
||||
procedurally executing commands pales in comparison to the magical
|
||||
approach. The same is true for assembly programming and machine programming.
|
||||
+ Logic programming is mute. Magic is always above logic. Logic is based on
|
||||
magic. Everyone knows that.
|
||||
+ Declarative programming is actually the only one of the existing widespread
|
||||
paradigms which is even slightly like *magical programming*. Declarative
|
||||
programming languages do, however, still base their entire existence on
|
||||
deduction and knowledge, both of which are infinitely long below the
|
||||
standards of magical programming languages. Deduction and knowledge are for
|
||||
programming languages that do not /see/ how everything works, whose authors
|
||||
do not understand the connectionabilities of everything.
|
||||
|
||||
In short, *MagicNG* employs the *magical programming* paradigm because it is
|
||||
superior to non-magical approaches.
|
||||
|
||||
|
||||
** But how do I program in it?
|
||||
|
||||
The reader should now be comfortable thinking about programming in terms of
|
||||
magic and be able to see what a big mistake it was to learn all those outdated,
|
||||
logic-based programming languages. The reader might also be a little
|
||||
overwhelmed and perhaps confused; but fear not, we will soon take a look at an
|
||||
example of MagicNG programming.
|
||||
|
||||
Before we get to that, we will go over a few (yes, there are many more) of the
|
||||
applications of magical programming, to pique the reader's curiosity.
|
||||
|
||||
1. First, there is the temporal improvement. Since magic is independent of the
|
||||
flow of time, a program can be run not just everywhere, but
|
||||
every{/when/}. This is the sole reason MagicNG is already so popular ---
|
||||
someone spread its use many years ago, through several temporal-offset
|
||||
MagicNG runs.
|
||||
2. Speed. The Central Magical Unit runs programs magically many times faster
|
||||
than any CPU in existence. This is possible due both to the previously
|
||||
explained effects of magic in programming /and/ what we will come to refer
|
||||
as "magic downleveling" in later chapters (since magic cannot be optimized,
|
||||
other approaches such as the downleveling approach have been developed).
|
||||
3. Code maintenance also becomes much easier, as you will see in the examples
|
||||
and excercises.
|
||||
|
||||
Now, to our first example. We wish to print to a computer console (on a magical
|
||||
computer) the magical string "Hello, world!". This is often accomplished in
|
||||
anything from 1 to 100 conventional lines in conventional programming
|
||||
languages; in MagicNG, it is not /that/ simple. It's another kind of simple,
|
||||
namely the /magic simple/ way, from now on referred to as the /magple/ way.
|
||||
|
||||
To write the magple MagicNG code for this example, we first fire up our MagicNG
|
||||
interactive interpreter:
|
||||
|
||||
#+BEGIN_SRC text
|
||||
MagicNG vX
|
||||
?
|
||||
#+END_SRC
|
||||
|
||||
(MagicNG is not being developed because it relies on magic for updates, hence
|
||||
the 'X' version.)
|
||||
|
||||
(The correct way to program in MagicNG is to write on pergament scrolls, but
|
||||
for the beginner it is often easier to write the magical expressions on one's
|
||||
computer and then print afterwards.)
|
||||
|
||||
The =?= at the prompt means we can type something. Let us try typing the
|
||||
following:
|
||||
|
||||
#+BEGIN_SRC text
|
||||
? one frog eye
|
||||
#+END_SRC
|
||||
|
||||
What this tells the MagicNG interpreter is that if /it is not the case/ that no
|
||||
frog eyes exist in the programmer's vicinity, it will print "Hello,
|
||||
world!". The frog-eye detection is only a formality, included in MagicNG to
|
||||
make the proofs of magical truth be magically true, and so the sentence can be
|
||||
excluded if the programmer wishes so. That is, you could write
|
||||
|
||||
#+BEGIN_SRC text
|
||||
t
|
||||
#+END_SRC
|
||||
|
||||
which is short for "one frog eye", and it would have the same effects.
|
||||
|
||||
MagicNG programs can be compiled (printed) to scrolls, which can then be used
|
||||
independently of a running magical computer.
|
||||
|
||||
(Trivia: This was in fact one of the major reasons why the text-based nature of
|
||||
MagicNG was chosen over the two other proposed ways of programming: speech and
|
||||
jumping. While speech had the advantage that it worked well for people who had
|
||||
difficulties writing, history had shown that the human memory was not a good
|
||||
place to store information not meant to be changed. And while jumping was good
|
||||
for people who were only good at jumping, it was too radical an approach for
|
||||
many of the language designers.)
|
||||
|
||||
Now, it may not be obvious to the casual non-magician why and how both "one
|
||||
frog eye" and "t" eventually prints "Hello, world!". In fact, these two
|
||||
expressions are not at all the only ways to print "Hello, world!" --- one can
|
||||
also write "traveller with seven legs", "spider queen", or something
|
||||
similar. The thing to remember is that it is /the intention/ that counts. If
|
||||
you /feel/ that the expression "bonsai of Norway" prints the sum of all
|
||||
prime numbers below 4012, then /that is what it does/.
|
||||
|
||||
In essence, MagicNG is an *intention-based programming language*. This might at
|
||||
first sound like all other programming languages: You have an intention on
|
||||
which you base your programming. The difference here is that the intention /is/
|
||||
the programming and not just part of it. Once you have figured out what you
|
||||
want and written it down in your inner language, magic takes care of the boring
|
||||
stuff.
|
||||
|
||||
This has the side-effect that all magic is somewhat personal; a scroll written
|
||||
by an individual A might yield different results if used by an individual B
|
||||
with different intentions than A.
|
||||
|
||||
This means that MagicNG has *built-in encryption*.
|
||||
|
||||
At this point some might note that this is not good for interoperability. At
|
||||
the core of MagicNG, this is true. However, one extraordinary extension has
|
||||
been made to MagicNG that makes interoperability both possible and easy:
|
||||
MagicIS (short for Magic Intention Serializer).
|
||||
|
||||
MagicIS encodes your intention in a magical format, after which the intention
|
||||
is compiled along with your program. With MagicIS, a compiled program that
|
||||
prints "My name is Niels" might look like this (imagine it compiled on a
|
||||
scroll):
|
||||
|
||||
#+BEGIN_SRC text
|
||||
Holy oak of honey
|
||||
,si:pmnin34_=UUe
|
||||
#+END_SRC
|
||||
|
||||
where the =,si:= part denotes the start of the serialized intention.
|
||||
|
||||
The MagicIS extension can be enabled on most MagicNG compilers with a
|
||||
command-line option. Note that it will need to be connected to your brain with
|
||||
a special magical interface to work.
|
||||
|
||||
|
||||
* Chapter 2: Real World Examples
|
||||
|
||||
"This is all very nice," you might think, "but what is it any good for?"
|
||||
|
||||
MagicNG can be used for everything a typical, non-magical language can be used
|
||||
for, the major differences being that MagicNG is per definition faster, better
|
||||
and easier to program in. This has been magically proven.
|
||||
|
||||
** cat
|
||||
|
||||
Consider the UNIX =cat= program. If written in C (even if you look at the Plan
|
||||
9 version), there are many lines of source code. If written in Python 3, there
|
||||
are 2 lines:
|
||||
|
||||
#+BEGIN_SRC python3
|
||||
for line in open(filename):
|
||||
print(line)
|
||||
#+END_SRC
|
||||
|
||||
If written in MagicNG, there is _one_ line (/and/ it is magical):
|
||||
|
||||
#+BEGIN_SRC text
|
||||
cauldron of candy
|
||||
#+END_SRC
|
||||
|
||||
(without MagicIS enabled.)
|
||||
|
||||
|
||||
** Finding a value when a key is known
|
||||
|
||||
In a non-magical programming language, you could use a hash map. Or you could
|
||||
sort the elements by their keys and use binary search. Or you could look
|
||||
through every element one by one.
|
||||
|
||||
In MagicNG, no such algorithms are used; /magic/ finds the value. In fact, this
|
||||
reveals a large, fascinating and unavoidable part of MagicNG: it does not
|
||||
support algorithms.
|
||||
|
||||
"No algorithms? But how, then, can I program?" you think. The answer is simple,
|
||||
and it has been explained before, but to stress it one last time: /magic/.
|
||||
|
||||
This leads us to another important part of MagicNG: its use of the *black box
|
||||
model*. The /black box model/ has been revered all over the known universe for
|
||||
its unchangeability (it is absolute), unworsenability (since you cannot change
|
||||
it, you cannot make it worse), high surprise factor ("who knew my program could
|
||||
do /that/?!"), and lack of meaningful error messages (no errors, no worries).
|
||||
|
||||
|
||||
** Calculating the sum of a list of numbers
|
||||
|
||||
In C:
|
||||
|
||||
#+BEGIN_SRC c
|
||||
int sum(int xs[], int xs_len) {
|
||||
int fin_sum = 0;
|
||||
int i;
|
||||
for (i = 0; i < xs_len; i++) {
|
||||
fin_sum += xs[i];
|
||||
}
|
||||
return fin_sum;
|
||||
}
|
||||
|
||||
[...]
|
||||
|
||||
sum({1, 3, -2, 9}, 4);
|
||||
#+END_SRC
|
||||
|
||||
In Python:
|
||||
|
||||
#+BEGIN_SRC python3
|
||||
sum([1, 3, -2, 9])
|
||||
#+END_SRC
|
||||
|
||||
In MagicNG:
|
||||
|
||||
#+BEGIN_SRC text
|
||||
head of Macbeth
|
||||
#+END_SRC
|
||||
|
||||
|
||||
** A flight simulator
|
||||
|
||||
Up until now, we have only looked at MagicNG programs spanning single
|
||||
lines. One can create a very powerful MagicNG program in one line, but
|
||||
sometimes it can be necessary to use two, or even three lines.
|
||||
|
||||
As a flight operator, you may wish to have a very durable and efficient 3D
|
||||
flight simulator; in MagicNG such a system can be written concisely in just
|
||||
three lines of magical code (four lines with MagicIS enabled).
|
||||
|
||||
#+BEGIN_SRC text
|
||||
dragon claw polished with golden mead
|
||||
mead in cauldron
|
||||
tastebuds of 23 pigs
|
||||
,si:3=)uUUn!2aa
|
||||
#+END_SRC
|
||||
|
||||
(Notice the indentation and the explicit number.)
|
||||
|
||||
|
||||
/[Chapters 3 through 88 have been excluded in this preview. Only members of
|
||||
the Magically Magical Magic Community (MMMC) have access to these chapters.]/
|
||||
|
||||
|
||||
* Chapter 89: How to Learn More
|
||||
|
||||
To recap: MagicNG is an easy language to learn, since not only does it not
|
||||
require the user to learn about algorithms, data structures and related wastes
|
||||
of time, but actually discourages that; MagicNG encourages its users to /not
|
||||
think/ which /reduces errors/.
|
||||
|
||||
To expand your knowledge of MagicNG, both in theory and practice, do not look
|
||||
at the examples of other MagicNG programmers, unless you are *absolutely sure*
|
||||
that their intentions are the same as yours. You can of course deduce the
|
||||
intention from a MagicIS line, but then, if you wish to base a new program on
|
||||
the old program, you will have to convert that intention to your own along with
|
||||
the actual program, which can be tedious and very difficult (MagicNG is
|
||||
actually a very complex language).
|
||||
|
||||
What you should do is lean back in a comfy chair and look into nothingness and
|
||||
not strain your mind. That way, everything you need to know will come to you
|
||||
eventually. That's how this book was written.
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
#+title: Writings
|
||||
#+summary: A list of my writings
|
||||
|
||||
* Writings
|
||||
|
||||
#++eval
|
||||
#+BEGIN_SRC python
|
||||
macros.list_pages()
|
||||
#+END_SRC
|
||||
|
||||
** Pseudo-writings
|
||||
|
||||
+ <@eval macros.titlelink('/projects/magicng/')@>
|
||||
|
||||
|
||||
** Old
|
||||
|
||||
+ [[http://projects.metanohi.name/eonaton/?t=0&s=5][Eon Aton]] (both a story and an unfinished game)
|
||||
|
||||
|
||||
** Purposely crappy
|
||||
|
||||
+ [[./potator/][POTATORR!]]
|
After Width: | Height: | Size: 65 KiB |
|
@ -0,0 +1,16 @@
|
|||
#+title: My NanoNote
|
||||
#&summary
|
||||
I have a NanoNote.
|
||||
#&
|
||||
#+license: bysa
|
||||
|
||||
* My NanoNote
|
||||
|
||||
#&img;url=glorious-nanonote.jpg, alt=Glorious NanoNote, center
|
||||
|
||||
I own a [[http://sharism.cc/][NanoNote]]. I think it's
|
||||
cool (though I haven't found much use for it yet). The default NanoNote
|
||||
distro comes with an [[http://openwrt.org/][OpenWRT]]-based. It's also possible to run Debian on it
|
||||
(with only 32 MiB RAM..), but it's slow.
|
||||
|
||||
(Originally, this page was meant to have a purpose.)
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 442 KiB After Width: | Height: | Size: 442 KiB |
Before Width: | Height: | Size: 139 KiB After Width: | Height: | Size: 139 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 396 KiB After Width: | Height: | Size: 396 KiB |
Before Width: | Height: | Size: 609 KiB After Width: | Height: | Size: 609 KiB |
Before Width: | Height: | Size: 359 KiB After Width: | Height: | Size: 359 KiB |
Before Width: | Height: | Size: 321 KiB After Width: | Height: | Size: 321 KiB |
Before Width: | Height: | Size: 460 KiB After Width: | Height: | Size: 460 KiB |
Before Width: | Height: | Size: 227 KiB After Width: | Height: | Size: 227 KiB |
Before Width: | Height: | Size: 437 KiB After Width: | Height: | Size: 437 KiB |
Before Width: | Height: | Size: 586 KiB After Width: | Height: | Size: 586 KiB |
Before Width: | Height: | Size: 426 KiB After Width: | Height: | Size: 426 KiB |
Before Width: | Height: | Size: 473 KiB After Width: | Height: | Size: 473 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |