SumaMoito

From Esolang
Jump to: navigation, search

SumaMoito is a collection of languages that aims to include minimal Turing-complete languages with a particular style.

Currently there are three languages in this collection: SumaMoito-Z1, SumaMoito-Z2 and SumaMoito-N.

They have been published in this wiki by User:Atrapado.

SumaMoito-Z1

has the following elements:

a $              # variable declaration. variables are unbounded integers initialized to 0.
a +              # variable increment.
a -              # variable decrement.
a % ...          # loop. execute given block of code (...) while 'a' is not equal to 0.

SumaMoito-Z2

has the following elements:

a $              # variable declaration. variables are unbounded unsigned integers initialized to 0.
a +              # variable increment.
a -              # variable decrement. does nothing if the variable is already 0.
a % ...          # loop. execute given block of code (...) while 'a' is not equal to 0.

SumaMoito-N

has the following elements:

a $              # variable declaration. variables are unbounded unsigned integers initialized to 0.
a +              # variable increment.
a =              # variable reset. set variable to value 0.
a b % ...        # loop. execute given block of code (...) while 'a' not equals 'b'.

Computational class

SumaMoito-Z2 has been proven Turing complete by simulation of Bitwise Cyclic Tag. The details required to construct the interpreter can be found in the log of #esoteric for 8 January, 2012.

SumaMoito-N has been proven Turing complete by reducting SumaMoito-Z2 to SumaMoito-N. Below is the proof.

Z2--------------N
block           block
declaration     declaration
increment       increment
decrement       dec1 (see decrement examples below)
a % ...         zero $ a zero % ...

SumaMoito-Z1 is also Turing complete, proven by reducting Sumamoito-Z2 to SumaMoito-Z1. Below is the proof.

Z2--------------Z1
block           block
declaration     declaration
increment       increment
decrement       dec3 (see decrement examples below)
loop            loop

Language development

  • Tokens are separated by whitespace.
  • Nesting can be expressed with indentation.
  • Alternative format with '{' and '}' instead of indentation.
  • There are procedures, which may have arguments.
  • Argument passing is by reference; any procedure argument can be used for input and output.
  • Procedures are declared with the name of the procedure, followed by arguments, followed by '@'
  • Procedure calls are defined with the name of the procedure, followed by arguments, followed by '!'
  • Variable declarations can appear anywhere (before using) and its scope begins in the previous '{' and ends in the matching '}' (or corresponding indentation); a variable can not be declared twice in the same scope; declaring the same variable name in different (overlapping or not) scopes of the same procedure has been not decided whether it is allowed or not.
  • In principle it is not valid to mix code from the different languages (-Z1 -Z2 -N) neither call procedures from one language to another.

Code examples

Copy

Copy the value from one variable to another without destroying the first one.

SumaMoito-Z2 code:

copy1 a b @
    c $
    b %
        b -
    a %
        a -
        b +
        c +
    c %
        c -
        b +
        a +

SumaMoito-N code:

copy2 a b @
    b =
    a b %
        b +

Add

Add two values onto a third one

SumaMoito-Z2 code:

sum3a a b c @
    e $
    f $
    g $
    copy1 a e !
    copy1 b f !
    copy1 g c !
    e %
        c +
        e -
    f %
        c +
        f -

SumaMoito-N code:

sum3b a b c @
    d $
    c =
    c a %
        c +
    d b %
        c +
        d +

Add one value to another

SumaMoito-Z2 code:

sum2a a b @
    e $
    copy1 a e !
    e %
        b +
        e -

SumaMoito-N code:

sum2b a b @
    d $
    d a %
        b +
        d +

Multiply

SumaMoito-N code:

mult3 a b c @
    d $
    c =
    d a %
        sum2b b c !
        d +

Decrement

SumaMoito-N code:

dec1 a @
    tmp $
    a tmp %
        b $
        c $
        b +
        b a %
            b +
            c +
        a =
        a c %
            a +
            tmp +
dec2 in out @
    temp $
    out =
    in temp %
        copy2 in temp !
        tmp $
        tmp +
        tmp in %
            out +
            tmp +

SumaMoito-Z1 code (decrement if greater than 0; only works for positive or 0 values):

dec3 a @
    tmp1 $
    tmp2 $
    a %
        tmp1 +
        tmp2 +
        a -
    tmp1 %
        tmp1 -
        a +
    tmp2 %
        tmp2 %
            tmp2 -
        a -