SAS 프로그래밍 언어는 아직 사용 오늘 1966에 투박한, 고대 언어 데이트 돌아왔다. 원래 컴파일러는 PL / I 로 작성되었으며 실제로 많은 구문은 PL / I에서 파생됩니다. SAS에는 또한 PL / I의 언어에서 파생되는 전 처리기 매크로 언어가 있습니다. 이 과제에서는 SAS 매크로 언어의 일부 간단한 요소를 해석하게됩니다.
SAS 매크로 언어에서 매크로 변수는 %let
키워드를 사용하여 정의 되며 로그에 인쇄는로 수행됩니다 %put
. 문장은 세미콜론으로 끝납니다. 여기 몇 가지 예가 있어요.
%let x = 5;
%let cool_beans =Cool beans;
%let what123=46.lel"{)-++;
매크로 변수 이름은 대소 문자를 구분하지 않으며 항상 정규식과 일치합니다 /[a-z_][a-z0-9_]*/i
. 이 도전의 목적을 위해 다음과 같이 말합니다.
- 매크로 변수는 인쇄 가능한 ASCII 문자의 전체 구성 값을 저장할 수 제외를
;
,&
그리고%
- 값에 선행 또는 후행 공백이 없습니다.
- 값은 255자를 초과하지 않습니다.
- 값이 비어있을 수 있습니다
- 값의 대괄호와 따옴표가 일치하지 않을 수 있습니다
- 이 이전과 이후 공간의 금액이 될 수
=
의%let
문이 공간은 무시한다 - 이 터미널 전에 공간의 금액이 될 수
;
의%let
문이 공간은 유사하게 무시해야
매크로 변수가 호출되면 해당 값으로 "해결"됩니다. 매크로 변수는 앞에 붙임으로써 해결됩니다 &
. 이 옵션 후행 .
식별자의 끝을 의미한다. 예를 들어
%put The value of x is &X..;
The value of x is 5.
로그에 씁니다 . 단일 기간이 소비되고 &X.
에 해결 되므로 두 기간이 필요 합니다 5
. 또한 x
소문자로 정의하더라도 매크로 변수 이름은 대소 문자를 구분하지 않기 때문에 &X
동일 &x
합니다.
까다로운 곳이 여기에 있습니다. &
변수를 해결하기 위해 여러 개의 변수를 함께 묶을 수 있으며 &
, 동일한 수준의 중첩 해석에서 동시에를 해결할 수 있습니다. 예를 들어
%let i = 1;
%let coolbeans1 = broseph;
%let broseph = 5;
%put &&coolbeans&i; /* Prints broseph */
%put &&&coolbeans&i; /* Prints 5 */
가장 안쪽이 &
먼저 해결되고 해상도가 바깥으로 계속됩니다. 변수 이름 일치는 탐욕스럽게 이루어집니다. 두 번째 %put
문장에서 프로세서는 다음 단계를 수행합니다.
&i
로 해결1
하고 가장 안쪽의 리드&
가 소비되어&&coolbeans1
&coolbeans1
에 해결broseph
우리를주고,&broseph
&broseph
로 해결됩니다5
.
후행 이 있으면 여러 개가 있어도 .
단 하나의 .
해상도 만 사용됩니다 &
.
직무
줄 %let
바꿈으로 구분 된 1-10 개의 명령문과 단일 %put
명령문이 제공되면 %put
명령문 의 결과를 인쇄하거나 리턴하십시오 . 모든 표준 방식으로 입력을 받아 들일 수 있습니다.
입력이 항상 유효하고 %let
명령문이 명령문보다 우선한다고 가정 할 수 있습니다 %put
. 정의 된 변수는 이후 %let
명령문 에서 다시 정의되지 않습니다 .
실제로 SAS에서 실행되는 경우 존재하지 않는 변수로 해석되는 변수에는 문제가 없으며 위에서 설명한대로 모든 것이 구문 적으로 정확합니다.
예
입력:
%let dude=stuff; %let stuff=bEaNs; %put &&dude..;
산출:
bEaNs.
입력:
%let __6 = 6__; %put __6&__6;
산출:
__66__
입력:
%let i=1; %let hOt1Dog = BUNS; %put &&HoT&i.Dog are FUNS&i!");
산출:
BUNS are FUNS1!")
입력:
%let x = {*':TT7d; %put SAS is weird.;
산출:
SAS is weird.
입력:
%let var1 = Hm?; %let var11 = var1; %let UNUSED = ; %put &&var11.....;
산출:
Hm?....
참고
&&var11
일치하는var11
이름 일치 욕심 때문이다. 이 있었다면.
, 즉&&var1.1
, 다음var1
일치 할 것이며, 여분의 1은 이름의 일부가 될 수 없다.
이것은 코드 골프이므로 바이트 단위의 최단 솔루션이 승리합니다!
&&&&&&&&&a......................
여전히 한주기를 제거 할 것인가?
&stuff.
마침표를 제거 하지 않아야 합니까?