我正在学习Scheme.我最近花了(太多!)时间试图找到程序中的错误,然后才意识到我错过了cond子句中的'else'字样.但在这种情况下的行为似乎有点奇怪.只用一个简单的程序(下面)试验条件,'else'在else子句中按预期显示,但也会显示,但没有'else',会显示周围的双引号和未解释的新引号字面打印.任何人都可以向我解释发生了什么事吗?TIA.
(define (foo x)
(cond ((eq? x 0) (display "zero\n"))
(display "whatever\n")))
(define (bar x)
(cond ((eq? x 0 ) (display "zero\n"))
(else (display "whatever\n"))))
In the repl window:
Welcome to DrScheme, version 4.1.5 [3m].
Language: Pretty Big; memory limit: 128 megabytes.
> (foo 0)
zero
> (bar 0)
zero
> (foo 2)
"whatever\n"
> (bar 2)
whatever
>
Run Code Online (Sandbox Code Playgroud) 我用Racket(以前的PLT Scheme)构建了一个相当复杂的应用程序,并希望添加一个REPL用于调试目的.我试图通过TCP流访问它:
(define repl-server
(thread (lambda ()
(let ((listener (tcp-listen 8082 5 #t)))
(do () (#f)
(let-values (((in out) (tcp-accept listener)))
(thread (lambda ()
(let ((port-string (get-port-string in)))
(Try "debug-repl" #f
(begin
(file-stream-buffer-mode out 'line)
(display-and-log "Password: " out)
(flush-output out)
(when (string=? (read-line in) "whatever")
(log "Connect to REPL: " port-string))
(current-input-port in)
(current-output-port out)
(current-error-port out)
(read-eval-print-loop))
(close-input-port in)
(close-output-port out))))))))))))
Run Code Online (Sandbox Code Playgroud)
(Try name result-if-exception form) 是一个提供基本异常处理的宏,(log ...)和(display-and-log ...)执行它们的声音.
现在,如果我访问REPL,我甚至无法评估常量,因为我不断收到错误compile: unbound identifier (and no #%app syntax transformer is …
我试图了解如何让eval函数读取字符串并评估字符串中的内容.
目前我知道
> (eval '(+ 1 2))
3
Run Code Online (Sandbox Code Playgroud)
但是我对球拍的使用知之甚少.所以目前我正试图让它能够做到这一点:
> (eval "(+ 1 2)")
3
Run Code Online (Sandbox Code Playgroud)
任何建议或有用资源的链接将不胜感激.
所以这是代码:
(define (time-prime-test n)
(newline)
(display n)
(start-prime-test n (runtime)))
(define (start-prime-test n start-time)
(if (prime? n)
(report-prime (- (runtime) start-time))))
(define (report-prime elapsed-time)
(display " *** ")
(display elapsed-time))
(define (search-for-primes n m)
(if (< n m)
((time-prime-test n)
(search-for-primes (+ n 1) m))
(display " calculating stopped. ")))
(search-for-primes 100000 100020)
Run Code Online (Sandbox Code Playgroud)
我在"计算停止"后得到了这个错误.已经显示.如下:
100017 100018 100019 * 54计算停止...申请:不是程序; 期望一个可以应用于给
定参数的过程:#<void>
arguments ...:
#<void>
什么构成了Racket编程语言的核心?核心基于任何RnRS规范与所有附加功能,例如基于该微小核心的众多序列方法,还是语言核心参考部分中的所有内容?
我定义了一个true?与球拍/列表中的计数一起使用的函数.
(define (true? expr)
(and (boolean? expr) expr #t))
Run Code Online (Sandbox Code Playgroud)
我注意到我可以提供数字参数,我的功能很乐意返回#f.
> (true? 6)
#f
Run Code Online (Sandbox Code Playgroud)
所以,我想我会探索使用球拍合约来使非布尔参数在合同违规中返回错误.所以我把这个代码放在我的文件的顶部:
(provide (contract-out
[true? (-> boolean? boolean?)]))
Run Code Online (Sandbox Code Playgroud)
但是,在添加合同后,我仍然在球拍REPL中获得与上述相同的行为.我不明白这是怎么回事.我错过了什么?
刚刚开始进入The Little Schemer,并有一个非常基本的Dr. Racket IDE问题:
如何清除翻译屏幕?
如何设置向上箭头以显示以前键入的项目(如在Bash中)而不是当前滚动屏幕的行为?
我的搜索空白,可能是因为我不知道这些操作的技术术语.
我今天正在玩Racket,并试图根据同一功能的多个应用程序产生一个不确定的数字序列.
在Clojure中我会使用iterate函数,但我不确定在Racket中它的等价物.
我有一个球拍模块hw.rkt:
#lang racket/base
(provide hw)
(define (hw) (displayln "Hello, world!"))
Run Code Online (Sandbox Code Playgroud)
我想编写一个嵌入Racket运行时并应用该过程的C程序(hw).
有示例代码这里演示如何嵌入球拍运行时和应用过程,在racket/base,或阅读和评价的S-表达,但我没有运气修改这些代码以允许访问(hw)程序.
本页面似乎是说,这是可能做到什么,我想先编译hw.rkt使用到hw.c做raco ctool --c-mods,当我尝试这工作得很好,但我仍然无法实际访问(hw)过程.
如果有人可以发布一个完整的示例程序,或者只是描述要使用哪些C函数,我将非常感激.从那里我可以弄清楚剩下的.
编辑以提供我尝试过的事情的示例.
我修改了示例程序以摆脱"评估命令行参数"位并直接跳到REPL以便我可以进行实验.因此(用"hw.c"运行的结果raco ctool --c-mods hw.c ++libs racket/base hw.rkt):
#define MZ_PRECISE_GC
#include "scheme.h"
#include "hw.c"
static int run(Scheme_Env *e, int argc, char *argv[])
{
Scheme_Object *curout = NULL, *v = NULL, *a[2] = {NULL, NULL};
Scheme_Config *config = NULL;
int i;
mz_jmp_buf * volatile save = NULL, fresh; …Run Code Online (Sandbox Code Playgroud) 我正在研究需要数学/数论库的Racket脚本(在Linux机器上).我现在的整个脚本是这样的:
#!/usr/bin/racket
(require math/number-theory)
Run Code Online (Sandbox Code Playgroud)
是的,它实际上只需要图书馆.
当我尝试运行它时,我得到一个错误,上面写着"预期的'模块'声明:其他东西".
但是,当我在终端中实际启动Racket时:
/usr/bin/racket
Run Code Online (Sandbox Code Playgroud)
并在命令行中输入(需要数学/数论),它将它视为完全有效.
这里发生了什么?