SAS学习笔记7

大城市里の小女人 提交于 2020-03-07 21:39:32
一、简介 SAS通过宏过程可以把 数据步或者过程步的功能进行封装,在宏过程中可以定义参数,通过调用宏过程把实参传递给形参进行引用。宏过程就相当于关系数据库中的存储过程,调用时只需要知道宏过程名就可以,具体的内部如何实现不用了解,实现了程序的封装。 二、宏过程执行机制 对于宏语言,SAS有自己的内部处理机制,宏程序编写好后,首先进行宏编译,生成宏程序,调用时通过宏分析器解析,然后在编译过程中如果宏程序有错误,会在日志中显示。 宏执行的流程: SAS程序先提交进入缓冲区,然后通过字符扫描组件识别到宏程序,调用宏TOKEN解析器,TOKEN解析器的四个普通组件对宏程序进行解析,解析完成交给编译器编译程序,若有错误,程序编译阶段会在日志中显示错误信息,没有错误编译通过,用户通过调用宏语法,调用执行宏。 TOKEN解析器的四个组件及其功能如下: (1)Literal组件 Literal组件解析用单引号或双引号括起来的字符串,如'yang',"chang"。 (2)Number组件 Number组件解析数值类型、日期类型、时间类型和十六进制数值,如23、'20110323'd。 (3)Name组件 Name组件解析以字母或下划线开始的字符串,如c_b、_d。 (4)Special组件 Special组件解析一些特殊字符串或字符串组,如@、#、*、/、+、-、**、;、$、()、.、&、%、=等

verilog if(0) if(1) 小技巧

拥有回忆 提交于 2020-03-01 05:46:49
本文主要介绍verilog if(0),if(1)给verilog进行语法修正的功能。 verilog的语法太简单,一直是我们诟病的地方所在,想实现一个功能有的时候必须敲上大段功能重复的代码段,有的时候只是其中的某个参量发生变化。这个时候懒惰的我们就会想出一种解决方案,好在verilog标准里(1995,2001)标准里都有对宏的支持。众所周知,宏的作用就是生成代码,有了宏的帮助我们就可以将大量重复的功能放入宏中,然后在程序中直接写上一句宏即可。这样做的好处是,对我们整体代码以及综合后的结果没有任何影响,因为宏在编译的时候就已展开。 ok利用宏已经可以解放我们少许工作量了。我模拟了下面这样的一个场景。 always @(posedge clk) begin case(counter) 32'd1: begin answer=1/3; signal=0;signal=1;end 32'd2: begin answer=2/3; signal=0;signal=1;end 32'd3: begin answer=3/3; signal=0;signal=1;end ... 32'd16: begin answer=16/3;signal=0;signal=1;end endcase end 不要去想这个例子的功能是什么,这个不是我们的重点,我想制造的就是每个case里面包含多句

iOS 开发中常用的宏

匆匆过客 提交于 2020-03-01 03:26:35
#ifndef FingerTips_Macro_Config_h #define FingerTips_Macro_Config_h //获取屏幕 宽度、高度 #define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width) #define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height) //DEBUG 模式下打印日志,当前行 #ifdef DEBUG #define NSLog(format, ...) do { \ fprintf(stderr, "<%s : %d> %s\n", \ [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], \ __LINE__, __func__); \ (NSLog)((format), ##__VA_ARGS__); \ fprintf(stderr, "-------\n"); \ } while (0) #else #define NSLog(...) #endif //判断是否 Retina屏、设备是否%fhone 5、是否是iPad #define isRetina ([UIScreen