字符串类型
当用户加载文件时,我们需要其提供一个由文件名组成的字符串。 我们的语言现在支持符号类型,但仍然不支持包含空格以及其他字符的字符串类型。 我们需要添加字符串类型的lval
来指定我们所需的文件名。
像在其他章节中一样,我们通过在枚举中添加新条目并添加新的lval
来表示字符串类型的数据。
enum { LVAL_ERR, LVAL_NUM, LVAL_SYM, LVAL_STR,
LVAL_FUN, LVAL_SEXPR, LVAL_QEXPR };
/* Basic */
long num;
char* err;
char* sym;
char* str;
接下来我们添加字符串类型lval
的构造函数,这与符号构造函数的实现方式非常相似。
lval* lval_str(char* s) {
lval* v = malloc(sizeof(lval));
v->type = LVAL_STR;
v->str = malloc(strlen(s) + 1);
strcpy(v->str, s);
return v;
}
我们还需要将字符串类型lval
添加到所有处理lval
的函数中。
对于 删除…
case LVAL_STR: free(v->str); break;
对于 复制…
case LVAL_STR: x->str = malloc(strlen(v->str) + 1);
strcpy(x->str, v->str); break;
对于 相等…
case LVAL_STR: return (strcmp(x->str, y->str) == 0);
对于 类型名…
case LVAL_STR: return "String";
在此,我们需要做一些额外工作来实现字符串打印函数。 Lispy内部存储字符串与所打印字符串有所区别。 我们希望在打印用户所输入的字符串时,会使用转义字符(如\n
)来表示新行。
因此,我们需要在打印字符串之前将其转义。 幸运的是,我们可以使用mpc
函数来为我们做这件事。
在打印函数中,我们添加以下内容…
case LVAL_STR: lval_print_str(v); break;
以及…
void lval_print_str(lval* v) {
/* Make a Copy of the string */
char* escaped = malloc(strlen(v->str)+1);
strcpy(escaped, v->str);
/* Pass it through the escape function */
escaped = mpcf_escape(escaped);
/* Print it between " characters */
printf("\"%s\"", escaped);
/* free the copied string */
free(escaped);
}
当前内容版权归 NoahDragon 译 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 NoahDragon 译 .