Системные макросы
DSL
Особенности ассоциативной памяти
Синтаксис языка NewLang основан на строгих правилах без использования ключевых слов, и как бы он не выглядел логичным, ассоциация по ключевым словам вспоминается гораздо легче, например if, чем комбинация минус минус правая угловая скобка –>. Из-за этого имеет смысл использовать не “чистый” базовый синтаксис, а более привычный диалект с использованием ключевых слов.
Синтаксис на ключевых словах
В файле dsl.nlp находится набор макросов, которые расширяют базовый синтаксис NewLang, основанный на правилах, набором предопределенных ключевых слов как в классических языках программирования. А при необходимости, их можно адаптировать или дополнить под собственную предметную область.
Константы
Логические
- true - 1
- yes - 1
- false - 0
- no - 0
Системные имена
- this - Текущий объект ($0)
- parent - Родительский объект ($$)
- last - Результат выполнения последнего оператора ($^)
!!!!!!!!- args - Все аргументы функции ($*)
!!!!!!!!- sys - Системный контекст запущенной программы (@@) !!!!!!!!- current - Текущий модуль (@$) !!!!!!!!- cmd - Все аргументы выполняющегося приложения из командной строки (@*)
!!!!!!!!!!1### Типовые функции и проверки !!!!!!!!!!- run(‘filename’) - Выполнить указанный файл (@@(‘filename’)) !!!!!!!!!!- ifmain - Проверка, если текущий модуль основной ([@$.$0] –> { … }) !!!!!!!!!!- ifload - Проверка, если текущий модуль загружается впервые ([@$.load] –> { … })
Операторы
-
match(cond) - Оператор оценки выражения
-
if(…) - Первый условный оператор ([$*]–> { … })
-
elif(…) - Второй и все последующие (,[$*]–> { … })
-
else - Оператор иначе (,[_]–> { … })
-
while(cond) - Оператор цикла с предусловием ([@$cond] <-> { … } )
-
dowhile(cond) - Оператор цикла с постусловием ({ … } <->[@$cond])
-
iter(obj, … ) - Создание итератора ( @$obj ? (@$*) )
-
next(obj, … ) - Следующий элемент итератора ( @$obj ! ($*) )
-
curr(obj, … ) - Текущий элемент итератора ( @$obj !? ($*) )
-
first(obj) - Перейти на первый элемент итератора ( @$obj !! )
-
all(obj) - Получить сразу все элементы итератора ( @$obj ??)
Прерывания
-
return - Положительное прерывание (++)
-
return(…)- Положительное прерывание с возвратом значения (++ @$value ++)
-
error - Отрицательное прерывание (--)
-
error(…) - Отрицательное прерывание с возвратом значения (-- @$value --)
-
break+ и break- - Выход из цикла:
while(...) {+
++ :Break ++
+}
while(...) {-
-- :Break --
-}
- continue+ и continue- - В начало цикла:
while(...) {+
++ :Continue ++
+}
while(...) {-
-- :Continue --
-}
obj { .field = 1; .prop(); };
#Python
1) without using with statement
file = open(‘file_path’, ‘w’) file.write(‘hello world !’) file.close()
2) without using with statement
file = open(‘file_path’, ‘w’) try: file.write(‘hello world’) finally: file.close()
open(‘file_path’, ‘w’) { .write(‘hello world !’); .close(); }
Python3
using with statement
with open(‘file_path’, ‘w’) as file: file.write(‘hello world !’)
a simple file writer object
class MessageWriter(object): def init(self, file_name): self.file_name = file_name
def __enter__(self):
self.file = open(self.file_name, 'w')
return self.file
def __exit__(self, *args):
self.file.close()
using with statement with MessageWriter
with MessageWriter(‘my_file.txt’) as xfile: xfile.write(‘hello world’)
a simple file writer object
:MessageWriter { def init(self, file_name): self.file_name = file_name
def __enter__(self):
self.file = open(self.file_name, 'w')
return self.file
def __exit__(self, *args):
self.file.close()
}
using with statement with MessageWriter
MessageWriter(‘my_file.txt’) { .write(‘hello world’); };
from contextlib import contextmanager
class MessageWriter(object): def init(self, filename): self.file_name = filename
@contextmanager
def open_file(self):
try:
file = open(self.file_name, 'w')
yield file
finally:
file.close()
usage
message_writer = MessageWriter(‘hello.txt’) with message_writer.open_file() as my_file: my_file.write(‘hello world’)
:MessageWriter(object) { def init(self, filename): self.file_name = filename
@contextmanager
def open_file(self):
try:
file = open(self.file_name, 'w')
yield file
finally:
file.close()
}
usage
message_writer = MessageWriter(‘hello.txt’) with message_writer.open_file() as my_file: my_file.write(‘hello world’)
Приложения
Предопределенные макросы
При работе парсера NewLang автоматически формируются несколько зарезервированных макросов, часть из которых соответствуют макросам препроцессора у С/С++. Данные предопределенные макросы можно использовать как обычные константы.
-
__FILE__ или __FILE_NAME__ - имя и полный путь текущего файла
-
__LINE__ или __FILE_LINE__ - содержит номер текущей строки в файле
-
__FILE_TIMESTAMP__ - дату и время последней модификации текущего файла в строковом представлении
-
__FILE_MD5__ - md5 хеш текущего файла в строковом виде
-
__COUNTER__ - целочисленный счетчик, который увеличивает свое значение при каждом обращении
-
__DATE__ - дата начала запуска компилятора (имеет одно и тоже значение для всех обрабатываемых файлов)
-
__TIME__ - время начала запуска компилятора (имеет одно и тоже значение для всех обрабатываемых файлов)
-
__TIMESTAMP__ - дату и время начала запуска компилятора (например: “Fri 19 Aug 13:32:58 2016”)
-
__TIMESTAMP_ISO__ - дату и время начала запуска компилятора в формате ISO (например: “2013-07-06T00:50:06Z”)
-
__NLC_VER__ - Страшая и младшая версия компилятора NewLang (8 битное число, по 4 бита на цифру)
-
__NLC_DATE_BUILD__ - текстовая строка с датой сборки компилятора NewLang (например, “23.06.04 20:51:39”)
-
__NLC_SOURCE_GIT__ - текстовая строка с идентификатором исходных файлов NewLang git репозитория, использованных при сборке компилятора (например, “v0.3.0-fef8c371”)
-
__NLC_SOURCE_BUILD__ - дата сборки и git идентификатор исходных файлов NewLang одной текстовой строкой (например, “v0.3.0-fef8c371 23.06.04 20:51:39”)