Files
centvrion/README.md
NikolajDanger 48e8bf97fb
2022-06-16 17:37:07 +02:00

6.8 KiB

About

CENTVRION is the programming language for the modern roman.

Documentation

Example code

Hello World

DESIGNA x VT "Hello World!"
DICE x

Recursive Fibonacci number function

DEFINI fib(x) VT {
    SI x EST NVLLVS TVNC {
        REDI(NVLLVS)
    } ALVID SI x EST I TVNC {
        REDI(I)
    } ALVID {
        REDI(INVOCA fib(x-II) + INVOCA fib(x-I))
    }
}

Number guessing game

CVM FORS

DESIGNA correct VT FORTIS_NVMERVS(I,C)
DESIGNA gvess VT NVLLVS

DVM FALSITAS FACE {
    DESIGNA gvess VT AVDI_NVMERVS()
    SI gvess MINVS correct TVNC {
        DICE("Too low!")
    } ALVID SI gvess PLVS correct TVNC {
        DICE("Too high!")
    } ALVID {
        ERVMPE
    }
}

DICE("You guessed correctly!")

Variables

Variables are set with the DESIGNA and VT keywords. Type is inferred.

DESIGNA x VT XXVI

Variable can consist of lower-case letters, numbers, as well as _.

Data types

NVLLVS

NVLLVS is a special kind of data type in CENTVRION, similar to the null value in many other languages. NVLLVS can be 0 if evaluated as an int or float, or an empty string if evaluated as a string. NVLLVS cannot be evaluated as a boolean.

Strings

Strings are written as text in quotes (' or ").

DESIGNA x VT "this is a string"

Integers

Integers must be written in roman numerals using the following symbols:

Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

Each of the symbols written by themself is equal to the value of the symbol. Different symbols written from largest to smallest are equal to the sum of the symbols. Two to three of the same symbol written consecutively is equal to the sum of those symbols (only true for Is, Xs, Cs or Ms ). A single I written before a V or X is equal to 1 less than the value of the second symbol. Similarly, an X written before a L or C is 10 less than the second symbol, and a C written before a D or M is 100 less than the second symbol.

Because of the restrictions of roman numerals, numbers above 3.999 are impossible to write in the base CENTVRION syntax. If numbers of that size are required, see the MAGNVM module.

The number 0 can be expressed with the keyword NVLLVS.

Negative numbers

Negative numbers can be expressed as NVLLVS minus the value. For an explicit definition of negative numbers, see the SVBNVLLA module.

Floats

The base CENTVRION syntax does not allow for floats. However, the FRACTIO module adds a syntax for fractions.

Booleans

Booleans are denoted with the keywords VERITAS for true and FALSITAS for false.

Arrays

Arrays are defined using square brackets ([]) and commas (,). An array of integers can also be initialized with the VSQVE keyword:

DESIGNA x VT [1 VSQVE 10]

Conditionals

SI/TVNC

If-then statements are denoted with the keywords SI (if) and TVNC (then). Thus, the code

DESIGNA x VT VERITAS
SI x TVNC {
    DICE(I)
    REDI(NVLLLVS)
}

DICE NVLLVS

> I

Will return I (1), as the conditional evaluates x to be true.

Boolean expressions

In conditionals, EST functions as an equality evaluation, and MINVS (<) and PLVS (>) function as inequality evaluation.

ALVID

When using SI/TVNC statements, you can also use ALVID as an "else".

DESIGNA x VT VERITAS
SI x TVNC {
    DICE(I)
} ALVID {
    DICE(NVLLVS)
}

> I

SI statements may follow immediately after ALVID.

DESIGNA x VT II
SI x EST I TVNC
    DICE(I)
ALVID SI x EST II TVNC
    DICE(II)
ALVID
    DICE(III)

> II

Boolean operators

The keyword ET can be used as a boolean "and". The keyword AVT can be used as a boolean "or".

DESIGNA x VT VERITAS
DESIGNA y VT FALSITAS
SI x ET y TVNC {
    DICE(I)
} ALVID SI x AVT y TVNC {
    DICE(II)
} ALVID {
    DICE(III)
}

> II

Loops

DONICVM loops

DESIGNA x VT NVLLVS
DONICVM y VT NVLLVS VSQVE X FACE {
    DESIGNA x VT x + y
}
DICE(x)

> XLV

DVM loops

DESIGNA x VT NVLLVS
DVM x PLVS X FACE {
    DESIGNA x VT x+I
}
DICE(x)

> XI

PER loops

DESIGNA x VT [I, II, III, IV, V]
PER y IN x FACE {
    DICE(y)
}

> I
> II
> III
> IV
> V

Functions

Functions are defined with the DEFINI and VT keywords. The REDI keyword is used to return. REDI must have exactly one parameter. REDI can also be used to end the program, if used outside of a function.

Calling a function is done with the INVOCA keyword.

DEFINI square x VT {
    REDI(x*x)
}

DICE(INVOCA square(XI))

> CXXI

Built-ins

DICE

AVDI

AVDI_NVMERVS

ERVMPE

LONGITVDO

Modules

Modules are additions to the base CENTVRION syntax. They add or change certain features. Modules are included in your code by having

CVM %MODVLE NAME%

In the beginning of your source file.

Vnlike many other programming languages with modules, the modules in CENTVRION are not libraries that can be "imported" from other scripts written in the language. They are features of the compiler, disabled by default.

FORS

CVM FORS

The FORS module allows you to add randomness to your CENTVRION program. It adds 2 new built-in functions: FORTIS_NVMERVS int int and FORTIS_ELECTIONIS ['a].

FORTIS_NVMERVS int int picks a random int in the (inclusive) range of the two given ints.

FORTIS_ELECTIONIS ['a] picks a random element from the given array. FORTIS_ELECTIONIS array is identical to array[FORTIS_NVMERVS NVLLVS ((LONGITVDO array)-I)].

FRACTIO

CVM FRACTIO

The FRACTIO module adds floats, in the form of base 12 fractions.

In the FRACTIO module, . represents 1/12, : represents 1/6 and S represents 1/2. The symbols must be written from highest to lowest. So 3/4 would be written as "S:.".

Fractions can be written as an extension of integers. So 3.5 would be "IIIS".

The symbol | can be used to denote that the following fraction symbols are 1 "level down" in base 12. So after the first |, the fraction symbols denote 144ths instead of 12ths. So 7 and 100/144 would be "VIIS:|::", as "7 + 100/144" is also "7+8/12+4/144".

A single "set" of fraction symbols can only represent up to 11/12, as 12/12 can be written as 1.

MAGNVM

CVM MAGNVM

MAGNVM adds the ability to write integers larger than MMMCMXCIX (3.999) in your code, by adding the thousands operator, "_".

When _ is added after a numeric symbol, the symbol becomes 1.000 times larger. The operator can be added to the same symbol multiple times. So "V_" is 5.000, and "V__" is 5.000.000. The strict rules for integers still apply, so 4.999 cannot be written as "IV_", but must instead be written as "MV_CMXCIX".

All integer symbols except I may be given a _.

SVBNVLLA

CVM SVBNVLLA

The SVBNVLLA module adds the ability to write negative numbers as -II instead of NVLLVS-II.