我有全局变量 &project_path ,需要编写宏%set_path
来创建另一个相等的全局变量&project_path\parameter
。在我的例子中,新变量的名称必须是parameter_path。我是 SAS 宏的新手,据我所知,它们不能像普通函数一样返回值,所以我不能做类似的事情log_path=%set_path(log)
?所以我必须传递一个新变量作为参数, %set_path(log_path, log)
但是我不能使 log_path 全局化?如何解决这个问题呢?
我想出的方法是根据参数设置新变量的名称。但是,只有添加前缀才有效。我需要一个后缀。无论如何,总的来说,这看起来不是最好的选择
%macro set_path(sub_dir);
%global &sub_dirSet;
%let &sub_dirSet = &project_path\&sub_dir;
%mend set_path;
%set_path(data);
%set_path(log);
%put &dataSet;
%put &logSet;
当然我尝试过类似的东西
%macro set_path(var_name, sub_dir);
%global var_name;
%let var_name = &project_path\&sub_dir;
%macro set_path;
但据我了解,这是根本错误的
作为一般编码模式,避免创建大量全局宏变量通常是一个好主意。但是对于如何添加后缀的问题,您可以使用 a
.
来结束宏变量引用并添加后缀。所以我认为你的方法适用于:这是错误的:
因为您不能创建与现有局部宏变量同名的全局宏变量。即使可以,也无法使用 %LET 语句为其赋值,因为局部宏变量将优先。
但这并不是您真正想要做的。 相反,您想使用参数的 VALUE 作为全局宏变量的名称。