今回は、なんと、if
だけです。なぜかというと、and
, or
, cond
はスペシャルオペレーターではなくマクロだからですね。大丈夫です。もうmy-lisp2の中にはand
, or
, cond
をマクロとして入れることができましたので、今回はサラッと流していきましょう。
ソースコード
built_in_func.c
op_if
関数はスペシャルオペレーターif
の実体です。
built_in_func.c
void *op_if(void *args, void *env_func, void *env_var) {
void *test_form = car(args);
void *then_form = car(cdr(args));
void *else_form = car(cdr(cdr(args)));
void *val;
size_t len = list_length(args);
if (len <= 1) {
fprintf(stderr, "IF: 引数が少なすぎます\n");
state = STATE_ERROR;
return 0;
} else if (len >= 4) {
fprintf(stderr, "IF: 引数が多すぎます\n");
state = STATE_ERROR;
return 0;
}
val = eval(test_form, env_func, env_var);
if (!val) return 0;
if (val != NIL) {
return eval(then_form, env_func, env_var);
} else {
return eval(else_form, env_func, env_var);
}
}
動かしてみよう
if
だけ増やしても、大したことはできないです...
> (if 1 2 3)
2
> (if nil 2 3)
3
> (if (> 2 1) "おめでとう" "残念")
"おめでとう"