macro quoting - lexjansen.commacro quoting functions - overview 5 /// macro quoting /// phuse eu...

33
/////////// Macro Quoting A Look Behind the Scenes 2019-11-13 / Tim Lepp / v2.0 © forexfreiheit.de

Upload: others

Post on 10-Oct-2020

25 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

///////////

Macro QuotingA Look Behind the Scenes

2019-11-13 / Tim Lepp / v2.0

© forexfreiheit.de

Page 2: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Agenda

Macro Quoting – Introduction

Macro Quoting Functions – Overview

Program Flow – Basics

Macro Quoting – Timing

Summary

/// Macro Quoting /// Phuse EU 20192

Page 3: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Masking with non-printable characters from0x01 to 0x1F

Macro Quoting – Introduction

/// Macro Quoting /// Phuse EU 20193

Variability

“I never said she stole my money“ means..(a) someone else accused her(b) the thief was someone else (c) it wasn't money she stole, but something else

”H&M, %Percent, g=9.8” means..(a) &M is a macro variable, %Percent a macro call(b) a parameter list(c) fashion label string

Context Ambiguity

Page 4: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting Functions - Overview

/// Macro Quoting /// Phuse EU 20194

DATA _NULL_; CALL SYMPUT('var0','H&M, O''Neill, %Percent, g=9.8'); RUN;

%LET var1_STR = %str(H&M, O%'Neill, %Percent, g=9.8);%LET var2_NRSTR = %nrstr(H&M, O%'Neill, %Percent, g=9.8);%LET var3_BQUOTE = %bquote(&var0.);%LET var4_NRBQUOTE = %nrbquote(&var0.);%LET var5_SUPERQ = %superq(var0);

%STRMasks groups Aand group C only withpreceding %

Difficulties with unmatched Quotation marks and bracketsCompilation phase function

Works before resolution ofmacro triggers

onnnnnn

Groups of Special CharactersA + - * / < > = ¬ ^ | ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN B & % C ' “ ( )

Page 5: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting Functions - Overview

/// Macro Quoting /// Phuse EU 20195

%NRSTRMasks groups A, B and C only with preceding %

Difficulties with unmatched Quotation marks and brackets

Compilation phase functionWorks before resolution ofmacro triggers

DATA _NULL_; CALL SYMPUT('var0','H&M, O''Neill, %Percent, g=9.8'); RUN;

%LET var1_STR = %str(H&M, O%'Neill, %Percent, g=9.8);%LET var2_NRSTR = %nrstr(H&M, O%'Neill, %Percent, g=9.8);%LET var3_BQUOTE = %bquote(&var0.);%LET var4_NRBQUOTE = %nrbquote(&var0.);%LET var5_SUPERQ = %superq(var0);

nonnnnn

Groups of Special CharactersA + - * / < > = ¬ ^ | ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN B & % C ' “ ( )

Page 6: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting Functions - Overview

/// Macro Quoting /// Phuse EU 20196

%BQUOTEMasks groups A und CAlso unmatched Quotation marks and brackets can be processedExecution phase function

Works after resolution ofmacro triggers

DATA _NULL_; CALL SYMPUT('var0','H&M, O''Neill, %Percent, g=9.8'); RUN;

%LET var1_STR = %str(H&M, O%'Neill, %Percent, g=9.8);%LET var2_NRSTR = %nrstr(H&M, O%'Neill, %Percent, g=9.8);%LET var3_BQUOTE = %bquote(&var0.);%LET var4_NRBQUOTE = %nrbquote(&var0.);%LET var5_SUPERQ = %superq(var0);

nnonnnn

Groups of Special CharactersA + - * / < > = ¬ ^ | ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN B & % C ' “ ( )

Page 7: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting Functions - Overview

/// Macro Quoting /// Phuse EU 20197

%NRBQUOTEMasks groups A, B and CAlso unmatched Quotation marks and brackets can be processedNR misleading, as one couldthink it works analogiously to%NRSTR

Execution phase function

Works after resolution ofmacro triggers

DATA _NULL_; CALL SYMPUT('var0','H&M, O''Neill, %Percent, g=9.8'); RUN;

%LET var1_STR = %str(H&M, O%'Neill, %Percent, g=9.8);%LET var2_NRSTR = %nrstr(H&M, O%'Neill, %Percent, g=9.8);%LET var3_BQUOTE = %bquote(&var0.);%LET var4_NRBQUOTE = %nrbquote(&var0.);%LET var5_SUPERQ = %superq(var0);

nnnonnn

Groups of Special CharactersA + - * / < > = ¬ ^ | ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN B & % C ' “ ( )

%LET M=ennes&Mauritz;%MACRO Percent(); _Xxxxxxx %MEND;

Page 8: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting Functions - Overview

/// Macro Quoting /// Phuse EU 20198

%NRBQUOTEMasks groups A, B and CAlso unmatched Quotation marks and brackets can be processedNR misleading, as one couldthink it works analogiously to%NRSTR

Execution phase function

Works after resolution ofmacro triggers

DATA _NULL_; CALL SYMPUT('var0','H&M, O''Neill, %Percent, g=9.8'); RUN;

%LET var1_STR = %str(H&M, O%'Neill, %Percent, g=9.8);%LET var2_NRSTR = %nrstr(H&M, O%'Neill, %Percent, g=9.8);%LET var3_BQUOTE = %bquote(&var0.);%LET var4_NRBQUOTE = %nrbquote(&var0.);%LET var5_SUPERQ = %superq(var0);

nnnnonn

Groups of Special CharactersA + - * / < > = ¬ ^ | ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN B & % C ' “ ( )

%LET M=ennes&Mauritz;%MACRO Percent(); _Xxxxxxx %MEND;

Page 9: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting Functions - Overview

/// Macro Quoting /// Phuse EU 20199

%SUPERQMasks groups A, B and CThe argument is expected tobe the name of a Macrovariable (without &) whose value is being maskedwithout further resolutionExecution phase function

Works after resolution ofmacro triggers

DATA _NULL_; CALL SYMPUT('var0','H&M, O''Neill, %Percent, g=9.8'); RUN;

%LET var1_STR = %str(H&M, O%'Neill, %Percent, g=9.8);%LET var2_NRSTR = %nrstr(H&M, O%'Neill, %Percent, g=9.8);%LET var3_BQUOTE = %bquote(&var0.);%LET var4_NRBQUOTE = %nrbquote(&var0.);%LET var5_SUPERQ = %superq(var0);

nnnnnon

Groups of Special CharactersA + - * / < > = ¬ ^ | ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN B & % C ' “ ( )

%LET M=ennes&Mauritz;%MACRO Percent(); _Xxxxxxx %MEND;

Page 10: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting Functions - Overview

/// Macro Quoting /// Phuse EU 201910

nnnnnno

Groups of Special CharactersA + - * / < > = ¬ ^ | ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN B & % C ' “ ( )

Function Masks Runtime Features%STR A, C* Compilation C will only be masked with preceding %%NRSTR A, B, C* Compilation C will only be masked with preceding %%BQUOTE A, C Execution%NRBQUOTE A, B, C Execution Macro trigger B are resolved before masking%SUPERQ A, B, C Execution Expects macro variable name as argument%QUOTE A, C* Execution C will only be masked with preceding %%NRQUOTE A, B, C* Execution C will only be masked with preceding %%UNQUOTE A*, B*, C* Execution Removes all masking%QSCAN, %QSUBSTR, %QUPCASE, %QSYSFUNC, %QCMPRES, %QLOWCASE, %QLEFT, %QTRIM

A, B, C Execution Same quoting behaviour as %NRBQUOTE

Page 11: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Program Flow – Basics

/// Macro Quoting /// Phuse EU 201911

onnnnnnn

Input Stack

Word Scanner

SAS Program…

SCL Program…

Display Manager…

……

Data Step Compiler

SCL CompilerCommand Processor

Macro Processor

Page 12: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Program Flow – Basics

/// Macro Quoting /// Phuse EU 201912

nonnnnnn

Input Stack

Word Scanner

SAS Programtoday

SCL Program…

Display Manager…

……

DATA ;date = "&sysdate9";

RUN;Data Step Compiler

SCL CompilerCommand Processor

Macro Processor

…SYSDATE9 13NOV2019

Symbol Table…

Macro Catalog

Page 13: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

…Program Flow – Basics

/// Macro Quoting /// Phuse EU 201913

nnonnnnn

Input Stack

Word Scanner

SAS Program

SCL Program…

Display Manager…

……

Data Step Compiler

SCL CompilerCommand Processor

Macro Processor

todayDATA ;date = "&sysdate9";

RUN;

…SYSDATE9 13NOV2019

Symbol Table…

Macro Catalog

Page 14: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

…Program Flow – Basics

/// Macro Quoting /// Phuse EU 201914

nnnonnnn

Input Stack

Word Scanner

SAS Program

SCL Program…

Display Manager…

……

Data Step Compiler

SCL CompilerCommand Processor

Macro Processor

todayDATA

;

date = "&sysdate9";RUN;

…SYSDATE9 13NOV2019

Symbol Table…

Macro Catalog

Page 15: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

…Program Flow – Basics

/// Macro Quoting /// Phuse EU 201915

nnnnonnn

Input Stack

Word Scanner

SAS Program

SCL Program…

Display Manager…

……

Data Step Compiler

SCL CompilerCommand Processor

Macro Processor

todayDATA ;

date = "&sysdate9";RUN;

…SYSDATE9 13NOV2019

Symbol Table…

Macro Catalog

Page 16: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

…Program Flow – Basics

/// Macro Quoting /// Phuse EU 201916

nnnnnonn

Input Stack

Word Scanner

SAS Program

SCL Program…

Display Manager…

……

Data Step Compiler

SCL CompilerCommand Processor

Macro Processor

todayDATA ;date = "

&sysdate9

";RUN;

…SYSDATE9 13NOV2019

Symbol Table…

Macro Catalog

Page 17: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

…Program Flow – Basics

/// Macro Quoting /// Phuse EU 201917

nnnnnnon

Input Stack

Word Scanner

SAS Program

SCL Program…

Display Manager…

……

Data Step Compiler

SCL CompilerCommand Processor

Macro Processor

todayDATA ;date = "

& sysdate9

";RUN;

…SYSDATE9 13NOV2019

Symbol Table…

Macro Catalog

13NOV2019

Important!All &…, %... Macro-

Variables/Statements/Calls/Functions will be resolved at this point

Order%STR, %NRSTR

&..., %...%BQUOTE, %NRBQUOTE, %SUPERQ, …

Page 18: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Data Step Compiler

…Program Flow – Basics

/// Macro Quoting /// Phuse EU 201918

nnnnnnno

Input Stack

Word Scanner

SAS Program

SCL Program…

Display Manager…

……

SCL CompilerCommand Processor

Macro Processor

…SYSDATE9 13NOV2019

Symbol Table…

Macro Catalog

todayDATA ;date = "

";RUN

13NOV2019;

Important!All &…, %... Macro-

Variables/Statements/Calls/Functions will be resolved at this point

Order%STR, %NRSTR

&..., %...%BQUOTE, %NRBQUOTE, %SUPERQ, …

Page 19: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting - Timing

/// Macro Quoting /// Phuse EU 201919

onnnnnnn

Input StackWord Scanner

SAS Program

Data Step Compiler%MACRO selectDat( condition );%PUT %STR(Selection: KEEP=name team salary; WHERE=&condition.;);%UNQUOTE(KEEP name team salary; WHERE &condition.;)

%MEND selectDat;

%LET select=%STR(name="Carter, Joe");

DATA out;SET sashelp.baseball;

Macro Processor

…Symbol Table

…Macro Catalog

%selectDat(%BQUOTE(&select.))RUN;

Page 20: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting - Timing

/// Macro Quoting /// Phuse EU 201920

nonnnnnn

Input StackWord Scanner

SAS Program

Data Step Compiler%MACRO selectDat( condition );%PUT %STR(Selection: KEEP=name team salary; WHERE=&condition.;);%UNQUOTE(KEEP name team salary; WHERE &condition.;)

%MEND selectDat;

%LET select=%STR(name="Carter, Joe");

DATA out;SET sashelp.baseball;

Macro Processor

…Symbol Table

…Macro Catalog

%selectDat(%BQUOTE(&select.))RUN;

Compilation Execution Quoting %selectDat

Page 21: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting - Timing

/// Macro Quoting /// Phuse EU 201921

nnonnnnn

Input StackWord Scanner

SAS Program

Data Step Compiler%MACRO selectDat( condition );%PUT %STR(Selection: KEEP=name team salary; WHERE=&condition.;);%UNQUOTE(KEEP name team salary; WHERE &condition.;)

%MEND selectDat;

%LET select=%STR(name="Carter, Joe");

DATA out;SET sashelp.baseball;

Macro Processor

…Symbol Table

…Macro Catalog

%selectDat(%BQUOTE(&select.))RUN;

Compilation Execution Quoting %selectDat

Page 22: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting - Timing

/// Macro Quoting /// Phuse EU 201922

nnonnnnn

Input StackWord Scanner

SAS Program

Data Step Compiler%MACRO selectDat( condition );%PUT %STR(Selection: KEEP=name team salary; WHERE=&condition.;);%UNQUOTE(KEEP name team salary; WHERE &condition.;)

%MEND selectDat;

%LET select=%STR(name="Carter, Joe");

DATA out;SET sashelp.baseball;

Macro Processor

…Symbol Table

…Macro Catalog

%selectDat(%BQUOTE(&select.))RUN;

Compilation Execution Quoting %selectDat

Page 23: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting - Timing

/// Macro Quoting /// Phuse EU 201923

nnonnnnn

Input StackWord Scanner

SAS Program

Data Step Compiler%MACRO selectDat( condition );%PUT %STR(Selection: KEEP=name team salary; WHERE=&condition.;);%UNQUOTE(KEEP name team salary; WHERE &condition.;)

%MEND selectDat;

%LET select=%STR(name="Carter, Joe");

DATA out;SET sashelp.baseball;

Macro Processor

…Symbol Table

…Macro Catalog

%selectDat(%BQUOTE(&select.))RUN;

Compilation Execution Quoting %selectDat[G] select = name="Carter, Joe"

Page 24: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting - Timing

/// Macro Quoting /// Phuse EU 201924

nnnonnnn

Input StackWord Scanner

SAS Program

Data Step Compiler%MACRO selectDat( condition );%PUT %STR(Selection: KEEP=name team salary; WHERE=&condition.;);%UNQUOTE(KEEP name team salary; WHERE &condition.;)

%MEND selectDat;

%LET select=%STR(name="Carter, Joe");

DATA out;SET sashelp.baseball;%selectDat(%BQUOTE(&select.))

RUN;

Compilation Execution

DATA out;SET sashelp.baseball;

Macro Processor

…Symbol Table

…Macro Catalog

%selectDat[G] select = name="Carter, Joe"

Quoting

Page 25: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting - Timing

/// Macro Quoting /// Phuse EU 201925

nnnnonnn

Input StackWord Scanner

SAS Program

Data Step Compiler%MACRO selectDat( condition );%PUT %STR(Selection: KEEP=name team salary; WHERE=&condition.;);%UNQUOTE(KEEP name team salary; WHERE &condition.;)

%MEND selectDat;

%LET select=%STR(name="Carter, Joe");

DATA out;SET sashelp.baseball;%selectDat(%BQUOTE(&select.))

RUN;

Compilation Execution

DATA out;SET sashelp.baseball;

Macro Processor

…Symbol Table

…Macro Catalog

%selectDat[G] select = name="Carter, Joe"

Quoting

Page 26: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting - Timing

/// Macro Quoting /// Phuse EU 201926

nnnnonnn

Input StackWord Scanner

SAS Program

Data Step Compiler%MACRO selectDat( condition );%PUT %STR(Selection: KEEP=name team salary; WHERE=&condition.;);%UNQUOTE(KEEP name team salary; WHERE &condition.;)

%MEND selectDat;

%LET select=%STR(name="Carter, Joe");

DATA out;SET sashelp.baseball;%selectDat(%BQUOTE(&select.))

RUN;

Compilation Execution

DATA out;SET sashelp.baseball;

Macro Processor

…Symbol Table

…Macro Catalog

%selectDat[G] select = name="Carter, Joe"

Quoting

Page 27: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting - Timing

/// Macro Quoting /// Phuse EU 201927

nnnnnonn

Input StackWord Scanner

SAS Program

Data Step Compiler%MACRO selectDat( condition );%PUT %STR(Selection: KEEP=name team salary; WHERE=&condition.;);%UNQUOTE(KEEP name team salary; WHERE &condition.;)

%MEND selectDat;

%LET select=%STR(name="Carter, Joe");

DATA out;SET sashelp.baseball;%selectDat(%BQUOTE( name="Carter, Joe" ))

RUN;

Compilation Execution

DATA out;SET sashelp.baseball;

Macro Processor

…Symbol Table

…Macro Catalog

%selectDat[G] select = name="Carter, Joe"

Quoting

Page 28: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting - Timing

/// Macro Quoting /// Phuse EU 201928

nnnnnonn

Input StackWord Scanner

SAS Program

Data Step Compiler%MACRO selectDat( condition );%PUT %STR(Selection: KEEP=name team salary; WHERE=&condition.;);%UNQUOTE(KEEP name team salary; WHERE &condition.;)

%MEND selectDat;

%LET select=%STR(name="Carter, Joe");

DATA out;SET sashelp.baseball;%selectDat(%BQUOTE( name="Carter, Joe" ))

RUN;

Compilation Execution

DATA out;SET sashelp.baseball;

Macro Processor

…Symbol Table

…Macro Catalog

%selectDat[G] select = name="Carter, Joe"

Quoting

[L] condition = name="Carter, Joe"

Page 29: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Macro Quoting - Timing

/// Macro Quoting /// Phuse EU 201929

nnnnnnon

Input StackWord Scanner

SAS Program

Data Step Compiler%MACRO selectDat( condition );%PUT %STR(Selection: KEEP=name team salary; WHERE=&condition.;);%UNQUOTE(KEEP name team salary; WHERE &condition.;)

%MEND selectDat;

%LET select=%STR(name="Carter, Joe");

DATA out;SET sashelp.baseball;KEEP name team salary; WHERE name="Carter, Joe";

RUN;

Compilation Execution

DATA out;SET sashelp.baseball;

Macro Processor

…Symbol Table

…Macro Catalog

%selectDat[G] select = name="Carter, Joe"

Quoting

[L] condition = name="Carter, Joe"

Page 30: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

SAS Program

Data Step Compiler

Macro Quoting - Timing

/// Macro Quoting /// Phuse EU 201930

nnnnnnno

Input StackWord Scanner

%MACRO selectDat( condition );%PUT %STR(Selection: KEEP=name team salary; WHERE=&condition.;);%UNQUOTE(KEEP name team salary; WHERE &condition.;)

%MEND selectDat;

%LET select=%STR(name="Carter, Joe");

DATA out;SET sashelp.baseball;KEEP name team salary; WHERE name="Carter, Joe";

RUN;

Compilation Execution

DATA out;SET sashelp.baseball;

Macro Processor

…Symbol Table

…Macro Catalog

%selectDat[G] select = name="Carter, Joe"

Quoting

[L] condition = name="Carter, Joe"

KEEP name team salary;WHERE name="Carter, Joe";

RUN;

Page 31: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

%SUPERQ is theactual sister function

to %NRSTR

%STR and %NRSTRare used for masking

static text

There is rarely a situation where you

need to use%BQUOTE instead of

%NRBQUOTE

Both are workingalmost identically and

Warnings due tounresolved &.. %.. will also be displayed with

%NRBQUOTE

If there is an error in the log, but the log expression can be runwithout problems – often an %UNQUOTE over the whole

expression helps

%BQUOTE, %NRBQUOTE and %SUPERQ

are used for masking macrovariables/calls/etc.

Summary

/// Macro Quoting /// Phuse EU 201931

Compilation and Execution phasesof the data step have nothing to do

with Compilation and ExecutionTime of the Quoting functions

All masking takes place already inthe compilation phase of the data

step

%STR / %NRSTR workbefore resolution of the

macro triggers &, %All other Quoting functionswork after resolution of &, %

All quoted characterswill be unquoted

automatically whenthey leave the Word

Scanner

Page 32: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

///////////

Thanks!

Questions?Contact: [email protected]

Be glad when it‘s difficult,the easy things they do all.

-Peter Hohl-

© bulli-klinik-sacka.de

Page 33: Macro Quoting - lexjansen.comMacro Quoting Functions - Overview 5 /// Macro Quoting /// Phuse EU 2019 %NRSTR Masks groups A, B and C only with preceding % Difficulties with unmatched

Backup

/// Macro Quoting /// Phuse EU 201933

1 %MACRO selectDat( condition );2 %PUT %STR(Selection: KEEP=name team salary; WHERE=&condition.;);3 /* %UNQUOTE(KEEP name team salary; WHERE &condition.;) */4 KEEP name team salary; WHERE &condition.;6 %MEND selectDat;8 %LET select=%STR(name="Carter, Joe");11 DATA out;13 SET sashelp.baseball;14 %selectDat(%BQUOTE(&select.))Selection: KEEP=name team salary; WHERE=name="Carter, Joe";NOTE: Line generated by the macro variable "CONDITION".14 name="Carter, Joe"

_22

_76

ERROR: Syntax error while parsing WHERE clause.ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant, a missing value, (, *, +, -, :, INPUT, NOT, PUT, ^, ~.

ERROR 76-322: Syntax error, statement will be ignored.

15 RUN;