Описание языка канальной программы
текущая спецификация
Синтаксис
Данный язык является lisp-подобным, так как не претендует на полную
совместимость со стандартами CLISP или ISLISP. В нем нет определений
lambda-функций, ни классов, ни рекурсии,
ни механизмов захвата ошибок, ни многих других полезных функций.
Тем не менее, используюется базовые синтаксис и семантика Lisp'а.
Все конструкции языка записываются в виде списка элементов:
(элемент1 элемент2 элемент3 ... элементN). Элементы списка
разделяются пробелами, сам список заключен в круглые скобки.
В качестве элементов могут выступать:
символьные обозначения, целые числа, числа с плавающей запятой, строки
и сами списки. Например:
(9 10 11 15)
(setq u 1.356)
(do-list m ("u=" u " in channel" 5) (print m))
здесь "u=", " in channel" являются строками;
setq, do-list, print, u, m - символами (обозначениями);
5 - целое число; 1.356 - нецелое число;
последняя строка является примером вложенных списков.
Тип элемента определятеся следующими правилами:
- Список начинается с открывающейся круглой скобки "(". Заканчивается
закрывающейся круглой скобкой ")". Список может содержать от нуля до
"бесконечности" элементов.
- Все числа начинаются с цифры, и допустимо в
начале ставить знак минус "-".
Числа с плавающей точкой обязательно должны содержать
точку ".".
- Строки начинаются с двойной кавычки и заканичваются ей.
Внутри строки символом обратной косой черты экранируются спецсимволы:
В строке | символ |
\\ | \ |
\" | " |
\n | новая строка |
\r | возврат |
\t | табуляция |
\a | звонок |
- Остальные возможные варианты используются для символьных обозначений.
Есть один особый случай: если обозначение начинается с одиночной
кавычки, то оно транслируется в оператор quote:
'a = (quote a).
Семантика
Всякий список, если это не особенный случай, описывает обращение к
определенной функции.
Первый элемент является именем функции, остальные её аргуметами.
Например:
(print "hello world!\n")
(wait-keypress)
(set 'a 8)
(set 'b a)
здесь print, wait-keypress и set - имена фукнци;
строка в кавычках - аргумент. 'a и 'b аргументы передаваемые
по имени; a аргумент передаваемый в виде значения, т.е. 8.
Таким обазом,
значения всех аргументов вычисляются при обращении к функции.
Соглашения о символах и переменных:
- nil - нуль-символ. Самоопределенный символ.
Эквивалентен условию "ложь" для if.
Эквивалентен пустому списку, т.е. nil=().
- t - тоже самоопределенный символ,
эквивалентен условию "истина" для if.
- *var - глобальная переменная, глобальней не бывает,
сохраняется на все время работы системы, общая для всех каналов.
- $var - локальная для канальной программы переменная,
доступная для изменения из диалоговых окон.
- *NN* - число каналов всего
- *N - номер текущего канала
- file* - имя файла вывода print.
- fastforw* - показывает, что была нажата кнопка "fast forward".
переход к следующему шагу программы
Специальные функции-операторы:
- (progn expr1 expr2 ... exprN)
вычисляются все выражения последовательно. возвращается результат
последнего выражения.
- (if condition-value expr-true expr-false)
если вычисленное значение condition-value не nil
тогда вычисляется выражение expr-true,
иначе expr-false.Оба выражения вместе никогда
вычислится не могут. Выражение expr-false может отсутствовать.
- (loop expr1 expr2 ... exprN)
цикл. вычисляются все выражения последовательно.
после вычисления последнего выражения вычисляется первое и т.д.
не рекомендуется писать (loop).
- (return expr)
перерывает выполнение ближайшего блока. заменяет
(return-from nil expr).
- (quote symbol)
возвращает символ symbol.
- (setq var1 expr1 .. varN exprN)
присваевает значение переменной. например: (setq a 5).
- (defvar var-name def-value)
создает локальную переменную, если имя уже существует, то
значение переменной не меняется, если существует глобальный
аналог, то создается локальная перемнная. если значение
по умолчанию def-value не задано, значение переменной
является nil. например: (defvar working).
- (and expr1 .. exprN)
(or expr1 .. exprN)
(xor expr1 .. exprN)
логические функции. возвращают nil или t.
выражения в and вычисляются последовательно,
до первого вернувшего nil.
выражения в or вычисляются последовательно,
до первого вернувшего t.
выражения в xor вычисляются все.
Проблемно-ориентированные функции:
- (em-clean)
возвращает t если канал связи работает, иначе nil.
- (em-port)
возвращает строку с именем порта.
- (em-error)
возвращает строку c кодом ошибки.
- (max-ch)
устанавливает максимальное число рабочих каналов. меняет *NN*.
жеательно не использовать. лучше только в начале кода.
- (init1241)
калибрует АЦП
- (sample-ch ch expr)
выставляет ток в канале ch сответствнно expr
в миллиамперах.
если expr=nil или не указано, то переводит канал в отключенное
состояние. Возвращает список значений (I U Ur Uve Ui) или nil
если авария оборудования.
- (disp-cycle expr)
отображает поле "номер цикла" в окне, для канала *N.
- (disp-info expr)
отображает поле "шаг" в окне, для данного канала *N.
- (disp-sample expr)
отображает поля "время, I, U, Ur" в окне, для канала *N.
- (timeout var value)
возвращает nil если значение переменной больше
текущего системного времени clock. если меньше или равно,
то возвращает t и устанавливает переменную на clock+value.
- (clock var value)
возвращает значение счетчика времени в секундах UTC с 01.01.1970.
если указано value, то устанавливает время для счетчика
равное value.
Если не указана переменная счетчика, возвращает системное время.
- (lclock)
возвращает местное время в списке формата
(year day month hours minutes seconds).
- (day2yms value)
возвращает список (year month day) из значения номера дня
с 01.01.1970
Revised 06:23 15/12/2004