1. книги
  2. Руководства
  3. Андрей Вяльцев

Макросы Datamine. Ресурсный геолог

Андрей Вяльцев
Обложка книги

Книга описывает базовые понятия программирования применительно к языку макросов Datamine. На основе реальных примеров объясняются разновидности алгоритмов, основы хорошего стиля и рассматриваются некоторые хитрости написания универсальных макросов. Книга ориентирована на геологов, работающих с Datamine и желающих увеличить свою продуктивность. Книга сопровождается большим количеством примеров и заданий, основанных на геологических задачах.

Оглавление

Купить книгу

Приведённый ознакомительный фрагмент книги «Макросы Datamine. Ресурсный геолог» предоставлен нашим книжным партнёром — компанией ЛитРес.

Купить и скачать полную версию книги в форматах FB2, ePub, MOBI, TXT, HTML, RTF и других

Макросы

Структура макросов

Из чего состоят макросы

Итак, макрос — это текстовый файл. В этом текстовом файле содержится набор команд, которые необходимо выполнить Datamine для получения нужного вам результата. Команды макросов всегда начинаются с восклицательного знака. Команды макросов можно разделить на:

1. «Внутренние» команды макросов — команды для организации выполнения макроса. Давайте назовем их по-программистски «операторами». К этой разновидности команд можно отнести:

— Оператор присвоения LET. С помощью этого же оператора могут выполняться некоторые функции — как арифметические, так и строковые: получение целой части, абсолютного значения, максимума/минимума, степенные, показательные, логарифмические и тригонометрические функции; изменения регистра строки, определение длины строки, поиск подстроки в строке и т. д.

— Условный оператор IF.

— Оператор безусловного перехода GOTO.

— Операторы «общения» с пользователем ECHO и PROMPT.

— Операторы организации подпрограмм GOSUB и RETURN.

— Оператор запуска команд ОС OPSYS.

— Оператор запуска другого макроса XRUN.

— Операторы чтения файлов FILES и FIELD.

— Другие операторы, которые с ходу не вспомнить, но которые будут описаны по ходу настоящей книги.

— Другие операторы, которые с ходу не вспомнить и которые не будут описаны в книге, но которые вы наверняка найдете сами, если будете копаться в руководстве и справке.

2. Команды запуска процессов. Эти команды начинаются с имени соответствующего процесса, перед которым (ожидаемо) должен присутствовать восклицательный знак. Например, процесс EXTRA запускается командой `!EXTRA`.

Команды будут упомянуты и более подробно описаны по мере возникновения в них необходимости согласно логике изложения материала. Более «сухое» и официальное описание команд можно найти в справочных материалах.

Ограничения

Сразу пару слов об ограничениях (а вы думали, что все так просто?). До некоторой версии (мы сами не заметили до какой) длина одной строки в макросе не должна была превышать 80 символов. Причина такого ограничения, вероятно, уходила корнями в седую древность9 (если кто не знал, то код Datamine минимум до версий Datamine Studio 3.* был написан на практически «мертвом» Visual Fortran). Все, что выходило за пределы 80 символов, Datamine нагло игнорировал. С некоторых пор это ограничение снято, но мы бы рекомендовали его придерживаться с целью обратной совместимости — вдруг ваш макрос попадет в руки пользователю, который не в курсе, что вышли новые версии Datamine. Ну и плюс: если строка вашего макроса слишком длинная, читать его не очень удобно. Это не единственное ограничение, остальные будут описаны в подходящий момент.

Алгоритмы: что это и какие бывают

Алгоритм можно определить как набор правил для решения некоторой задачи. Или по-другому: алгоритм — это идея, тогда как конкретный макрос — его реализация.

Алгоритмы принято делить на:

— Линейные алгоритмы. Самый простой тип. Просто последовательность команд, выполняемых одна за другой. После первой команды всегда выполняется вторая, после второй всегда выполняется третья и т. д. Линейный алгоритм используется, когда все ясно и никаких вариантов развития событий не предполагается.

— Алгоритмы с ветвлением. Используется при возникновении вариантов развития событий.

если пойдет дождь — я поеду на автобусе,

если будет солнечно — прогуляюсь пешком,

если друзья предложат выпить пива — вообще никуда не пойду.

— Циклические алгоритмы. Описывают процессы, повторяющиеся много раз.

«Каждый год 31 декабря мы с друзьями ходим в баню» — то есть один раз указывается действие, а затем сообщается, что это действие исполняется некоторое количество раз.

— Алгоритмы с подпрограммами. Перефразируя известного киноперсонажа, можно сказать: «Точно такие же, как и циклические, но другие». Об этом чуть позже.

При написании макросов вы будете писать обычные линейные алгоритмы, алгоритмы с ветвлением и, возможно, будете использовать циклы и подпрограммы. Обычно достаточно большой макрос содержит все разновидности алгоритмов. Далее будут описаны упомянутые варианты алгоритмов по принципу «от простого к сложному».

$ Задание 3.1

Какой тип алгоритма описан в этом увлекательном рассказе?

Одна старуха от чрезмерного любопытства вывалилась из окна, упала и разбилась.

Из окна высунулась другая старуха и стала смотреть вниз на разбившуюся, но от чрезмерного любопытства тоже вывалилась из окна, упала и разбилась.

Потом из окна вывалилась третья старуха, потом четвертая, потом пятая.

Когда вывалилась шестая старуха, мне надоело смотреть на них, и я пошел на Мальцевский рынок, где, говорят, одному слепому подарили вязаную шаль.

A) Мы такого не проходили

B) Циклический алгоритм

C) Алгоритм с ветвлением

D) Линейный алгоритм

$ Задание 3.2

Какой тип алгоритма описан в данном отрывке?

Размышляя таким образом, она пробралась в маленькую комнатку, сверкающую чистотой. У окна стоял стол, а на нем, как она и надеялась, лежал веер и несколько пар крошечных перчаток. Алиса взяла веер и пару перчаток и совсем уже собралась выйти из комнатки, как вдруг увидала у зеркала маленький пузырек. На нем не было написано: «ВЫПЕЙ МЕНЯ!», но Алиса открыла его и поднесла к губам.

A) Линейный

B) Циклический

C) Алгоритм с ветвлением

D) Мы такого не проходили

$ Задание 3.3

Какой тип алгоритма описан в этой пыхтелке?

Если б мишки были пчелами,

То они бы нипочем

Никогда и не подумали

Так высоко строить дом;

И тогда (конечно, если бы

Пчелы — это были мишки!)

Нам бы, мишкам, было незачем

Лазить на такие вышки!

A) Мы такого не проходили

B) Алгоритм с ветвлением

C) Линейный алгоритм

D) Циклический алгоритм

$ Задание 3.4

Какой тип алгоритма описан здесь?

Вот пистолеты уж блеснули,

Гремит о шомпол молоток.

В граненый ствол уходят пули,

И щелкнул в первый раз курок.

Вот порох струйкой сероватой

На полку сыплется. Зубчатый,

Надежно ввинченный кремень

Взведен еще. За ближний пень

Становится Гильо смущенный.

Плащи бросают два врага.

Зарецкий тридцать два шага

Отмерил с точностью отменной,

Друзей развел по крайний след,

И каждый взял свой пистолет.

A) Линейный алгоритм

B) Алгоритм с ветвлением

C) Мы такого не проходили

D) Циклический алгоритм

$ Задание 3.5

Какой тип алгоритма описан?

Раз он в море закинул невод, —

Пришел невод с одною тиной.

Он в другой раз закинул невод, —

Пришел невод с травой морскою.

В третий раз закинул он невод, —

Пришел невод с одною рыбкой,

С непростою рыбкой, — золотою.

A) Циклический алгоритм

B) Мы такого не проходили

C) Линейный алгоритм

D) Алгоритм с ветвлением

$ Задание 3.6

Какой тип алгоритма описан?

У попа была собака,

Он ее любил.

Она съела кусок мяса —

Он ее убил.

И в землю закопал.

И надпись написал:

«У попа была собака,

Он ее любил.

Она съела кусок мяса —

Он ее убил.

И в землю закопал.

И надпись написал:

«У попа была собака,

Он ее любил.

Она съела кусок мяса —

Он ее убил.

И в землю закопал.

И надпись написал:

…»

A) Циклический алгоритм

B) Алгоритм с ветвлением

C) Линейный алгоритм

D) Мы такого не проходили

Линейные алгоритмы

Линейные алгоритмы — это алгоритмы, когда «все ясно». То есть линейный алгоритм выглядит следующим образом: «Начало макроса — выполняем действие А, затем действие Б, действие В… конец макроса». Продолжая аналогию с реальной жизнью: «выключу компьютер, надену обувь, зайду в магазин…».

Однако, поскольку целью данной книги не является обучение тому, как правильно покидать рабочее место, перейдем непосредственно к написанию макроса.

Итак, давайте решим достаточно простую задачу: необходимо по файлу каркасов минерализации и полному файлу базы данных опробования создать рудную выборку. В наиболее простом случае процедура не предполагает каких-либо вариантов действий. Если выполнять ее вручную, последовательность действий можно описать так:

— Выборка проб каркасами минерализации с зональным контролем по полю номера рудного тела.

— Композитирование выбранных проб.

— Урезка ураганных содержаний.

Давайте для простоты предположим, что нам известно следующее (файлы для тестирования10):

— имя файла рудных каркасов — ore_tr/pt;

— имя файла скважин — holes;

— имя поля номера рудного тела — BODY;

— имя поля урезаемых содержаний — AU;

— средняя длина проб, к которой требуется привести рудную выборку — 1 м;

— оптимальная сеть декластеризации — данные расположены по регулярной сети;

— уровень ураганных содержаний одинаков для всех рудных тел — 100 г/т;

— имя файла обработанной рудной выборки holes_ore_cut.

На многих приводимых ниже картинках с фрагментами кода в начале строки можно видеть номер. Это просто номер строки, который не является частью макроса. Номера строк автоматически проставляются многими текстовыми редакторами. Это не часть текста, это просто номера строк, они «физически» — в виде символов текста — не существуют и нужны только для облегчения адресации пользователя, например: «в строке N выполняется такое-то действие».

Макрос, выполняющий все описанные выше действия, будет выглядеть следующим образом (macro111):

Смотрим, что тут написано.

Строка 1 — заголовок макроса и его имя (OREHOL).

Строка 3 — запуск процесса SELWF. Строки до появления следующего восклицательного знака (до строки 16 включительно) — это параметры запуска данного процесса:

— на строке 3, кроме имени запускаемого процесса Datamine, указано, что входным файлом для процесса SELWF является файл holes — &IN (holes);

— на строке 4 указано, что файлом треугольников каркасов минерализации является файл ore_tr — WERETR (ore_tr);

— на строке 5 указано, что файлом точек каркасов минерализации является файл ore_pt — &WERETR (ore_pt);

— на строке 6 указано, что выходным файлом для процесса SELWF является файл holes_ore_cut — &OUT (holes_ore_cut).

Строки 3—6 соответствуют вкладке Files процесса SELWF:

Вкладка Files процесса SELWF в интерфейсе Datamine и в макросе

Сравнивая строки 3—6 с вкладкой Files, можно заметить, что:

— поля входных и выходных файлов в макросе имеют то же имя, что и в интерфейсе процесса: поле в интерфейсе «IN» обозначается в макросе ∈

— используемые файлы в макросе помечаются знаком «&» — как «входящие», так и «результирующие»;

— имена файлов указываются в скобках;

— параметры друг от друга отделяются запятой; если описание процесса не помещается в одну строку (помним про ограничение в 80 символов), перенос осуществляется после запятой.

Строки 7—10 соответствуют вкладке Fields интерфейса.

Вкладка Fields процесса SELWF в интерфейсе Datamine и в макросе

Сравнивая строки 7—10 с вкладкой Fields, можно заметить, что:

— поля помечаются символом «*» перед именем параметра;

— пропущенные поля в интерфейсе процесса (оставленные незаполненными) в макросе не отображаются вовсе;

— имена полей указываются в скобках.

Строки 11—16 соответствуют вкладке Parameters интерфейса.

Вкладка Parameters процесса SELWF в интерфейсе Datamine и в макросе

Сравнивая строки 11—16 с вкладкой Parameters, можно заметить, что:

— параметры вкладки Parameters помечаются символом «@»;

— значения числовых параметров указываются с помощью знака равенства;

— параметры друг от друга отделяются запятой;

— никакого разделения на вкладки (как в интерфейсе процесса) нет.

Выше достаточно подробно разобран только один процесс. Остальные процессы программируются совершенно сходным образом:

— запуск процесса начинается с имени процесса и восклицательного знака перед ним;

— все параметры имеют то же имя, что и в графическом интерфейсе процесса;

— имена файлов предваряются символом амперсанда «&»;

— имена полей предваряются символом звездочки «*»;

— параметры предваряются помечаются символом «собаки» — «@»;

— имена файлов и полей заключаются в скобки;

— значения числовых параметров указываются с помощью знака равенства;

— параметры друг от друга отделяются запятыми.

Внимание: описание параметров запуска процесса не может заканчиваться запятой, т. к. это приведет к зависанию макроса (но не приведет к появлению ошибки). Возможна и другая неприятность: потеря запятой. Все параметры, которые вы с такой тщательностью подбирали, но которые указаны после «потерянной» запятой, будут проигнорированы. И здесь два варианта: либо указанные вами параметры необязательные и процесс будет выполнен с параметрами по умолчанию, либо макрос остановится, так как один из процессов не нашел всех нужных ему параметров. Второй вариант лучше — вы хотя бы увидите, что в макросе ошибка. В общем, к запятым в языке макросов надо относиться очень внимательно.

Пожалуй, некоторыми особенностями обладает только процесс EXTRA. Описание параметров у него завершается на строке 42 параметром @APPROX=0.0. Причем, после этого параметра нет запятой (то есть описание параметров процесса завершено). Основной функционал содержится в строках с 44 до команды GO (строка 47). Процесс EXTRA всегда завершается командой GO (без запятой в конце и восклицательного знака в начале).

Крайний правый знак на строке 16 приведет к зависанию макроса. Сообщение об ошибке при этом не появится. Макрос просто будет «висеть», изображая работу

Отсутствие запятой в строке 14 приведет к игнорированию параметров CHECKROT и ALLPTS. Ошибка в данном случае также не проявится, поскольку параметры необязательные

Можно было заметить, что при разборе макроса ничего не было сказано о вкладке Retrieval, на которой указываются логические условия выполнения процессов. Эти условия в макросе указываются точно так же, как они указываются при «обычном» запуске процесса. От предыдущих параметров эти условия также отделяются запятыми. То есть вот такое условие:

!COPY $IN (holes),&OUT (hol_rich),AU> 10

заставит Datamine скопировать из файла holes в файл hol_rich пробы с содержаниями золота не ниже 10 г/т. Если требуется указать более одного условия, они перечисляются через запятую:

!COPY $IN (holes),&OUT (hol_rich),AU> 10,AG> 50

При этом, как и в «ручном» запуске процесса оба условия будут выполняться одновременно — то есть во втором случае в файл hol_rich будут скопированы пробы с содержанием золота не меньше 10 г/т и серебра не менее 50 г/т.

Ну и, завершая разбор первого макроса, следует упомянуть, что макрос завершается строкой 51, на которой сообщается, что макрос завершен: END.

Перед решением заданий

Задания дальше по книге можно решать двумя способами:

— Набрать соответствующий текст макроса и попытаться запустить.

— Внимательно прочитать текст макроса и попытаться понять, как он будет работать.

Мы бы очень хотели, чтобы вы выбрали второй путь. Собственно, для этого тексты макросов приведены в виде картинок. Умение бездумно набирать и запускать макросы — это немного не тот навык, который мы бы хотели вам передать. Огромная просьба: не пытаться мухлевать, а постараться реально решать задания. В конце концов, мы не в школе, родителей к директору никто вызывать не собирается, на второй год оставлять — тоже.

$ Задание 3.7

Чем завершится выполнение данного макроса?

A) Создастся точная копия входного файла с именем holes_extra

B) Зависанием Datamine до принудительного завершения пользователем работы макроса

C) Всем значениям в существующем поле AU присвоится 0. Если поле AU отсутствовало во входном файле, оно создастся

D) Процесс выполнится, но выходной файл не создастся

E) Ошибкой

$ Задание 3.8

Чем завершится выполнение данного макроса?

A) Зависанием Datamine до принудительного завершения пользователем работы макроса

B) Всем значениям в существующем поле AU присвоится 0. Если поле AU отсутствовало во входном файле, оно создастся. Параметр APPROX проигнорируется, в выходном файле также будет создано поле @APPROX, значение которого будет равно 0

C) Процесс выполнится, но выходной файл не создастся

D) Ошибкой

E) Всем значениям в существующем поле AU присвоится 0. Если поле AU отсутствовало во входном файле, оно создастся

F) Создастся точная копия входного файла с именем holes_extra

$ Задание 3.9

Чем завершится выполнение данного макроса?

A) Зависанием Datamine до принудительного завершения пользователем работы макроса

B) Всем значениям в существующем поле AU присвоится 0. Если поле AU отсутствовало во входном файле, оно создастся

C) Процесс выполнится, но выходной файл не создастся

D) Ошибкой

E) В файл holes_extra будут скопированы записи с содержанием золота 0

$ Задание 3.10

Чем завершится выполнение данного макроса?

A) Ошибкой

B) Создастся точная копия входного файла с именем holes_extra

C) Процесс выполнится, но выходной файл не создастся

D) Всем значениям в существующем поле AU присвоится 0. Если поле AU отсутствовало во входном файле, оно создастся

E) Зависанием Datamine до принудительного завершения пользователем работы макроса

$ Задание 3.11

Чем завершится выполнение данного макроса?

A) Всем значениям в существующем поле AU присвоится 0. Если поле AU отсутствовало во входном файле, оно создастся

B) Создастся точная копия входного файла с именем holes_extra

C) Ошибкой

D) Процесс выполнится, но выходной файл не создастся

E) Зависанием Datamine до принудительного завершения пользователем работы макроса

$ Задание 3.12

Чем завершится выполнение данного макроса?

A) Создастся точная копия входного файла с именем holes_extra

B) Зависанием Datamine до принудительного завершения пользователем работы макроса

C) Процесс выполнится, но выходной файл не создастся

D) Всем значениям в существующем поле AU присвоится 0. Если поле AU отсутствовало во входном файле, оно создастся

E) Ошибкой

$ Задание 3.13

Чем завершится выполнение данного макроса?

A) Ошибкой, так как параметра *RUDA в процессе SELWF нет

B) В выходной файл выберутся пробы, находящиеся внутри каркаса ore_tr/pt. Создастся дополнительное поле BODY

C) Зависанием Datamine до принудительного завершения пользователем работы макроса.

D) Процесс выполнится, но выходной файл не создастся

E) Создастся точная копия входного файла с именем hol_sel

F) В выходной файл выберутся пробы, находящиеся внутри каркаса ore_tr/pt. Создадутся дополнительные поля BODY и ORE

$ Задание 3.14

Чем завершится выполнение данного макроса?

A) В выходной файл выберутся пробы, находящиеся внутри каркаса ore_tr/pt. Создастся дополнительное поле BODY

B) Создастся точная копия входного файла с именем hol_sel

C) Процесс выполнится, но выходной файл не создастся

D) Ошибкой

E) Зависанием Datamine до принудительного завершения пользователем работы макроса

$ Задание 3.15

Чем завершится выполнение данного макроса?

A) Ошибкой

B) Зависанием Datamine до принудительного завершения пользователем работы макроса

C) В выходной файл выберутся пробы, находящиеся внутри каркаса ore_tr/pt. Создастся дополнительное поле BODY

D) Создастся точная копия входного файла с именем hol_sel

E) Процесс выполнится, но выходной файл не создастся

$ Задание 3.16

Чем завершится выполнение данного макроса?

A) Создастся точная копия входного файла с именем hol_sel

B) В выходной файл выберутся пробы, находящиеся внутри каркаса ore_tr/pt. Создастся дополнительное поле BODY. Абсолютно все параметры проигнорируются

C) Процесс выполнится, но выходной файл не создастся

D) Зависанием Datamine до принудительного завершения пользователем работы макроса

E) Ошибкой

F) В выходной файл выберутся пробы, находящиеся внутри каркаса ore_tr/pt. Создастся дополнительное поле BODY

G) В выходной файл выберутся пробы, находящиеся внутри каркаса ore_tr/pt. Создастся дополнительное поле BODY. Все параметры после @SELECT=3.0 проигнорируются

$ Задание 3.17

Чем завершится выполнение данного макроса?

A) Ошибкой

B) Выходной файл отсортируется по полю BHID

C) Выходной файл отсортируется по полям BHID и FROM

D) Зависанием Datamine до принудительного завершения пользователем работы макроса

E) Выходной файл отсортируется по полю FROM

F) Процесс выполнится, но выходной файл не создастся

$ Задание 3.18

Чем завершится выполнение данного макроса?

A) Процесс выполнится, но выходной файл не создастся

B) Выходной файл отсортируется по полям BHID и FROM

C) Выходной файл отсортируется по полю FROM

D) Выходной файл отсортируется по полю BHID

E) Ошибкой

F) Зависанием Datamine до принудительного завершения пользователем работы макроса

$ Задание 3.19

Чем завершится выполнение данного макроса?

A) Зависанием Datamine до принудительного завершения пользователем работы макроса

B) Ошибкой

C) Выходной файл композитируется с зональным контролем по полю BODY

D) Процесс выполнится, но выходной файл не создастся

$ Задание 3.20

Чем завершится выполнение данного макроса?

A) Успешным выполнением

B) Ошибкой

C) Вылетом Datamine

D) Процессы выполнятся, но выходной файл после команды EXTRA не создастся

E) Зависанием Datamine до принудительного завершения пользователем работы макроса

Переменные

Итак, мы с вами написали первый простой макрос (пока «не вы, а мы», но лиха беда начало), автоматизирующий процесс создания рудной выборки. При этом мы условились, что:

— имя файла рудных каркасов — ore_tr/pt;

— имя файла скважин — holes;

— имя поля номера рудного тела — BODY;

— имя поля урезаемых содержаний — AU;

— средняя длина проб, к которой требуется привести рудную выборку — 1 м;

— оптимальная сеть декластеризации — данные расположены по регулярной сети;

— уровень ураганных содержаний одинаков для всех рудных тел — 100 г/т;

— имя файла обработанной рудной выборки holes_ore_cut.

Несложно догадаться, что это не всегда так. Каркасы могут называться по-другому, файл скважин — тоже. Поле содержания — не обязательно AU, а зонального контроля — не обязательно BODY. Ну и далее по списку. Что же делать? Вариантов минимум три:

— Каждый раз перед использованием макроса подгонять имена файлов и полей под то, что написано в макросе.

— Каждый раз перед использованием макроса править весь текст макроса в соответствии с вашими входными условиями.

— Модифицировать макрос так, чтобы правки были понятными, минимальными и простыми.

Первые два варианта — путь сложный и тупиковый. Мы хотели написать «как несложно догадаться…», но поняли, что пока догадаться сложно. Поэтому просто поверьте: первые два варианта — очень плохая идея. И мы, как говорится, пойдем другим путем — то есть третьим из перечисленных.

Для этого третьего пути нам понадобится некая сущность, которой мы можем оперировать либо как числом, либо как строкой — то есть либо выполнять арифметические действия, либо складывать ее с другими строками. Но при этом в то время, когда мы пишем макрос, мы не знаем, какое именно значение принимает эта сущность. То есть нам нужна некая виртуальная «коробка», в которой можно хранить все, что угодно, и при этом заставлять наш макрос производить с этой коробкой любые операции, как будто он имеет дело с тем содержимым, которое в этой коробке находится в момент выполнения макроса. И вот эту коробку в программировании принято называть «переменная». В принципе, переменная в программировании очень похожа на переменную в школьном курсе математики — то есть это некий «икс», который можно складывать, вычитать, умножать и так далее, как будто вы работаете с числом (но при этих операциях мы понятия не имеем, какое там число). Только в программировании в эту коробку можно складывать не только числа: например, применительно к языку макросов — имена файлов или полей (понятно, что в этом случае перечень операций, доступных для переменной, несколько другой).

Итого: переменную в макросе можно определить как контейнер («коробку»), содержимое которого неизвестно в момент написания макроса и определяется по ходу выполнения макроса. Переменная должна иметь имя, которое может состоять из одного или нескольких символов. Над переменными можно выполнять те же операции, что и над их содержимым.

Поскольку то, что вы читаете, не является официальным руководством и не обязано подчиняться строгим правилам изложения материала, здесь нет строгого и «правильного» определения переменной. Если интересно строгое определение — откройте любой поисковик и наберите запрос. То, что написано выше — это объяснение концепции переменной понятным языком (надеемся, что понятным).

Для создания переменной и для задания ее значения в языке макросов используется команда (оператор) LET. Если вы слегка знакомы с английским, можно увидеть поразительное сходство этого оператора с глаголом «to let» (позволять) или с модальным словом «let» (что в вольном переводе означает «пусть!», «а давайте!»). Суть также совпадает: строка

!LET $a# = 10

как бы говорит: «пусть в переменной $a# будет значение 10» или «а давайте засунем десятку в переменную $a#».

Переменная в макросе должна начинаться со знака доллара и заканчиваться знаком решетки.

Переменная может именоваться более, чем одной буквой. То есть переменная вполне может быть названа, например, $hello_its_me#. Причем, мало того, она не то что «может», более того, лучше, чтобы она называлась более чем одной буквой. Хороший стиль программирования (ой, пардон, написания макросов) включает в себя присвоение переменным таких имен, чтобы было примерно понятно, что эта переменная обозначает. Имя переменной $in_tr# для исходного файла треугольников намного лучше, чем, например, $a#. Хотя на работоспособность макроса это не влияет никак (а вот на «читабельность» написанного макроса — очень даже). Но здесь возникает следующее ограничение: длина имени переменной (включая знаки доллара и решетки) не должна превышать 16 символов. То есть называть переменные следует так, чтобы было «примерно понятно», что она содержит, но при этом не стоит увлекаться длиной названий.

Переменные могут содержать строковые (алфавитные) данные, а могут числа. Первые могут представлять собой любой набор символов (включая и цифры), вторые — только цифры, точку как разделитель целой и дробной части и минус как обозначение отрицательного числа. Строковые значения переменным можно присваивать так, как это указано выше, а можно заключать строки в одинарные кавычки:

!LET $third_var# = `hgjf`.

При этом записи

!LET $my_var# = hhh

и

!LET $my_var# = `hhh`

дают одинаковый результат. Возникает закономерный вопрос: а зачем одинарные кавычки, если можно и без них? Можно, но не всегда.

Если вам почему-либо хочется, чтобы строковая переменная содержала пробел — нужны кавычки:

!LET $str_var# = Hello everybody

запишет в переменную $str_var# значение Helloeverybody, а выражение

!LET $str_var# = `Hello everybody`

даст требуемое приветствие в переменной — Hello everybody.

Если строковая переменная должна содержать какие-либо операторы (а она это может, и это очень полезное свойство переменных в макросах) — например, для использования в EXTRA в качестве команды, вот так:

Конец ознакомительного фрагмента.

Оглавление

Купить книгу

Приведённый ознакомительный фрагмент книги «Макросы Datamine. Ресурсный геолог» предоставлен нашим книжным партнёром — компанией ЛитРес.

Купить и скачать полную версию книги в форматах FB2, ePub, MOBI, TXT, HTML, RTF и других

Примечания

9

https://softwareengineering.stackexchange.com/questions/148677/why-is-80-characters-the-standard-limit-for-code-width

10

https://github.com/andrey-vyaltsev/MacrosDatamine/blob/main/Wf_and_holes.7z

11

https://github.com/andrey-vyaltsev/MacrosDatamine/blob/main/macro1.7z

Вам также может быть интересно

а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ э ю я