gpt4 book ai didi

common-lisp - 将字符串从 ECL 传递给 C++

转载 作者:行者123 更新时间:2023-12-04 03:03:56 28 4
gpt4 key购买 nike

我正在尝试进入 C++ 中嵌入的 Common Lisp 的迷人世界。我的问题是我无法从 C++ 读取和打印由 ECL 中定义的 lisp 函数返回的字符串。

在 C++ 中,我有这个函数来运行任意 Lisp 表达式:

cl_object lisp(const std::string & call) {
return cl_safe_eval(c_string_to_object(call.c_str()), Cnil, Cnil);
}

可以通过以下方式使用数字来完成 :

ECL:
(defun return-a-number () 5.2)

在 C++ 中读取和打印:
auto x = ecl_to_float(lisp("(return-a-number)"));
std::cout << "The number is " << x << std::endl;

一切都设置好并且工作正常,但我不知道用字符串而不是数字来做。这是我尝试过的:

ECL:
(defun return-a-string () "Hello")

C++:
 cl_object y = lisp("(return-a-string)");
std::cout << "A string: " << y << std::endl;

打印字符串的结果是这样的:

字符串:0x3188b00

我猜是字符串的地址。

这是调试器的捕获和 y cl_object 的内容。 y->string.self 类型是一个 ecl_character。

Debug

最佳答案

(从@coredump 的回答开始,即 string.self 字段提供了结果。)
string.self 字段被定义为 ecl_character* (ecl/object.h) 类型,它似乎在 ecl/config.h 中作为 int 类型给出(尽管我怀疑这有点依赖于平台)。因此,您将无法将其打印为字符数组。

我发现对我有用的方法是将它重新解释为 wchar_t(即 unicode 字符)。不幸的是,我有理由确定这不是可移植的,并且取决于 ecl 的配置方式和 C++ 编译器。

// basic check that this should work
static_assert(sizeof(ecl_character)==sizeof(wchar_t),"sizes must be the same");

std::wcout << "A string: " << reinterpret_cast<wchar_t*>(y->string.self) << std::endl;
// prints hello, as required
// note the use of wcout

另一种方法是使用 lisp 类型 base-string,它确实使用 char(lisp 中的 base-char)作为其字符类型。 lisp 代码然后读取
(defun return-a-base-string ()
(coerce "Hello" 'base-string))

(可能有更优雅的方法来转换为 base-string 但我不知道它们)。

在 C++ 中打印
cl_object y2 = lisp("(return-a-base-string)");
std::cout << "Another: " << y2->base_string.self << std::endl;

(注意不能在同一个程序中混用 wcoutcout)

关于common-lisp - 将字符串从 ECL 传递给 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36019502/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com