Научился читать грамматику для bison, нашёл несколько новых для себя мелочей синтаксиса daScript.
1. assume
Аналог #define
в си, текстовая подстановка выражений. Со всеми ее минусами.
var a = "global_string" |
2. =>
Символ стрелки используется для записи коротких блоков/лямбд/безымянных функций:
def radd(var ext:int&; b:block<(var arg:int&):int>):int |
А также для записи создания кортежей и таблиц:
var x <- [[auto 1=>"one"]] //работает также в массивах [[auto 1=>"one"; 2=>"two"]] |
3. auto для инициализации
auto при инициализации может выводить тип массивов (статических и динамических) и кортежей. Для структур — не может
def printType(a) { print("{typeinfo(typename a)}\n"); } |
4. сокращенная запись при обьявлении переменных ссылочных типов
let a = 1
let ar& = a //let ar: int& = a
5. if после выражений
Условие может стоять после определённых выражений (с опциональной веткой else):
def fun |
6. aka
Синоним для имени переменной (как намного менее “злобный” вариант assume
)var a aka b: int
b = 1
print("{a}\n") //1
7. expect
Ключевое слово для тестового фреймворка dasTestexpect 10003:1, 20000:1
//ожидается по одной ошибке компилятора типа 10003 и 20000 (незакрытая кавычка и неожиданный конец файла)
[export]
def test
print("ok
Для запуска теста нужно вызвать скрипт dastest и передает в параметре test
имя скрипт для тестирования (или директории с группой скриптов):daScript dastest.das -- --test my_test.das
8. named arguments
Функцию можно вызвать с явными именами аргументов.
def foo(a:int=13; b: int) |
Также можно скомбинировать первые неименованные аргументы, или вызов через пайп:
def func(a:int; b=1; c=2) |
Больше примеров. Логика выбора — именованные аргументы применяются после неименованных и могут “перекрывать” их.
9. with
with позволяет внутри блока обращаться к полям структуры без явного указания её имени:
struct S |