Хобрук: Ваш путь к мастерству в программировании

sas MACRO амперсанд

%let test = one;
%let one = two;

%put &test;
%put &&test;
%put &&&test;
%put &&&&test;
%put &&&&&test;

Хорошо. Я ПОЛНОСТЬЮ ПОБЕДЕН этими амперсандами. Я не понимаю, почему им нужно СТОЛЬКО амперсандов перед макропеременной. Есть ли какой-нибудь трюк, чтобы освоить использование амперсанда? Кстати, каковы пять результатов соответственно?

07.04.2014

  • Вот хорошая статья об этом. Это действительно одна из самых смехотворно сложных и трудных для отладки характеристик макроязыка SAS. У моего старого коллеги было правило. Если это не работает, просто добавьте еще один амперсанд. 07.04.2014
  • Мне нравится это правило. По крайней мере, в моем случае это работает. 07.04.2014

Ответы:


1

С одним набором амперсандов получается довольно скучно; после единицы нечетное количество амперсандов приводит к разрешению дважды, четное количество амперсандов разрешается один раз. Таким образом, вы используете 1 амперсанд для разрешения один раз и 3 амперсанда для разрешения дважды, если только у вас нет акций компании, которая владеет правами на амперсанд.

Более интересен следующий тест, который показывает, почему четное число амперсандов имеет значение:

%let test = one;
%let testtwo = one;
%let one = two;
%let two=three;

%put &test&one;
%put &&test&one;
%put &&&test&one;
%put &&&&test&one;
%put &&&&&test&one;
%put &&&&&&test&one;

По сути, при каждом проходе SAS выполняет следующие действия:

  • Преобразуйте любой текст с одним амперсандом плюс в ссылку на переменную макроса.
  • Любые пары амперсандов преобразуйте в один амперсанд.

Это делается одновременно и итеративно до тех пор, пока не исчезнут все амперсанды, и каждый результат сохраняется для следующей итерации и не влияет на текущую итерацию. Итак, &test&one становится onetwo, потому что &test -> один и &one -> два. Шаги для остальных:

  • &&test&one -> &testtwo -> one. &&|test|&one. Двойное && перед тестом становится &, тест остается, а &one разрешается в two. Это оставляет &testtwo для второго прохода, который разрешается в one.
  • &&&test&one -> &onetwo -> не разрешается. &&|&test|&one -> &|one|two -> ДНР.
  • &&&&test&one -> &&testtwo -> &testtwo -> один. &&|&&|test|&one -> &&|testtwo -> &testtwo -> один. Каждая из двух пар разрешается до единицы, образуя одну пару, которая затем разрешается до единицы, что оставляет &testtwo для разрешения.
  • &&&&&test&one похож на регистр с тремя амперсандами, но с одной дополнительной парой.
  • &&&&&&test&one разрешается в &&&testtwo разрешается в &one разрешается в два. &&|&&|&&|test|&one -> &&|&testtwo -> &one -> два. Нечетное количество пар означает, что мы получаем еще один набор разрешений.

В конце концов, что вам нужно помнить:

  • 1 амперсанд разрешает макропеременную один раз и все.
  • 2 амперсанда полезны для составных макропеременных, т. е. префикс плюс суффикс, управляемый макросом (&&prefix&suffix).
  • 3 амперсанда полезны для углубления на два в разрешении одной макропеременной (&&&var -> &var2 -> var3).
  • 6 амперсандов полезны для разрешения составной макропеременной с двумя глубинами (т. е. объединения 2 и 3) ([&prefix=var, &suffix=2] &&&&&&prefix&suffix -> &&&var2 -> &var3 -> 4).

Кроме того, 4 или более (кроме 6) полезны только для особенно сложных комбинаций; дополнительные уровни будут использоваться для задержки разрешения до определенного времени.

07.04.2014
  • Это потрясающе. После прочтения этой статьи, предоставленной @thelatemail, и вашего ответа, амперсанд становится ясным. 08.04.2014
  • Это делается одновременно и итеративно до тех пор, пока не исчезнут все амперсанды, и каждый результат сохраняется для следующей итерации и не влияет на текущую итерацию. Я напутал, как SAS обрабатывает амперсанд, потому что забыл, что они обрабатываются одновременно. 08.04.2014
  • В дополнение к этому процессор макросов распознает . как разделитель, обозначающий конец ссылки на переменную макроса. Это означает, что &&&&test.&one -> &&test.two -> &test.two -> onetwo . Вы также можете проверить журнал для полезного объяснения 11.12.2017
  • Новые материалы

    Библиотеки PyTorch и Python для машинного обучения: приложения в здравоохранении с обнимающим лицом…
    В сфере машинного обучения Python выделяется благодаря своей универсальности и набору предлагаемых библиотек. Развитие машинного обучения в здравоохранении можно частично объяснить простотой и..

    «Что за…» очень хорошо представляет мое выражение лица после того, как я увидел это!
    «Что за…» очень хорошо представляет мое выражение лица после того, как я увидел это!

    5 вещей, которые я сделал, чтобы стать профессиональным разработчиком JavaScript
    Чтобы стать профессиональным JS-разработчиком: 1. Практикуйтесь в рутине, 2. Работайте над проектами, 3. Придерживайтесь одного языка, 4. Наблюдайте за чужим кодом, 5. Будьте последовательны..

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

    #093 | Моделирование вспышки эпидемии с помощью JavaScript — Часть 3
    TLDR: Я сделал симуляцию вспышки эпидемии, в которую можно поиграть здесь . Мой холст, моя сцена Мой HTML — это всего лишь один div с классом stage, и вот как я настроил на нем свой объект..

    numberToString.js (8kyu 16)
    Алгоритм кодовых войн Проблема Нам нужна функция, которая может преобразовать число в строку. 숫자를 문자열로 변환하는 함수를 작성해라. Решение 01 function numberToString(n) { return n.toString(); }..

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