Package | Line Rate | Health |
---|---|---|
Interpreter.Lib | 40% | ❌ |
Interpreter | 100% | ✔ |
Summary | 43% (925 / 2173) | ❌ |
Minimum allowed line rate is 80%
За основу был взят стандарт ECMA-262
Реализовать JavaScript с объектами и статической структурной типизацией, избавившись от таких понятий, как constructor
, class
, interface
В языке структурная статическая сильная типизация.
Есть 5 примитивных типов:
- number
- boolean
- string
- null
- void
Остальные типы делятся на группы:
- NullableType (тип, который допускает значение
null
) - ObjectType (тип объекта, является NullableType)
- ArrayType (списковый тип)
- FunctionType (тип функции)
Тип | Значение |
---|---|
number | 0 |
boolean | false |
string | "" |
NullableType | null |
ArrayType | [] |
Можно создать свой type alias по типу того, как это сделано в С++
type int = number
type maybeInt = int?
type ints = int[]
type point = {
x: int;
y: int;
}
type handleInts = (ints) => void
type handler = {
items: ints;
handle: handleInts;
}
let i = 1 // интерпретатор выведет тип из выражения
let j: number // запишет значение по умолчанию в переменную
let k: number = 1 // полностью явное объявление
let v2d = {
// обычное поле
x: 3;
y: 4;
//метод
lengthSquared => () {
// в методе доступны поля объекта
// и указатель this
return x * x + y * y
};
}
let array = [1, 2, 3]
let size = ~array // длина списка
array::1 // удаление элемента по индексу
array = array ++ [5, 7] // конкатенация списков
Оператор | Вид | Типы операндов | Тип операции |
---|---|---|---|
+ | бинарный | оба number, оба string | number, string |
*, -, /, % | бинарный | number | number |
||, && | бинарный | boolean | boolean |
!=, == | бинарный | равный с двух сторон | boolean |
<=, >=, >, < | бинарный | number | boolean |
! | унарный | boolean | boolean |
- | унарный | number | number |
++ | бинарный | [] | [] |
:: | бинарный | [] и number | void |
~ | унарный | [] | number |
if (1 == 1) {
// ...
} else if (2 == 2) {
// ...
}
else {
// ...
}
// в общем как в Си подобных языках
// главное, чтобы выражение условия
// возвращало boolean
Также есть тернарный оператор
let x = 1 > 0 ? 0 <= 1 ? 1 : 0 : -2 < 0 ? -1 : 0
while (cond) {
// ...
continue
// ...
break
}
// объявление
function add(a: number, b: number): number {
return a + b
}
// вызов
let c = add(1, 2)
// объекты
let x = v2d.x
let s = v2d.lengthSquared()
// массивы
let l = array[2]
let s = v2d as string
- Функция
print
c сигнатурой(string) => void
; осуществляет печать строки на экран
- .NET 7 SDK
После клонирования репозитория идём в папку проекта Interpreter
.
Там выполняем команду:
dotnet publish -r <RUNTIME_IDENTIFIER> -p:PublishSingleFile=true -p:DebugType=embedded --self-contained false -o <OUTPUT_DIRECTORY>
Список идентификаторов рантайма лежит тут
Interpreter 1.2.6
Copyright (C) 2022 Interpreter
USAGE:
Simple interpretation call:
Interpreter file.js
Request dump:
Interpreter --dump file.js
-d, --dump (Default: false) Show dump data of interpreter
--help Display this help screen.
--version Display version information.
InputFilePath (pos. 0) Required. Path to input file