索引函数
我们所有的内建函数都已定义。现在需要一个函数,根据提供的symbol
来调用相应的方法。这里我们可以用strcmp
和strstr
来实现。
lval* builtin(lval* a, char* func) {
if (strcmp("list", func) == 0) { return builtin_list(a); }
if (strcmp("head", func) == 0) { return builtin_head(a); }
if (strcmp("tail", func) == 0) { return builtin_tail(a); }
if (strcmp("join", func) == 0) { return builtin_join(a); }
if (strcmp("eval", func) == 0) { return builtin_eval(a); }
if (strstr("+-/*", func)) { return builtin_op(a, func); }
lval_del(a);
return lval_err("Unknown Function!");
}
同时修改早先lval_eval_sexpr
函数来调用新的buildin
。
/* Call builtin with operator */
lval* result = builtin(v, f->sym);
lval_del(f);
return result;
现在我们已经全面支持Q-表达式了。编译并运行最新的代码,试试新定义的操作符吧。现在我们可以将S-表达式加在Q-表达式中。这表明我们可以将代码看做是数据。这是Lisp语言不同于其它语言所特有的。
lispy> list 1 2 3 4
{1 2 3 4}
lispy> {head (list 1 2 3 4)}
{head (list 1 2 3 4)}
lispy> eval {head (list 1 2 3 4)}
{1}
lispy> tail {tail tail tail}
{tail tail}
lispy> eval (tail {tail tail {5 6 7}})
{6 7}
lispy> eval (head {(+ 1 2) (+ 10 20)})
3
当前内容版权归 NoahDragon 译 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 NoahDragon 译 .