问题标签 [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.
pointers - 无法获得指向在 Gambit-C 方案的 FFI 中工作的指针的指针
我正在使用 Gambit-C 包装我的图形引擎 API,并且到目前为止在 FFI 方面取得了成功。今天我遇到了一个我无法轻易解决的新问题。
我在C中有这样的结构:
在 C 语言中,我还有一系列由宏定义的函数,用于添加常见的列表行为。然后最终看起来像这样:
在 C 中,您可以有一个为 NULL 的 render_list_item*,但可以将其传递给此函数的第一个参数,它实际上会为您创建列表的头部。
我的问题是我无法让这种行为在 Gambit-C 的 FFI 中起作用。我最终创建了这样的东西:
当我运行它时,它会出现段错误。经调查,render-list-add-item过程的___arg1为NULL。无论我尝试什么,我都无法在 FFI 中获得有效的(指针(pointer))。
我有什么遗漏的吗?
==================================================== ==========
一个完整的方案示例:
编译:
给出输出:
==================================================== ==========
编辑:
Felix:你能举一些例子来说明你是如何调用 render-list-add-item 的吗?
用于此的 C 代码如下所示:
它是基于sglib的列表实现。当这些传递一个指向空指针的指针时,如上所述,它会创建一个新的列表项作为列表的头部,以便 *ui_render_list 指向它。
方案代码看起来像这样(从内存中输入):
希望有类似的行为。从查看文档看来,在 C API 中有 #f 会转换为 NULL,但我认为 (pointer (pointer)) 可能会抓住这一点。即使传递绑定到某物的变量也总是会导致 NULL 值。我通过在(c-declare)中创建一个简单地打印指针地址的函数来测试这一点:
如果你想看到我的完整包装器在运行,你可以在这里查看这个提交
===========================================
如何让(指针(pointer))工作的问题仍然存在。但我认为,为了更快的结果,以及与其他语言更好的互操作性,我将重写我的 C 列表宏来定义一个列表结构,该结构将包含指向列表头/尾的指针,如“掌握 C 算法”中所示. 这样就不需要指向指针的指针。
scheme - 方案中的 n arity zip 函数(应用和映射问题)
我在列表列表上调用 map 时遇到问题。
这就是我们想要的,但我无法通过可调用函数来实现它。
编辑——(map (lambda x x) '(1 2) '(3 4) '(5 6))
给出相同的结果!
我可以看到传递给 zip 的参数变成一个列表的问题,但我不知道继续像对待工作版本一样对待它们。
我不确定如何apply
与地图一起使用
这是有道理的,因为 map 没有调用任何东西。;; 但是我们如何将 map 应用于 map 调用 fold 函数的相同参数?
这与第一次尝试相同。我确定(...希望)我在这里遗漏了一些小东西。
scheme - Gambit-C 方案中的定义宏命名空间
四个模块:
- 定义库函数
- 定义使用库函数的库宏
- 定义使用库宏的应用程序函数
- 加载其他三个
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-syntax
,syntax-case
它表明您可以将任何函数实现为宏。它甚至在宏中实现了一个基本的 Lisp。所以这是一些事情。JRM 的语法规则入门
编辑 3:就像@GoZoner 所说,这可以使用for-syntax
and来完成define-syntax
,至少在 Racket 中。它是否可以在 Gambit-C 中工作还有待观察
(require (for-syntax ...
是魔法发生的地方。球拍有它。Gambit-C 没有。
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 中的包含似乎发生在解释开始之前。
scheme - Gambit 方案对带小数的数字的计算不正确
我正在使用 gambit-c 解释器来评估方案算术运算,但它的结果有点偏离。例如,我执行 (+ 23 20.01),它给了我 43.010000000000005,而不是 43.01。
仅当我使用带 2 个小数点的数字时才会发生这种情况。
有解决办法吗?
functional-programming - 编写方案函数
如何编写一个函数,该函数将评分函数(我已经写过)和字符串对列表作为输入(我对如何编写感到困惑),并返回修改后的字符串对列表,其中返回的列表应包含输入中的所有最佳字符串对,根据输入函数评分。
示例输入:
示例输出:
该函数采用如上所示的字符串对列表。它还接受一个函数。它使用这个函数作为评估字符串对列表的一种手段。然后,它返回一个字符串对列表,其中包含所有匹配分数最高的字符串对,这些字符串对基于它被赋予的用于评估它们的函数。换句话说,(("hello" "b_low") ("hello_" "b_l_ow") ("hello" "_blow")) 的分数都相同,都是 -3,但是 ("h_e_llo" "bl_o__w"))得分为-12,因此从列表中删除。
计算alignemt的函数:
lambda - 在 R5RS 方案中是否有使用“λ”字符作为“lambda”的宏?
在 R5RS 方案中是否有使用“λ”字符作为“lambda”的宏?从这里在 Gambit "scheme-r5rs" 我试过:
但我不断收到Ill-formed expression
错误。
scheme - 从 Gambit Scheme Interpreter 到文件的管道测试/跟踪
如果我处理,例如:
例如,我使用 (square 5) 对其进行测试,如何将此结果从 Gambit Scheme 解释器传输到文本文件?
c - Gambit-C 方案:无法加载 Windows dll
我在使用 Gambit-C Scheme 动态加载 Windows 共享库时遇到了麻烦。
目录结构:
GSC 命令:
我已经在纯编译的 C 中对其进行了测试,并在那里加载。谢谢你。
scheme - 'flonum' 和有什么不一样?和“##flonum?” 在 Gambit Scheme 中?
我看到“##flonum?” 在 LambdaNative 中的计算器应用程序的源代码中。