既然Chez Scheme是开源的,我想知道它在性能方面与Racket和其他方案或语言的比较,以便人们可以在一个项目中做出明智的选择.
不幸的是,我找不到任何相关的基准.
我找到了以下内容:
https://ecraven.github.io/r7rs-benchmarks/benchmark.html
问题:没有Racket或其他语言(更新10/13/18:Chez现在包含在一些基准测试中)
http://www.larcenists.org/benchmarksGenuineR6Linux.html
问题:没有Chez Scheme或其他语言
https://benchmarksgame-team.pages.debian.net/benchmarksgame/
问题:只有Racket,可疑的比较(例如,Python不允许使用Numpy显然有帮助,而Racket正在向GMP发出FFI调用)
因此,我找到的基准测试中没有一个允许您将Racket与Chez进行比较,或者将Chez与SBCL或Java进行比较.是否有Chez基准测试可以让您了解它的速度有多快?
Chez Scheme通常被认为是最快的Scheme/Lisp.我们应该知道它是否比典型的业务逻辑应用程序的Java更快.
如何在 Ubuntu 上安装 Petite Chez Scheme?
我运行 Ubuntu 15.10 并尝试为 Linux 安装 pcsv8.4-a6le.tar.gz(非线程,64 位)。
在解压这个 tar 之后/usr/locale
,我输入命令
sudo ./configure
sudo make install
Run Code Online (Sandbox Code Playgroud)
从custom
目录中。
但是,不是全新安装,而是出现以下错误(我希望有人可以帮助我):
nlykkei@nlykkei-Studio-XPS-1640:/usr/local/csv8.4/custom$ sudo make install
if [ yes = no ]; then if [ ! -f ./scheme ]; then /bin/rm -f ./scheme; ln -s ../bin/a6le/scheme ./scheme; fi; fi
if [ ! -f ./petite ]; then /bin/rm -f ./petite; ln -s ./scheme ./petite; fi
/bin/rm -f ./scheme
echo "const char *S_date_stamp = \"`date +%m%d%Y%H%M%S`\";" …
Run Code Online (Sandbox Code Playgroud) R6RS或Chez Scheme v7.9.4是否具有库函数来检查列表是否包含重复元素?
或者,是否具有集合的任何内置功能(允许重复元素)?到目前为止,我只能在这里找到一个例子.
问题在于它实际上并不是Chez Scheme库的一部分.虽然我可以编写自己的版本,但我更倾向于使用一个众所周知,经过测试和维护的库函数 - 特别是考虑到这是一个基本的操作.
因此,简单的"使用这些内置函数"或"没有内置库实现这一点"就足够了.谢谢!
这在我使用Scheme教授的入门编程课程中是个人挑战,但我对Python示例同样满意.
我已经在方案中实现了模幂运算的二进制方法,如下所示:
(define (pow base expo modu)
(if (zero? expo)
1
(if (even? expo)
(mod (expt (pow base (/ expo 2) modu) 2) modu)
(mod (* base (pow base (sub1 expo) modu)) modu))))
Run Code Online (Sandbox Code Playgroud)
这是必要的,因为Chez Scheme没有任何类似于python的pow(base expo modu)的实现.
现在我正在尝试实现解决模乘的蒙哥马利方法.举个例子,我有:
Trying to solve:
(a * b) % N
N = 79
a = 61
b = 5
R = 100
a' = (61 * 100) % 79 = 17
b' = (5 * 100) % 79 = 26
RR' - NN' = …
Run Code Online (Sandbox Code Playgroud) 我最近一直在使用鸡肉计划,我发现它非常好,有人建议chez计划是最快的计划实施.所以我想尝试一下,但我不知道如何从chez中创建已编译的二进制文件,如鸡计划.
我正在运行Chez Scheme 9.5,并尝试在库中定义语法转换器。这是一个例子:
(library (forlib)
(export for)
(import (rnrs (6)))
(define-syntax for
(syntax-rules (in)
[(for x in lst body1 body2 ...)
(for-each (lambda (x) body1 body2 ...) lst)])))
Run Code Online (Sandbox Code Playgroud)
我将其保存在文件中forlib.ss
并chez
从同一目录运行。然后在REPL中,我得到以下信息:
> (import (forlib))
> (for x in '(1 2 3) (display x))
Exception: invalid syntax (for x in (quote (1 2 3)) (display x))
Type (debug) to enter the debugger.
Run Code Online (Sandbox Code Playgroud)
如果我将语法定义更改为
(define-syntax for
(syntax-rules ()
[(for x lst body1 body2 ...)
(for-each (lambda (x) body1 body2 ...) …
Run Code Online (Sandbox Code Playgroud) 考虑一下Chez Scheme代码的这一点:
(进口(chezscheme)) (定义(list-enumerate ls val proc) (让循环((ls ls)(返回?#f)(val val)) (如果(或(空?ls) 返回?) 值 (值调用(lambda()(proc val(car ls))) (lambda(返回值) (循环(cdr ls)return?val)))))) (定义(list-index ls proc) (列表枚举ls 0 (lambda(i elt) (如果(proc elt) (值#ti) (值#f(+ i 1)))))) (定义n 100000) (定义数据(iota n)) (时间(列表索引数据(lambda(elt)(= elt(-n 1)))))
运行:
〜$ scheme-脚本〜/ scratch / _list-enumerate-allocation-test-chez-a.sps (时间(列表索引数据...)) 没有收藏 经过3 ms的cpu时间 实时经过4毫秒 分配了8个字节
哇,它报告只分配了8个字节。
让我们使用--program
选项而不是再次运行它--script
:
〜$ scheme-程序〜/ scratch / _list-enumerate-allocation-test-chez-a.sps (时间(列表索引数据...)) 没有收藏 经过3 ms的cpu时间 实时经过3毫秒 分配了800000字节
Yikes,分配了800000字节。
有什么区别?
埃德
我试图在 chez 方案中查找有关 andmap 和 ormap 操作的信息。
尽管如此,我还是不明白这些操作的用途,以及它和map有什么区别。
如何let*
在Chez Scheme/Racket中定义?特别是,为什么第一个例子评估为6 ......
(let* ((let +) (a (let 2 4)))
a)
Run Code Online (Sandbox Code Playgroud)
......当我从认识运动3.1.3的是,let*
可扩展到嵌套let
(甚至嵌套let*
)语句,但扩大正如人们所预料的解释做会导致错误上面的例子?
(let ((let +))
(let (a (let 2 4))
a))
Run Code Online (Sandbox Code Playgroud)
实施是否与练习不同?我希望第一个例子由于新的定义而导致错误let
.
作为学习 call/cc 和宏的练习,我尝试定义 goto。
(define-syntax label
(syntax-rules ()
((_ name)
(begin
(define name)
(call/cc (lambda (c) (set! name c)))))))
(define (goto label) (label))
(define i 0)
(label start)
(display i) (newline)
(set! i (+ i 1))
(if (< i 3) (goto start))
(display "done") (newline)
Run Code Online (Sandbox Code Playgroud)
它适用于 guile-2.0,但在 chez 方案和球拍(r6rs)中它只打印
0
done
Run Code Online (Sandbox Code Playgroud)
哪个实现是正确的?
使用方案我需要使用以下功能.(所有args都是自然数[0,inf))
(define safe-div
(lambda (num denom safe)
(if (zero? denom)
safe
(div num denom))))
Run Code Online (Sandbox Code Playgroud)
但是,此功能经常被调用,并且表现不佳(速度快).是否有更有效的方法来实现所需的行为(num和denom的整数除法,如果denom为零则返回安全值)?
注意,我正在使用Chez Scheme,但是这个用于只导入rnrs的库,而不是完整的Chez.
我知道它将(begin expr1 expr2 ...)
评估所有表达式并返回最后评估的表达式。
我发现在 Chez Scheme 中允许使用begin
不带表达式的形式,如下所示:(begin)
。我正在使用 Chez Scheme 作为我学习的一部分。当我在控制台中写入时,(begin)
它不会发送语法错误,它只是显示任何内容,就好像我收到了void
.
我的问题是,那么会返回什么?
我以为这是你可以通过运行获得的 void 对象(void)
。然而,当我测试它时,我意识到事实并非如此。
我正在学习 Chez Scheme 作为我正在学习的编译器课程的一部分,我需要实现可以处理特殊单词 的编译器的一部分begin
。所以我需要知道为什么这是可能的以及这个函数返回什么。
编辑:
我正在添加有关此主题的链接。我无法完全理解答案。另外,他没有提到返回类型。
compiler-construction scheme language-implementation expression-evaluation chez-scheme