问题标签 [gambit]

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 回答
679 浏览

pointers - 无法获得指向在 Gambit-C 方案的 FFI 中工作的指针的指针

我正在使用 Gambit-C 包装我的图形引擎 API,并且到目前为止在 FFI 方面取得了成功。今天我遇到了一个我无法轻易解决的新问题。

我在C中有这样的结构:

在 C 语言中,我还有一系列由宏定义的函数,用于添加常见的列表行为。然后最终看起来像这样:

在 C 中,您可以有一个为 NULL 的 render_list_item*,但可以将其传递给此函数的第一个参数,它实际上会为您创建列表的头部。

我的问题是我无法让这种行为在 Gambit-C 的 FFI 中起作用。我最终创建了这样的东西:

当我运行它时,它会出现段错误。经调查,render-list-add-item过程的___arg1NULL。无论我尝试什么,我都无法在 FFI 中获得有效的(指针(pointer))。

我有什么遗漏的吗?

==================================================== ==========

一个完整的方案示例:

编译:

给出输出:

==================================================== ==========

编辑:

Felix:你能举一些例子来说明你是如何调用 render-list-add-item 的吗?

用于此的 C 代码如下所示:

它是基于sglib的列表实现。当这些传递一个指向空指针的指针时,如上所述,它会创建一个新的列表项作为列表的头部,以便 *ui_render_list 指向它。

方案代码看起来像这样(从内存中输入):

希望有类似的行为。从查看文档看来,在 C API 中有 #f 会转换为 NULL,但我认为 (pointer (pointer)) 可能会抓住这一点。即使传递绑定到某物的变量也总是会导致 NULL 值。我通过在(c-declare)中创建一个简单地打印指针地址的函数来测试这一点:

如果你想看到我的完整包装器在运行,你可以在这里查看这个提交

===========================================

如何让(指针(pointer))工作的问题仍然存在。但我认为,为了更快的结果,以及与其他语言更好的互操作性,我将重写我的 C 列表宏来定义一个列表结构,该结构将包含指向列表头/尾的指针,如“掌握 C 算法”中所示. 这样就不需要指向指针的指针。

0 投票
2 回答
560 浏览

scheme - 方案中的 n arity zip 函数(应用和映射问题)

我在列表列表上调用 map 时遇到问题。

这就是我们想要的,但我无法通过可调用函数来实现它。

编辑——(map (lambda x x) '(1 2) '(3 4) '(5 6))给出相同的结果!

我可以看到传递给 zip 的参数变成一个列表的问题,但我不知道继续像对待工作版本一样对待它们。

我不确定如何apply与地图一起使用

这是有道理的,因为 map 没有调用任何东西。;; 但是我们如何将 map 应用于 map 调用 fold 函数的相同参数?

这与第一次尝试相同。我确定(...希望)我在这里遗漏了一些小东西。

0 投票
1 回答
924 浏览

scheme - Gambit-C 方案中的定义宏命名空间

四个模块:

  1. 定义库函数
  2. 定义使用库函数的库宏
  3. 定义使用库宏的应用程序函数
  4. 加载其他三个

libfunc.scm:

libmacro.scm:

libapp.scm

libmain.scm

从另一个可行的方案移植到不可行的 Gambit-C。我开始认为这是不可能的。Gambit-C 有##define-macro并且##namespace可能是相关的,但无处记录且无法使用谷歌搜索。我在 Meroon 中发现的一件事,它是一个可跨多种方案移植的大型库,是用于解决 Gambit-C 的代码。

编辑:我认为 Meroon 的作者 Christian Queinnec 很好地处理了这些问题。他写了我所知道的关于 Scheme 模块的 23 件事。我觉得如果我同时说法语和 Scheme,它会给我所有的答案。

编辑 2:我查看了原始方案,该方案几乎是为运行我要移植的系统而构建的。事实证明他们作弊。从 a 调用的每个“函数”define-macro在 C 中都有一个影子实现,它附加到宏全局命名空间。这可能是我可以在 Gambit-C 中复制的一个技巧,因为它非常面向 C,但我仍在研究这种可能性。

我不知道是否可以define使用语法大小写从宏中正常调用 d 函数。我找不到任何易于理解的内容(大多数文档似乎是由 phds 编写并为 phds 编写的),但是有一个非常有趣的教程define-syntaxsyntax-case它表明您可以将任何函数实现为宏。它甚至在宏中实现了一个基本的 Lisp。所以这是一些事情。JRM 的语法规则入门

编辑 3:就像@GoZoner 所说,这可以使用for-syntaxand来完成define-syntax,至少在 Racket 中。它是否可以在 Gambit-C 中工作还有待观察

(require (for-syntax ...是魔法发生的地方。球拍有它。Gambit-C 没有。

0 投票
2 回答
649 浏览

racket - R5RS 方案中定义语法的可移植加载/包含?

我正在尝试编写适用于 DrRacket/plt-r5rs 和 Gambit/gsi 的东西。

我遇到的问题是(load "foo.scm")在 Gambit 中不加载define-syntax-blocks。在 Gambit 中使用(include "foo.scm")有效,但在 DrRacket 中当然会导致语法错误。

有什么办法可以解决这个问题,以便我可以编写可移植的 R5RS 代码?

我尝试过的事情:

  • 重新定义(include "foo.scm")(load "foo.scm")反之亦然。问题:在 Gambit 中重新定义宏是非法的。
  • 将所述重新定义包装在(if gambit ...). 问题:在 if 中放置定义是非法的(除非在另一个定义中)。
  • 将带有文件名的字符串传递给库文件中的包含。问题:Gambit 中的包含似乎发生在解释开始之前。
0 投票
1 回答
107 浏览

scheme - Gambit 方案对带小数的数字的计算不正确

我正在使用 gambit-c 解释器来评估方案算术运算,但它的结果有点偏离。例如,我执行 (+ 23 20.01),它给了我 43.010000000000005,而不是 43.01。

仅当我使用带 2 个小数点的数字时才会发生这种情况。

有解决办法吗?

0 投票
1 回答
597 浏览

functional-programming - 编写方案函数

如何编写一个函数,该函数将评分函数(我已经写过)和字符串对列表作为输入(我对如何编写感到困惑),并返回修改后的字符串对列表,其中返回的列表应包含输入中的所有最佳字符串对,根据输入函数评分。

示例输入:

示例输出:

该函数采用如上所示的字符串对列表。它还接受一个函数。它使用这个函数作为评估字符串对列表的一种手段。然后,它返回一个字符串对列表,其中包含所有匹配分数最高的字符串对,这些字符串对基于它被赋予的用于评估它们的函数。换句话说,(("hello" "b_low") ("hello_" "b_l_ow") ("hello" "_blow")) 的分数都相同,都是 -3,但是 ("h_e_llo" "bl_o__w"))得分为-12,因此从列表中删除。

计算alignemt的函数:

0 投票
1 回答
234 浏览

lambda - 在 R5RS 方案中是否有使用“λ”字符作为“lambda”的宏?

在 R5RS 方案中是否有使用“λ”字符作为“lambda”的宏?从这里在 Gambit "scheme-r5rs" 我试过:

但我不断收到Ill-formed expression错误。

0 投票
1 回答
62 浏览

scheme - 从 Gambit Scheme Interpreter 到文件的管道测试/跟踪

如果我处理,例如:

例如,我使用 (square 5) 对其进行测试,如何将此结果从 Gambit Scheme 解释器传输到文本文件?

0 投票
1 回答
195 浏览

c - Gambit-C 方案:无法加载 Windows dll

我在使用 Gambit-C Scheme 动态加载 Windows 共享库时遇到了麻烦。

目录结构:

GSC 命令:

我已经在纯编译的 C 中对其进行了测试,并在那里加载。谢谢你。

0 投票
1 回答
92 浏览

scheme - 'flonum' 和有什么不一样?和“##flonum?” 在 Gambit Scheme 中?

我看到“##flonum?” 在 LambdaNative 中的计算器应用程序的源代码中。