我正在将 Embeddable Common Lisp 嵌入到一个库中,并且我一直在编写实用函数来将 ECL 转换cl_object
为各种 C/C++ 类型——例如,将cl_object
表示字符串的字符串转换为 std::string。
我的问题是——为什么我无法在 ECL 中检索到包含符号名称的字符串?
我无法让以下函数ecl_symbol_to_string
正常工作,它应该采用 ECL 符号并返回一个 std::string 及其名称:
string ecl_symbol_to_string(cl_object sym) {
return ecl_string_to_string(sym->symbol.name);
}
string ecl_string_to_string(cl_object echar) {
string res("");
int j = echar->string.dim; //get dimension
ecl_character* selv = echar->string.self; //get pointer
//do simple pointer addition
for(int i=0;i<j;i++){
res += (*(selv+i));
}
return res;
};
请注意,这ecl_string_to_string
适用于 lisp 字符串。
一个简单的单元测试说明了失败:
TEST_CASE( "ecl_symbol_to_string returns a string for symbol",
"[ecl_string_to_string]" ) {
LispRuntime *rt = new LispRuntime("()");
std::string eval_script;
cl_object eval_result;
std::string subject_result;
eval_script = "'mysymbol";
eval_result = rt->evaluate(eval_script);
REQUIRE( ECL_SYMBOLP(eval_result) );
subject_result = ecl_symbol_to_string(eval_result);
REQUIRE ( ECL_STRINGP(cl_symbol_name(eval_result)) );
std::cout << subject_result.c_str() << std::endl;
REQUIRE( subject_result.compare("mysymbol") == 0 );
delete rt;
}
此测试用例会打印出来MM
以调用 cout。我还尝试与失败的“MYSYMBOL”和通过的“M”进行比较。
LispRuntime::eval_script 简单地转换和评估形式:
cl_object LispRuntime::evaluate(std::string &code) {
cl_object form = c_string_to_object(code.c_str());
cl_object result = cl_eval(form);
return result;
}
我在本地编译了 ECL 版本 16.1.3,启用了 C++ 选项、调试符号和所有其他默认设置。非常感谢任何帮助。