内建函数
虽然现在已经可以读取Q-表达式了,但它仍无任何用处。接下来我们将构建一些函数来操纵Q-表达式。
这些操作符将作用于我们的列表类型,所以设计要尽可能简洁。我们可以先定义一些简单的操作符,再以它们为基础来构建更复杂的,这样就可以不用添加额外的C代码。以下操作符将可以满足本书内容的需要:
list
接收一个或者多个参数,返回一个包含所有参数的Q-表达式head
接受一个Q-表达式,返回一个包含其第一个元素的Q-表达式tail
接受一个Q-表达式,返回一个除首元素外的Q-表达式join
接受一个或者多个Q-表达式,返回一个将其连在一起的Q-表达式eval
接受一个Q-表达式,将其看做一个S-表达式,并运行
如同我们前面加的数学运算符一样,这些新的操作符也需要加入到symbol
中。然后我们可以试着定义这些操作符的行为,就如上章中的buildin_op
。
mpca_lang(MPCA_LANG_DEFAULT,
" \
number : /-?[0-9]+/ ; \
symbol : \"list\" | \"head\" | \"tail\" \
| \"join\" | \"eval\" | '+' | '-' | '*' | '/' ; \
sexpr : '(' <expr>* ')' ; \
qexpr : '{' <expr>* '}' ; \
expr : <number> | <symbol> | <sexpr> | <qexpr> ; \
lispy : /^/ <expr>* /$/ ; \
",
Number, Symbol, Sexpr, Qexpr, Expr, Lispy)
当前内容版权归 NoahDragon 译 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 NoahDragon 译 .