问题标签 [ecl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
531 浏览

lisp - 如何分发 asdf/quicklisp 依赖项以及使用 Embeddable Common Lisp 编译的应用程序?

我已经尝试过这个示例ECL 存储库 asdf 示例,它工作正常,但它没有任何 asdf 依赖项。如果我添加

:depends-on (#:inferior-shell)

到 example.asd 然后运行编译的独立可执行文件出现此错误

是什么导致了这个错误,处理 asdf 对ECL的依赖的惯用方法是什么?

0 投票
1 回答
174 浏览

windows - 可嵌入的 Common-Lisp asdf:defsystem 返回无效的相对路径名

我正在尝试学习如何使用 Common-Lisp 的 asdf,并且我有以下代码:

但是,我不断收到错误消息:

我在与这两个 Lisp 文件相同的目录中启动 repl,但我不明白为什么会出现错误。我错过了什么?我在 Windows 上使用 ECL

0 投票
1 回答
392 浏览

windows - asdf:make-build on Windows fails

I have the following files

example.asd:

first.lisp:

second.lisp:

I can successfully load the system, but doing (asdf:make-build :example :type :program :move-here ".") gives the following error:

LINK : fatal error LNK1149: output filename matches input filename 'C:\path\to\example.lib'

Is there something I'm not configuring properly? It seems to be creating example.lib, then making example.exe link example.lib, and cl does not like them being named the same. Is there a way to specify the name of the resulting executable? Or is this just a bug in ECL's asdf:make-build?

I'm using ECL on Windows 10 with Visual Studio 2015's developer tools.

0 投票
4 回答
888 浏览

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

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

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

可以通过这种方式使用数字来做到这一点:

电汇:

用 C++ 读取和打印:

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

电汇:

C++:

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

一个字符串:0x3188b00

我猜是字符串的地址。

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

调试

0 投票
0 回答
673 浏览

common-lisp - 如何将 *standard-input* 和 *standard-output* 重定向到另一个 PTY、FIFO 或套接字?

我想知道是否可以重定向 ECL 的 Linux stdio,使其不与嵌入的应用程序共享流。

我的问题是主机应用程序出于自己的目的接管了标准输入、标准输出和标准错误。所以,我想有一个单独的控制台来处理 lisp 噪音,并在 SLIME/SWANK 崩溃回到顶层时进行恢复。目前 SWANK hiccups 将CL-USER> 提示放入应用程序调试日志中,C opperation (read) signalled an errorstdout 的失败被重定向,stdin 很可能被父进程关闭或使用。

我知道你可以setf *standand-output*等到一个新的流,但我还没有找到一种方法来附加一个终端,比如屏幕或 xterm 或套接字。我需要底层的 Linux/C 文件描述符,然后我可以制作一个 PTY。

如果有某种方法可以将标准流附加到我可以使用 telnet 连接到的套接字服务器上,那就更好了。

更新

根据评论中的建议,我尝试了以下代码:

它并没有完成这项工作。问题是,虽然一些 IO 被重定向 SWANK,但似乎仍然有办法获取真正的流。我想这需要一些研究才能弄清楚 SWANK 是如何做到的。哦,便利的高价!

更新 2

我的错。没有*standard-error*,只有*error-output*。你能告诉我我对 Lisp 很陌生吗?

现在,一切都被重定向了。不过,SLIME 现在不会和 SWANK 说话了,有点违背了目的……

更新 3

胜利!在连接 SLIME 之前,您需要在终端中运行类似以下的 shell 脚本来创建您的顶级 shell:

原因,我猜不出来。但幸运的是它仍然有效。

顺便说一句,不要阻止任何想要发布更好答案的人

我确信有人可以制作一个套接字服务器或屏幕分离的 PTY,无论是否有人在看它们,都可以让流保持快乐。那将是一个更经典的解决方案。

0 投票
1 回答
100 浏览

common-lisp - 为什么 (probe-file #P"/") 返回 nil?

这似乎可能是 ECL 实现中的一个错误——或者由于标准中的一些细节:

还有一个案例:

更新,FWIW,SBCL 符合我的期望:

0 投票
1 回答
447 浏览

c++ - 在 C++ 中将 ECL 符号名称作为字符串获取

我正在将 Embeddable Common Lisp 嵌入到一个库中,并且我一直在编写实用函数来将 ECL 转换cl_object为各种 C/C++ 类型——例如,将cl_object表示字符串的字符串转换为 std::string。

我的问题是——为什么我无法在 ECL 中检索到包含符号名称的字符串?

我无法让以下函数ecl_symbol_to_string正常工作,它应该采用 ECL 符号并返回一个 std::string 及其名称:

请注意,这ecl_string_to_string适用于 lisp 字符串。

一个简单的单元测试说明了失败:

此测试用例会打印出来MM以调用 cout。我还尝试与失败的“MYSYMBOL”和通过的“M”进行比较。

LispRuntime::eval_script 简单地转换和评估形式:

我在本地编译了 ECL 版本 16.1.3,启用了 C++ 选项、调试符号和所有其他默认设置。非常感谢任何帮助。

0 投票
1 回答
159 浏览

common-lisp - 当回溯缺少信息时调试 Quicklisp

快速加载失败时您的一般方法是什么?我想我想知道引发问题的那一行,但我得到的只是一个回溯,其中引用了一个字节编译函数。我应该如何确定导致问题的包、文件和表单?

更新

我的环境是 Emacs 中的 ECL。回溯由 SLIME 调试器提供。

0 投票
1 回答
458 浏览

common-lisp - Embeddable Common Lisp (ECL):使用扩展函数加载共享库

是否可以在 ECL 中加载共享库,导入一些接收和返回的 C 函数cl_object(好像它们是用 定义的ecl_def_c_function())并在 REPL 中调用它们(不编译 *.lisp 文件)?

例如:

正如我发现没有办法告诉 ECL(通过 UFFI)C 函数处理cl_object,而不是常规指针(void*)

0 投票
3 回答
1018 浏览

common-lisp - 使用 ECL 构建可执行文件:缺少依赖项或在 asdf/interface 中找不到 make-build

我正在尝试使用 ECL 构建可执行文件。我查看了文档和其他SO 问题,我们了解到使用 ECL v <= 16.1.3 我们必须添加一个

然后我将我的项目推送到 asdf 注册表:

我加载它:

我的程序显然有 Quicklisp 依赖项。

我将 Quicklisp 的初始化从我的复制.sbclrc~/.eclrc

所以我可以快速加载我的项目:(此步骤未出现在文档中,但这允许找到项目依赖项)

我也

但现在,因为我想构建可执行文件

我得到错误

在#<"ASDF/INTERFACE" package> 中找不到外部符号 MAKE-BUILD。

有人可以帮忙吗?谢谢 !

ECL 16.1.3

ps:而且好像,在REPL中,进入重启nb是没有效果的。


我的生成文件:

结果:


10 月 27 日编辑 - 进度

现在最简单的路径似乎不确定是否使用捆绑到 ECL 中的 ASDF,这将具有该make-build命令。

由于我的 Quicklisp 的初始化代码为~/.eclrc. 我删除了它,现在我有了 ASDF v3.1.8.2,没关系。但是现在,ECL 不知道任何依赖项:

组件 :DEXADOR 未找到,# 需要。

确实,因为不再有 Quicklisp。

ECL 文档说将所有库路径包含到asdf:*central-registry*. 一次偶然的机会,Quicklisp 将所有库安装到~/quicklisp/dists/quicklisp/software/.

首先,我想知道这将如何在 Quicklisp 之前没有运行过的 CI 管道中工作……</p>

然后我看到只添加这个目录是不够的,Dexador的依赖又会找不到,我必须精确地添加dexador的目录:

那么我真的必须编写代码来包含这里的每个目录吗?

当 Quicklisp 以前没有运行过一次时如何使这项工作?

更新:使用与 Roswell 一起安装的 Ecl:require在我的 .eclrc 中的所有内容之前输入 asdf,在 Quicklisp 初始化 3.2.1 和make-build符号未知之后给出版本 3.1.8.2。

使用 Debian 的 Ecl:首先是 v2.33.10,然后是 v3.2.1。

看起来像一个死胡同。

11 月更新:我等待 ASDF 3.3.0 的发布来手动更新。这是越野车。邮件列表上的消息:等待 3.3.1:再次出现错误。

使用lisp-devel Docker 镜像,发布 ECL 16.1.3。(我不想在每个 VPS 上自己编译 ECL)。我可以构建一个可执行文件(重量为 52Mo),但出现运行时错误:

类型条件:在 > 编译文件 NIL 中引用但尚未创建的 SIMPLE-ERROR 包 ((UIOP/STREAM . #))