Much quality. Many standards. The Macro Core library exists to save time and development effort! Herein ye shall find a veritable host of MIT-licenced, production quality SAS macros. These are a mix of tools, utilities, functions and code generators that are useful in the context of Application Development on the SAS platform (eg https://datacontroller.io). Contributions are welcome.
You can download and compile them all in just two lines of SAS code:
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc;
Documentation: https://core.sasjs.io
mf_
, mp_
mddl_(lib)_
-> where lib can be "SAS" (in relation to a SAS component) or "DC" (in relation to a Data Controller component)This library will not be used for storing data entries (such as formats or datalines). Where this becomes necessary in the future, a new repo will be created, in order to keep the NPM bundle size down (for the benefit of those looking to embed purely macros in their applications).
mcf_
The fcmp macros are used to generate fcmp functions, and can be used with or without the proc fcmp
wrapper.
Wait - this is a macro library - what is LUA doing here? Well, it is a little known fact that you CAN run LUA within a SAS Macro. It has to be written to a text file with a .lua
extension, from where you can %include
it. So, without using the proc lua
wrapper.
To contribute, simply write your freeform LUA in the LUA folder. Then run the build.py
, which will convert all files with a ".lua" extension into a macro wrapper with an ml_
prefix (embedding the necessary data step put statements). You can then use your module in any program by running:
/* compile the lua module */
%ml_yourmodule()
/* Execute. Do not use the restart keyword! */
proc lua;
submit;
print(yourStuff);
endsubmit;
run;
ml_
Macros used in SAS EBI, which connect to the metadata server.
mm_
mmx_
These macros are used for building applications using @sasjs/server - an open source REST API for Desktop SAS.
ms_
Macros used for interfacing with SAS Viya.
mv_
, mvf_
Sometimes it is helpful to use a macro that can be used interchangeably regardless of the server type on which is is running (SASVIYA, SAS9, SASJS).
mx_
First, download the repo to a location your SAS system can access. Then update your sasautos path to include the components you wish to have available, eg:
%let repoloc=/your/path/core;
options insert=(sasautos="&repoloc/base");
options insert=(sasautos="&repoloc/ddl");
options insert=(sasautos="&repoloc/fcmp");
options insert=(sasautos="&repoloc/lua");
options insert=(sasautos="&repoloc/meta");
options insert=(sasautos="&repoloc/metax");
options insert=(sasautos="&repoloc/server");
options insert=(sasautos="&repoloc/viya");
options insert=(sasautos="&repoloc/xplatform");
The above can be done directly in your sas program, via an autoexec, or an initialisation program.
Alternatively - for quick access - simply run the following! This file contains all the macros.
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc;
The Macro Core documentation is created using doxygen. A full list of attributes can be found here but the following are most relevant:
All macros must be commented in the doxygen format, to enable the online documentation.
SAS code can contain one of two types of dependency - SAS Macros, and SAS Includes. When compiling projects using the SASjs CLI the doxygen header is scanned for @li
items under the following headers:
<h4> SAS Macros </h4>
@li mf_nobs.sas
@li mm_assignlib.sas
<h4> SAS Includes </h4>
@li somefile.ddl SOMEFREF
@li someprogram.sas FREFTWO
The CLI can then extract all the dependencies and insert as precode (SAS Macros) or in a temp engine fileref (SAS Includes) when creating SAS Jobs and Services (and Tests).
When contributing to this library, it is therefore important to ensure that all dependencies are listed in the header in this format.
&var
not &var.
) unless necessary to prevent incorrect resolution%mend;
should not contain the macro name.%macro x();
not %macro x;
work.blah
, not blah
). This is to avoid contention when options DATASTMTCHK=ALLKEYWORDS is in effect, or the USER library is active.data ; set sashelp.class; run; data &output; set &syslast; run;
&sasjs_prefix
- see mp_init.sasquit;
for proc sql
is optional unless you are looking to benefit from the timing statistics.We are currently on major release v4. Breaking changes should be marked with the deprecated doxygen tag. The following changes are planned when the next major/breaking release (v5) becomes necessary:
insert_cmplib
option of mcf_xxx macros will be deprecated (the option is now checked automatically with value inserted only if needed)wrap=
option defaulted to YES for convenience. Set this option explicitly to avoid issues.ddl
folder (which are already available)If you find this library useful, please leave a star and help us grow our star graph!
The following repositories are also worth checking out:
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!