DEV Community

Mohammad Amin Khakzadan
Mohammad Amin Khakzadan

Posted on

introducing a new programming language

I'm designing a new programming language. And I want to write a compiler for that. That will be open source and free and will be hosted here. But I haven't passion and motivation for writing that. so I decided to write a tutorial, and introduce language design and philosophy. So I can get motivated and continue writing that.

I named it, codescript:
codescript is an interpreted, high-level, general-purpose programming language. codescript is a mixture of dynamic typed and static typed language.

the code below is a tutorial that explains the concepts of language by examples. I can't write good English sentences, code examples are the best way for me to explain something.

Maybe I will update this post over time. so check out for updates.

-- comments start with two '-'., and end with a newline.

++
block comments start with two '+', and end with two '+'.
++

**
I'm not sure about block comments, it may be better with two "*".
**

--# statements:

-- `;` can be used to separate statements, but they aren't mandatory.
-- `\n` (newline) will be considered as a statement separator, when needed.

a = 1 + 2
-- or
a =
1 +
2

-- ' ' can be used where you need to beautify your codes. can't be used between
--  digits of a number or letters of a variable name.

a_float = 10    .   3                           -- valid

variable    .   attribute_of_variable = 5       -- valid

a_number = 4493   9283                          -- two integers: 4493, 9283

-- `~` can be used to continue statements.

very_long_ling_long_long_long_long_long_long_long_and_long_variable_name = 10 ~
.30
-- very_..._variable_name = 10.30

--# variable names:

-- variable names must math regex pattern '[_a-zA-Z][_a-zA-Z0-9]*', and they 
--  can't be 'T', 'F', 'N' constants.
-- at start of a file, no variable defined.

-- none of these variables previously defined:

_abc1 = 1       -- valid
abcd = 1        -- valid

if = 1          -- valid
while = 1       -- valid
for = 1         -- valid
else = 1        -- valid

char = 1        -- valid
integer = 1     -- valid
int = 1         -- valid
float = 1       -- valid
string = 1      -- valid
True = 1        -- valid
NULL = 1        -- valid

print = 1       -- valid
puts = 1        -- valid
io = 1          -- valid
sys = 1         -- valid
stdio = 1       -- valid
stdlib = 1      -- valid
stdin = 1       -- valid
system = 1      -- valid

1good = 1       -- invalid
her-b = 1       -- invalid
her_b = 1       -- valid

--# types:

char = 'a'
int = 10
float = 12.3

-- 'T', 'F', 'N' characters are constant values.

bool = T || F
none = N

array = [1, 2, 3]           -- an array of any type
string = "abc"              -- an array of only char type

object = {}

code = #{a = $b}            -- a code object

function => 10;             -- a lazy evaluation, or function
-- or
function = @ => 1;          -- anonymous function

module = [# name]           -- a module, for external files and libraries

--# simple types:

english_first_letter = 'a'
seconds_in_a_year = 60 * 60 * 24 * 365
pi_number = 3.14159265

true = T
false = F
-- and
none = N

-- we can't compare none and booleans

T == F                      -- no error
N == T                      -- error: can't compare N and T

--# length of arrays:

var1 = "Hello"
var1_len = var1.len             -- var1_len = 5

var2 = [1, 2, 3]
var2_len = var2.len             -- var2_len = 3

--# append arrays:

var1 = "Hello"
var1 += " World"                -- var1 = "Hello World"

var2 = [1, 2, 3]
var2 += [4]                     -- var2 = [1, 2, 3, 4]

--# multiply arrays:

var1 = "-" * 5                  -- var1 = "-----"

var2 = "bye" * 3                -- var2 = "byebyebye"

--# defining objects:

-- objects are likes classes or structures, or maybe name spaces.

var1 = {
    name = "John"
    age = 45
}

var1_name = var1.name           -- var1_name = "John"
var1.color = "white"            -- set color attribute of var1

-- can be used for defining temporary variables:

var2 = {                        -- var2 = 160
    sum = 1 + 3 + 5 + 7
    result = sum * 10
}.result

--# defining code object:

define_var = #(var = 10);

define_var;                     

is_ten = (var == 10);           -- is_ten = T

--# defining lazy evaluations or functions:

sum a b => a + b;
-- or
sum = @ a b => (a + b);         -- anonymous function

--# check type of variables:

-- get type of variables by placing a '?' after them. they will be returned as
--  strings.

var = 2.3
var_type = var?                 -- var_type = "float"

var1 = [1, 2, 3]
is_array = (var1? == "array")   -- is_array = T

var2 = [1, 'a', "abc"]

var2_type = var2?               -- var2_type = "array"

-- get full type notation by placing two '?' after them. they will be returned 
--  as strings.

var2_full_type = var2??         -- var2_full_type = "[int, char, string]"

var3 = [[1], [1, 1.0]]
var3_full_type = var3??         -- var3_full_type = "[[int], [int, float]]"

var4 = {
    name = "John"
    age = 30
}
var4_type = var4?               -- var4_type = "object"
var4_full_type = var4??         -- var4_full_type = "{name: string, age: int}"

--# dynamic typed:

var1 = 10
var1 = "Hello"                  -- no error

--# static typed:

int_type value => (value? == "int");

number :: int_type;            -- type declartion
-- or
number :: (number? == "int");   -- same thing
-- or
number :: int_type = 1;          -- type declartion and variable assignment

number = 10                     -- no error
number = "bye"                  -- error: `number` assign assertion failed.

--# program flow:

--# branches:
-- mnemonic:                LABEL:

loop:
end:

--# jump to branches:
-- mnemonic:                -> LABEL

-> loop
-> end

--# conditional branches:
-- mnemonic:                ( CONDITION ): STATEMENT;

(a == N): a = 1;

(a >= 0): 
(
    a = a + 1;
    b = a + 2;
)

--# algorithm examples:

-- check whether a number is even or not

print = [# io].print

is_even num => (num % 2 == 0)

(is_even 10):
(
    print "even"
    -> end
)
print "old"
end:

-- find max number in a list

list = [1, 5, 2, 6, 3, 8, 0]

max = list[0]
index = 1

loop:
(index < list.len):
(
    (list[index] > max): max = list[index];
    index += 1;
    -> loop;
)

Top comments (0)