问题标签 [chez-scheme]
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 - 如何在 Chez Scheme 中输入密码?
我想在 Chez Scheme 中编写一个简单的文件加密/解密程序,使用 Chez Scheme 的脚本功能从 Unix 命令行运行程序。为此,我需要输入密钥。我想提示用户在键盘上输入键,但是用星号而不是键的字母回显到屏幕上。换句话说,与程序的交互应该如下所示:
如何使终端进入原始模式,以便在键入时不回显密钥?
runtime-error - 翻转列表中的元组时,方案错误显示“尝试应用非程序”
我正在阅读一本关于编程语言的教科书,其中一个练习是在 Scheme 中创建一个函数来翻转列表中的元组。这是我的代码:
我尝试在 chez-scheme 中测试我的程序。当我在用法注释中使用测试用例时,出现此错误:Exception: attempt to apply non-procedure (a 1)
. 我以前从未使用过 Scheme,所以我非常感谢任何帮助和建议。谢谢!
scheme - 为什么我在方案中的惰性过滤列表会消耗这么多内存?
我目前正在学习使用方案的一些更高级的功能,并且我遇到了惰性列表的障碍。
基本上,我正在尝试创建一个无限的、延迟生成的列表,并在其上应用一个延迟过滤器,并且只采用一个元素。我希望这会消耗很少的内存:过滤器一次只查看一个元素,并且不需要存储以前的条目。这是我的尝试:
因此,需要明确的是,这里的“惰性列表”是一个过程,当(force)
d 产生时(head . tail)
,其中head
是列表中的一个值,并且tail
是列表的其余部分(需要依次强制执行)。我不知道这是否是方案中的“标准”惰性列表或其他什么,但它是对我来说最有意义的变体。
该(lazy-arithmetic-sequence a b)
函数(懒惰地)产生无限列表a, a+b, a+2b, a+3b, ...
该lazy-filter
函数是问题的核心:它接受一个谓词和一个惰性列表,并返回一个包含所有过滤元素的惰性列表。强制时,它会通过输入列表找到应该包含的第一个元素,然后返回该元素与列表其余部分的惰性过滤器相结合。
为了测试这一点,我运行了这一行:
这当然是一个相当无意义的过滤器(“在这个列表中从 0 到无穷大找到值 10 亿的元素”),但重点是测试代码。问题是这会消耗大量内存。几秒钟之内,它就达到了许多 GB,而且没有任何减速的迹象,我不明白为什么。
我不明白为什么垃圾收集器不回收从列表中产生的内存。循环lazy-filter
是尾递归的,并且没有其他对惰性列表的引用,所以我觉得 GC 应该只是吞噬所有内存。为了确保我什至制作了一个在惰性过滤器循环的每次迭代中都运行垃圾收集器的版本,当然它没有帮助。
我的怀疑是,列表的头部有一些我没有看到的参考。就像,由delay
in 惰性过滤器创建的闭包以某种方式使seq
引用徘徊,或者其他什么。
我怎样才能重写它以不消耗无限量的内存?
如果这有什么不同,我正在运行 Chez Scheme,但我怀疑问题出在我身上,而不是方案实施
scheme - 为什么这个表达式的计算结果为 4 (call/cc)
抱歉,这个简单的延续示例的计算结果为 4,但我不知道为什么:
Chez 计划 9.5.3
scheme - Chez Scheme 的 SRFI 实现
我是 Chez 的新手,考虑到现有的各种维护和未维护的存储库,我只是想弄清楚一些。
是否有一个常用的首选源代码库来获取 R6RS SRFI 库(专门用于 Chez Scheme)?
我知道https://srfi.schemers.org/非常适合搜索单个 SRFI 文档,并且有所有文档和一些方案代码的 tgz,但是 tgz 上没有版本或发布信息(尽管时间戳建议它是最新的https://srfi.schemers.org/srfi.tgz)。
对于 R6RS,我可以在以下 repo 下 找到大多数 SRFI 作为单独的 repos,这对于获取所有代码并不是很实用: https ://github.com/scheme-requests-for-implementation
然后是各种其他回购,例如:
https://github.com/arcfide/chez-srfi
https://github.com/ovenpasta/thunderchez
https://github.com/dharmatech/surfage
https://bazaar.launchpad.net/~scheme-libraries-team/scheme-libraries/srfi/files
唯一最近有活动的,幸运的是,似乎也以 Chez 为重点,似乎是 chez-srfi 和 Thunderchez。
chez-srfi 似乎是最近活跃的,一旦我确定了运行的要求link-dirs.chezscheme.sps
,然后将chez-srfi
目录软链接到srfi
它似乎可以使用标准导入引用 - (import (srfi :N lib))
。
也就是说,我(import (srfi sN lib))
使用 Thunderchez 也取得了类似的成功。
我完全不知道我使用哪个存储库,只要它易于使用并积极保持最新状态。是否有一个明确的首选选择,或者是基于个人意见的更美观的选择(在这种情况下,我会形成自己的,而不是在这里问它!)。
scheme - 使用相对路径加载文件
使用 chezscheme 加载当前目录中的文件all-codes
但是,如果将目录更改为父目录并尝试:
加载异常:所有代码/ch4-mceval.scm 失败:没有这样的文件或目录:
我的目录显示为
如何从当前级别的“所有代码”加载 scm 代码?
macros - (Chez) 隐藏 lambda 的 Scheme 宏
我想编写一个宏来创建用于隐藏更冗长的 lambda 表达式的速记语法,但我很难理解如何编写宏(我意识到这是反对使用它们的论据)。
给定这个例子:
我想写一个宏,with-alist
,它可以让我写出最后两个类似的表达式:
有什么意见或建议吗?
scheme - make-counter 保留下一个变量的状态
我从第 2.9 节中读到了这样一个make-counter
例子。方案编程作业
我在这里很困惑,“下一步”的状态是如何保持的?
以我的理解,
(define count1 (make-counter))
返回值v
,然后是make-counter
消失和销毁的过程,
当count1
再次被调用时,又被调用了一次make-counter
,所以预期的结果应该一直是“0”。
但是,它神奇地打印以下内容:
如何保持“下一个”的状态?