写R语言的书,很多都会提到一个历史话题,就是“Scheme和R语言的关系”。也有很多人问过我,R究竟哪里受了Scheme或者Lisp影响。这个提问也正好提供了一个很好的例子。
“黑魔法”
今天咱们从set.seed()函数的源代码(如下所示)聊起。
可以明显看到提前定义的宏(checkArity、CADR、CADDR等)和函数的四个参数(call、op、args和env),当真正使用的时候,set.seed()貌似只有一个参数,比如set.seed(1)。
那这些“黑魔法”究竟是做什么的。
SEXP attribute_hidden do_setseed (SEXP call, SEXP op, SEXP args, SEXP env)
{
SEXP skind, nkind;
int seed;
checkArity(op, args);
if(!isNull(CAR(args))) {
seed = asInteger(CAR(args));
if (seed == NA_INTEGER)
error(_("supplied seed is not a valid integer"));
} else seed = TimeToSeed();
skind = CADR(args);
nkind = CADDR(args);
GetRNGkind(R_NilValue); /* pull RNG_kind, N01_kind from
.Random.seed if present */
if (!isNull(skind)) RNGkind((RNGtype) asInteger(