这里是我的一点看法,欢迎拍砖。
经过几个月艰苦的学习,现在也会写一些小程序了。不过,说心里话,写SAS程序,累死我了。
SAS语言的上下文可读性不强。我认为,SAS作为一门编程语言,这是不是很出彩的一块。SAS编程一般分两大部分,一是数据部分,二是程序部分。load数据之后,接着就是proc,如果不是专门写SAS程序的人来看SAS程序,根本看不出到底这两块有什么逻辑关系。至少是从文字上看不出的。这和一般的编程语言,比如C/C++,Java等等比起来,可读性差了很多。
以上仅是我个人的想法,有不对的地方欢迎矫正。
如果你有更好的学习这门编程语言的方法,务必分享一下吖。
这里所说的“联系”是指,数据步与程序步之间的联系,以及这两步内在的联系。这些联系在程序的文字上很难看得出。这里我举个例子:
data li1;
input id $ name $ height weight@@;
cards;
1 tom 187 75
2 cendy 169 57
3 mcdonald 189 85
;
run;
proc means data=li1;
var height weight;
run;
在这里我们考察这段比较典型的SAS程序内在的联系。
先考察数据步:
1.首先是分号的问题,SAS语句,除了数据块之外,其它的地方句子的末尾都要加上分号;,如果有其它语言的编程经验,会存在很多的误解。以为“这件事情到此就结束了”。比如,你看到data li1;,这句后面存在分号,就会认为data li1与后面的句子没有联系了。事实上,一直到run,都是有联系的。这是有其它语言的编程经验所不能理解的。
2.在数据步中 data li1,在这里,一个有编程经验的人很怀疑data 是不是一种数据类型。如果是数据类型,应该是针对一个数据的有机构成单位来说的。如果说这是一个集合类型,但是,无论是拿出一个记录还是记录中数据的个体,这些都是允许重复的,所以,data也不能看作一种集合。由于存在着存取指令等等一些其它的东西,更不能把data看作是一种数据类型,至少不是封装的很好的数据类型。
3.数据步中存在run,程序步中也有run,一个程序体内存在两个run,这让人觉得很奇怪,就像程序运行了两次一样。如果有C/C++编程经验,这很容易看成一个C/C++程序存在着两个要执行的return语句一样。
4.
input id $ name $ height weight@@;
cards;
1 tom 187 75
2 cendy 169 57
3 mcdonald 189 85
;
这一句,中间有一个cards,就是因为这一cards,让人经常觉得input id $ name $ height weight@@;与下面的那些数据没有任何联系。
再考察程序步:
proc means data=li1;
var height weight;
run;
1.首先是声明变量的问题。一般的编程语言,都是“先声明,后使用”,在这里,var height weight;竟然存在于最后,给人一种不伦不类的感觉,并且,如果没有写SAS程序的经验,你也不会知道height weight与数据之间有什么关系,特别是你写的数据步很长,后面接了很多的语句才写下数据步的run,更是让你丈二的和尚摸不着头脑了。
2.proc means data=li1,这一句话,在数据步中,存在着 data li1,这里又写上 data=li1,不是很了解的人就会问,这到底算是声明还是赋值?
同一种语言中,如果存在关键词为data,并且data li1与data=li1都成立,这是编程语言设计的大忌。因为这会产生语义混乱。
一些题外话:
SAS的程序编辑窗口比较弱智。当然,存在的关键词也就是那些统计模块外加一些不痛不痒的data proc之类的关键词,但是编辑窗口可否再智能一些?不要只是在我写下关键词之后才要么变成粗体,要么变成红色,这一变化的存在确实必要,但是当我写对关键词之后再给我变成粗体,总有一种“事后的诸葛亮”的感觉。能否存在关键词补全的这样一种功能?