问题标签 [r7rs]
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 - Chibi Scheme - 简单的定义库示例不起作用
我编写了以下示例,以尝试在 Chibi Scheme 0.5.3 中使用 R7RS 库:
不幸的是,在执行时,它会生成有关未定义变量的错误:
我一定是犯了一个简单的错误,但没有看到。有任何想法吗?
scheme - 球拍/基础命名空间
任何人都知道racket/base
语言中包含什么。我希望将racket/base
命名空间定义与 R7RS 草案进行比较,以第一手了解 Racket 与 Scheme 的不同之处。
scheme - 什么时候可以覆盖(R7RS)方案中的顶级绑定?
我已经阅读了即将发布的 R7RS 方案标准(小语言)的当前草案,但我不明白在什么情况下重新定义顶级绑定不是错误。
我想可以定义或设置!第二次在程序顶层引入的绑定。但是从外部库导入绑定呢?是否可以通过标准覆盖这些绑定?
在报告的第 26/27 页上,它说:
程序的顶层也可能包括导入声明。在库声明中,使用不同的绑定多次导入相同的标识符,或者使用 define、define-syntax 或 set! 重新定义或改变导入的绑定是错误的。但是,REPL 应该允许这些操作。
这是否意味着在导入绑定的库中确实发生重新定义时只是一个错误?
我知道如果编译器不知道说+是否仍然意味着内置添加或任何其他用户指定的错误,它会禁止编译器进行优化。但是从这个角度来看,在库级别限制禁止重新绑定是没有意义的,因为它(至少)对于程序中的导入绑定也是有意义的。
PS:因为这都是关于计划程序的环境:我是否正确地说环境不是一等公民,因为人们无法掌握当前的环境?(这反过来又允许编译的程序忘记选择的绑定名称。)
macros - 方案:将宏定义内部的定义传递给子宏?
考虑 R7RS 方案中的以下宏定义:
我已将此文件加载到 repl 中chibi-scheme
并输入:
>(富吧)
>(酒吧)
而不是预期的输出42
,我得到:
错误:未定义的变量:baz
为什么会这样?如何baz
将外部宏中定义的值传递给内部宏?
reflection - R7RS 方案的反射能力
R7RS 关于编程语言 Scheme 的报告描述了在 Scheme 系统中运行 Scheme 代码的两种方式:
1)方案系统可以运行报告中5.1节所述的程序。
2) 一个方案系统可以提供一个读取-评估-打印-循环,其中方案代码被交互解释。
我的问题是如何将这两种运行方案代码的方式反映在方案系统中,其中包含 R7RS 报告中包含的内容。
有 eval 库过程eval
,它在正在运行的 Scheme 系统中执行 Scheme 代码,所以eval
看起来像我正在搜索的内容。
但是,我可以插入的唯一有保证的可变环境是repl 库过程eval
返回的环境。interaction-environment
但是,有了这个,我不能可靠地模拟 REPL(上面的第 2 点),因为 REPL 允许导入表单,而eval
过程不必这样做。
另外,由于其他原因,我不能使用交互环境来eval
编写完整的 Scheme 程序:它通常不是空的,特别是它包含(scheme base)
.
为了实现 1) 在运行的 Scheme 系统中,eval 库过程environment
看起来很有希望,因为它允许预先导入库(这是运行程序的一部分)。但是,环境是不可变的,所以我无法评估define
环境中的 s 。一种出路是将要运行的程序的主体包装在一个lambda
表单中,以便define
定义局部变量。然而,这也行不通:在lambda
表单内部,所有定义都必须出现在主体的开头(这对于 Scheme 程序的顶层而言并非如此),并且在lambda
表单库内部,绑定可以在词法上被覆盖,这顶级绑定是不可能的。
由于 Scheme 是图灵完备的,我当然可以在运行的 Scheme 系统中模拟一个 Scheme 系统,但我想知道仅使用该eval
过程是否有可能。我感兴趣的一个原因是它eval
可能会被优化(例如,通过 JIT 编译器后端),所以使用这个过程可能会提供接近本机的速度(与手动编写简单的解释器相比)。
scheme - 在 R7RS Scheme 中模拟一个一流的库
我正在考虑为 Scheme 实现类似 Dylan 的对象系统。(最好是完全可移植的 R7RS 方案。)在 Dylan 中有一个密封类的概念:不能从定义类的模块之外的密封类继承。
将 R7RS 库视为模块似乎很自然。但是,R7RS Scheme 中的库是静态的:在运行时不会保留任何关于它们的内容。从库中导入绑定后,它似乎与所有其他绑定无法区分。
好吧,这是sealed
实现的问题。假设一个类是由某种define-class
形式创建的。这种形式有效地扩展成类似的东西
然后<new-class>
绑定可以从创建它的库中导出,并导入到其他库中(可能使用不同的名称)。假设我们<new-class>
在库 A 中创建了一个密封并将其导入库 B。make
从 B 调用如何判断它是否可以创建后代<new-class>
?以及如何make
允许从 A 调用<new-class>
无条件地创建子类?
(让我们忽略这种方法的一个缺点:R7RS 允许<new-class>
多次加载库,这有效地创建了几个不同的<new-class>
类对象。我真的不知道如何解决这个问题。)
一个想法是将所有类定义包含在一个表单中:
dylan-module
可以继承其中定义的密封类,但是一旦表单结束,它们就真正被密封了。但是,我想出了一种方法来实现这一点:
它是这样使用的:
它的愚蠢之处在于:
用户需要拼出
define-class
正确地重新定义它(在 Dylan 中,泛型函数也可以被密封,所以define-generic
之后会出现);泛型
make
无法以安全的方式创建密封类,define-class
应始终使用宏(或其他一些特殊情况)。
module - Scheme库被*加载*意味着什么?计划库何时*加载*?
我正在研究关于算法语言方案的修订版7报告。我的问题是关于第 5.6 节库。
在本节中,它说:
加载库时,其表达式按文本顺序执行。如果以程序或库主体的扩展形式引用库的定义,则必须在评估扩展的程序或库主体之前加载该库。该规则可传递地应用。如果一个库被多个程序或库导入,它可能会被加载额外的次数。
这是什么意思?这是否意味着仅当实际引用导入的标识符或已经在库是扩展程序或库的导入集的一部分时才加载库?如果同一个库被同一个程序导入的两个其他库引用,该库是加载两次还是只加载一次?
由于库的加载可能会由于其表达式的执行而产生副作用,这些问题的答案对我来说似乎很重要。另外,是否共享导入第三个库其内部全局变量的两个库?
我用 chibi-scheme 做了一些实验:每个程序,chibi-scheme 只加载每个库一次,即使它的导出标识符都没有被实际引用。事实上,这对我来说似乎是一件明智且易于实施的事情。
PS:还有一点我认为规范有点含糊:如果在程序中,导入集导入了一个名为 的标识符,会发生什么import
?这是否意味着紧随其后的行(import ...)
被解释为命令或定义(取决于导入的标识符import
代表什么)或仍然作为导入集?
PPS:在一个顶级程序中允许多个进口申报的原因是什么?
scheme - 为什么Scheme需要过程位置标签的特殊概念?
为什么Scheme需要过程位置标签的特殊概念?
标准说:
作为评估 lambda 表达式的结果而创建的每个过程(在概念上)都标记有存储位置,以便生成 eqv? 和情商?程序工作
eqv? 过程返回 #t 如果:
- obj1 和 obj2 是位置标记相等的过程
情商?和eqv?保证在...程序上具有相同的行为...
但同时:
变量和对象(例如对、向量和字符串)隐式表示位置或位置序列
eqv? 过程返回 #t 如果:
- obj1 和 obj2 是表示存储中相同位置的对、向量或字符串
情商?和eqv?保证在 ... 对 ... 和非空字符串和向量上具有相同的行为
为什么不将“隐式表示位置或位置序列”也应用于程序呢?
我认为这也与他们有关,我认为这方面的
程序没有什么特别之处
inheritance - 是否可以在 Scheme 中“扩展”函数/lambda/宏?
例如:如果我想让函数equal?
识别我自己的类型或记录,我可以添加一个新的行为equal?
吗?不擦除或覆盖旧的?
或者例如,如果我想让函数"+"
也接受字符串?
scheme - 方案 r7rs-large 很有趣,但是……它还在进行中吗?
我正在尝试查看 r7rs large 的状态,但我在方案报告页面等中找不到任何信息,这只是 2013 年的一次谈话。我也用谷歌搜索但没有成功。
- 它还活着吗?
- 我在哪里可以找到信息?
- 暂定日期是什么时候?
- 目前有什么进展?
谢谢。