问题标签 [r6rs]
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.
scheme - 截至 2016 年,是否有方案实施支持 100% 的 R7RS(小)且没有偏差?
我愿意学习Scheme。我想坚持使用 R7RS,因为它是最后一个标准。但是,Scheme 当前的实现似乎存在很多碎片,其中大多数停留在 R5RS 或 R6RS 的一部分。
我发现唯一支持 R7RS 部分的是 Kawa,但由于它在 JVM 上运行,它不支持尾调用优化,这是反对该实现的一个强项。
Scheme 世界真的那么支离破碎,甚至还没有 R7RS 的完整实现吗?我在问,因为如果没有,一旦我赶上,我就打算建一个;但是,如果存在的话,最好不要重新发明轮子并为该特定实施做出贡献。
请,如果您有信息,我将不胜感激,不仅可以回答姓名,还可以提供适当的进一步信息(实施的官方网站,甚至邮件组的摘录都可以作为参考)。
顺便说一句,我不考虑 Racket,因为它不再是真正的 Scheme。
lambda - “将过程与 lambda 表达式和符号区分开来”有什么好处?
我正在阅读 r6rs(Revised6 Report on the Algorithmic Language Scheme),在“介绍”部分有一个总结:
“Scheme 是 Lisp 的第一个主要方言,用于区分过程与 lambda 表达式和符号,为所有变量使用单一的词法环境,并以与操作数位置相同的方式评估过程调用的运算符位置。”
我的问题是:
“将过程与 lambda 表达式和符号区分开来”有什么好处?
什么是单一的词汇环境?我的理解是,由于词法范围,Scheme 中的所有内容都是“词法”,没有运行时范围,源代码中的位置/位置更多地意味着环境。
如何理解“以与操作数位置相同的方式评估过程调用的运算符位置”?我的理解是运算符位置的符号被评估为操作数位置。例如:
"(if (> x 0) + -)" 在操作符位置,它的求值与其他操作数位置的求值相同。
scheme - 构造子记录类型时的 Arity 不匹配
我有一个point
定义如下的记录类型:
现在,我想扩展point
记录类型并定义一个新的记录类型,如下所示:
当我在方案外壳中运行上述定义时,一切正常。我可以point
正确地构造类型。但是,当我尝试cpoint
按如下方式构造类型时:
我收到以下错误:
; ...rfi/9/record.rkt:100:28: 数量不匹配;;预期的参数数量与给定数量不匹配;预期:1;给定:3;[,bt 用于上下文]
我认为既然cpoint
是 的子级,它应该在其构造函数中point
接受类型的参数。point
我怎样才能使这项工作?
PS我是Scheme的新手。
racket - 如何延迟 DrRacket 中的图像交换?
我正在尝试在 DrRacket 中为我的游戏制作动画,当我按下左键时,我希望我的图像做一个跑步动画(腿打开 --> 腿闭合)。有没有办法可以延迟图像交换?计算机进行交换的速度非常快,以至于您看不到交换发生。-->
谢谢
macros - 检查标识符是否在宏扩展点被词法绑定?
这可能是一个新手问题,但我正在尝试编写一个宏来检测标识符是否在宏扩展点被词法绑定,并相应地更改其输出。这在 R6RS 方案中是否可行,如果可以,如何实现?
为什么我想知道
我正在使用宏在 Chez Scheme 中编写一个玩具 Objective-C 绑定层,我最初的挑战是有效地处理 Objective-C 选择器。程序必须在运行时查询 Objective-C 运行时,以获取SEL
对应于每个选择器名称的实际对象。程序中使用的选择器名称在扩展期间将是静态已知的,并且很容易让我的宏插入该查询代码,但我想避免重复查询相同的选择器名称。
SEL
我对此的第一个想法是对绑定到外部对象的方案定义有一些命名约定。这样,我可以(define)
为每个唯一的选择器设置一个,因此每个选择器都有一个运行时查询。这取决于我的宏能够检测到任何给定选择器的这些绑定,并在它们不存在时引入它们,因此是我的问题。
这个解决方案仍然不完美,因为我的宏可能会在内部范围内扩展,但这对我来说是最明显的。有没有更好的方法在扩展时“实习”表达式?
debugging - 将方案对象序列化为字符串
执行 (display obj) 时,输出会显示一个很好的表示。但是有可能将这种表示形式捕获到字符串中吗? 我可以使用它来更好地处理调试信息。
我能得到的最接近的是将对象显示为 .txt,然后将其作为字符串读回:
scheme - Racket R6RS 支持:语法案例
这个简单的 R6RS 程序:
适用于 Chez、Guile 和 Ypsilon,但不适用于 Racket。它给了我这个:
test.scm:7:3: lambda: 变压器环境中的未绑定标识符;
此外,没有绑定 #%app 语法转换器
我的问题是,R6RS 是坏了还是我必须做其他事情?我正在使用 6.12 版本进行测试。
scheme - R6RS:应用于空列表的语法表达式形式是否返回包装的语法对象?
考虑 R6RS 方案中的以下表达式:
当我在 Racket 中键入这个表达式时,会返回一个(包装的)语法对象。另一方面,相同的表达式在 Chez Scheme 中产生(展开的)空列表。
我想知道哪个系统符合 R6RS(或者标准是否允许这两种行为)。R6RS 中的相关段落是解析输入并产生输出。在那里,它说:
语法产生的输出根据以下规则进行包装或解包......不包含任何模式变量的任何部分的副本都是一个包装的语法对象。
在(syntax ())
模板中不包含任何模式变量,所以看起来结果应该是一个包装的语法对象,并且 Racket 是对的。
另一方面,Chez Scheme 的作者 R. Kent Dybvig 是该syntax-case
系统的发明者之一,因此人们期望 Chez Scheme 严格遵循该标准。
matrix - 旋转矩阵,为什么它不能作为函数工作,但它可以在行命令中工作?
旋转矩阵的一种方法是对其进行转置,然后反转所有行。我用两个函数解决了这个问题,map(返回转置)和 reverse(完成 90° 旋转),在控制台中我执行以下操作:
(reverse (apply map list (list (list 1 2 3 4) (list 5 6 7 8) (list 9 10 11 12) (list 13 14 15 16)))
没错,但是当我创建一个函数时,它不起作用。
然后做:
它只是抛出一个错误:
mcar:预期违反合同:mpair?给定:()
我试过导入 (srfi :41) (我也在 r6rs 上工作)但它也不起作用。不过,此函数适用于 3 x 3 矩阵。
我怎样才能解决这个问题?
scheme - 卫生宏 r7rs:返回第二个表达式值
我目前正在学习一些 r7rs,我正在尝试实现一个宏“开始”,如下所示:
expr 是一个正则表达式(Like (set!x (+ x 1)))
begin0 作为一个宏,它计算所有表达式但只返回 expr1 结果。
例如 :
它必须返回 2018
我首先创建了一个开始函数:
现在,我试图了解如何返回 "body-expr-1" 的值?我已经完成了以下代码,但它说我遗漏了一些省略号,我不明白该怎么做。
我希望它是可以理解的,谢谢你的回答。