问题标签 [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.
macros - Scheme 中的宏和内部定义
Freenode 的#scheme 频道上提出了一个很好的问题。考虑 Scheme 中的以下代码:
beta
、gamma
和中的哪些delta
应该产生语法错误?哪一个呢?我已经用 Chibi Scheme 进行了检查,在哪里beta
都可以,但gamma
失败delta
了。我想知道这是有意的行为还是只是 Chibi 中的错误。
根据标准,似乎应该在内部定义被重写之前扩展宏letrec*
。因此beta
,gamma
两者都应该失败,因为foo
将匹配内部定义alpha
的,而不是全局的。
但是,标准中没有明确规定内部定义的实际工作方式,只是可以将它们视为 letrec 快捷方式。我在 Racket 的 R5RS 上得到了相同的行为,所以我似乎在标准中遗漏了一些需要这种行为的东西。
scheme - 截至 2016 年,是否有方案实施支持 100% 的 R7RS(小)且没有偏差?
我愿意学习Scheme。我想坚持使用 R7RS,因为它是最后一个标准。但是,Scheme 当前的实现似乎存在很多碎片,其中大多数停留在 R5RS 或 R6RS 的一部分。
我发现唯一支持 R7RS 部分的是 Kawa,但由于它在 JVM 上运行,它不支持尾调用优化,这是反对该实现的一个强项。
Scheme 世界真的那么支离破碎,甚至还没有 R7RS 的完整实现吗?我在问,因为如果没有,一旦我赶上,我就打算建一个;但是,如果存在的话,最好不要重新发明轮子并为该特定实施做出贡献。
请,如果您有信息,我将不胜感激,不仅可以回答姓名,还可以提供适当的进一步信息(实施的官方网站,甚至邮件组的摘录都可以作为参考)。
顺便说一句,我不考虑 Racket,因为它不再是真正的 Scheme。
scheme - 加载和包含在方案 R7RS 中的区别
在方案 R7RS 中既有 aload
又有include
形式。
包括描述为:
语义:include 和 include-ci 都采用一个或多个文件名表示为字符串文字,应用特定于实现的算法来查找相应的文件,按照指定的顺序读取文件的内容,就像通过重复应用 read 一样,有效地重新- 将 include 或 include-ci 表达式与 begin 表达式一起放置,该表达式包含从文件中读取的内容。两者的区别在于 include-ci 读取每个文件,就好像它以 #!fold-case 指令开头一样,而 include 不是。注意:鼓励实现在包含包含文件的目录中搜索文件,并为用户提供一种方法来指定要搜索的其他目录。
负载描述为:
依赖于实现的操作用于将文件名转换为包含方案源代码的现有文件的名称。加载过程从文件中读取表达式和定义,并在 environment-specifier 指定的环境中按顺序评估它们。如果省略 environment-specifier,则假定为 (interaction-environment)。未指定是否打印表达式的结果。加载过程不影响 current-input-port 和 current-output-port 返回的值。它返回一个未指定的值。理由:为了可移植性,加载必须对源文件进行操作。它对其他类型文件的操作必然因实现而异。
这两种形式的基本原理是什么?我认为这是历史性的。两种形式之间是否有任何导入语义差异?我看到load
可以选择包含环境说明符,include
但没有。并且include-ci
没有直接等价的 using load
。但是单独比较load
,include
有什么区别,重要吗?
scheme - 带有盗窃 r7rs 的 Gensym 程序
在larceny r7r6
for 方案下,我正在尝试使用该gensym
过程,因为它显然在文档中定义。
调用它时(在文件中或通过键入在控制台中larceny -r7r6
),我收到一条错误消息,指出 gensym 是一个未定义的全局变量。
我忘记了导入还是不可用?有没有我可以在任何地方找到的新名称或实现?
macros - 重新定义内置方案,但仅在用作特定过程的参数时?
and
只有当它作为过程的参数调用时,我才能重新定义过程fetch
?
例如:
我想编写一个宏来执行此操作,但我不知道如何编写与and
传递给的任意参数树中任何位置匹配的模式fetch
。
我正在使用 Chicken 并且很高兴使用尽可能多的 R7RS 作为 Chicken 支持的。
scheme - 卫生宏 r7rs:返回第二个表达式值
我目前正在学习一些 r7rs,我正在尝试实现一个宏“开始”,如下所示:
expr 是一个正则表达式(Like (set!x (+ x 1)))
begin0 作为一个宏,它计算所有表达式但只返回 expr1 结果。
例如 :
它必须返回 2018
我首先创建了一个开始函数:
现在,我试图了解如何返回 "body-expr-1" 的值?我已经完成了以下代码,但它说我遗漏了一些省略号,我不明白该怎么做。
我希望它是可以理解的,谢谢你的回答。
scheme - 列表的 cdr 是否总是 eqv?
我正在为 R7RS Scheme 编写一个解释器,以更全面地了解 Scheme 编程语言。
据我了解,如果两个列表参数都表示内存中的相同位置,则eqv?
必须返回。#t
但是,我不确定cdr
列表的 是否必须始终为 eqv:
我的知识中缺少的部分是cdr
特定列表的 是否必须始终指向特定位置。对于一个特定的列表,cdr
每次在列表上调用它时必须总是返回一个相同的子列表,还是可以返回一个全新的子列表?
(我知道我可以使用现有的 Scheme 解释器凭经验对此进行测试,但我主要对标准要求的内容感兴趣)。
scheme - R7RS-small 中的有效标识符是什么?
R7RS-small 表示所有标识符都必须由分隔符终止,但同时它为标识符中的内容定义了非常详细的规则。那么是哪一个呢?
是一个标识符应该以一个初始字符开始,然后一直持续到一个分隔符,还是它以一个初始字符开始并继续遵循 7.1.1 中定义的语法。
这里有几个明显的案例。这些是有效的标识符吗?
a#a
b,b
c'c
d[d]
如果它们不应该是有效的,那么说标识符必须由分隔符终止的目的是什么?
scheme - 如何(eval ...)在鸡 r7rs 库中?
我正在尝试在鸡蛋eval
库中获得基本的工作。r7rs
以下顶级(非库)程序在运行时按我的预期工作csi -R r7rs
:
这也适用于(null-environment 5)
(但不适用于(environment '(scheme base) ...)
变体)。但是,在库中:
我明白了
可能是什么问题呢?Wiki中的 R7RS 环境似乎存在一些问题,但我不确定这是否与此处相关。
用鸡版本 5.2.0(自制包)测试,csi
和csc
.