我最近开始玩Racket模式匹配系统,遇到了一个我无法理解的问题.
如果我做:
(match (list 1 2 3 4 5 6 7 8 9 10 11 12)
[(list _ x y z ...) (list y ': x)])
Run Code Online (Sandbox Code Playgroud)
在REPL我得到
'(3 : 2)
Run Code Online (Sandbox Code Playgroud)
作为我想要的结果.
如果我做:
(match (current-date)
[(date* _ x y z ...) (list y ': x)])
Run Code Online (Sandbox Code Playgroud)
要么
(match (date* 5 18 13 18 11 2011 5 321 #f 3600 0 "W. Europe Standard Time")
[(date* _ x y z ...) (list y ': x)])
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
match: wrong number for fields for structure …Run Code Online (Sandbox Code Playgroud) 我的一门课程是将DrRacket用于SICP的某些部分.我们正在研究metacircular评估员,我有一个R5RS代码文件(set-car!和set-cdr!),我需要与我的工作一起使用.因为R5RS文件大约是500行,所以我更喜欢将它保存在单独的缓冲区中.如何将其包含在我的答案缓冲区的定义中?这似乎racket/include需要#lang racket,但set-car!并set-cdr!没有在该语言.
我有DrRacket版本5.0.2,我已经花了样3小时了寻找正确的库进行while,dolist和dotimes工作.我知道如何使用它们但我找不到合适的库.当我输入dotimes例如它告诉我未知的标识符.
PS:你必须使用define-syntax才能定义这些循环吗?我试过(require srfi/42)但它不起作用.我正在使用#lang scheme.
当作者实现序列化程序的互斥体部分时,它们使用一个名为的列表cell.但是列表只包含一个元素,那么为什么不使用变量呢?
我对这个例子的结果有点困惑:
(define mk-q
(lambda ()
(let ([l '(x)])
(cons l l))))
(define q (mk-q))
q
=> ((x) x)
(set-car! (cdr q) 'y)
=> ((y) y)
Run Code Online (Sandbox Code Playgroud)
我想知道为什么两个x原子都被set-car!程序所取代(我对结果的第一个猜测是什么((x) y))?
例如:
(define mk-q2
(lambda ()
(let ([l '(x)])
(cons l (cons l l)))))
(define q2 (mk-q2))
(set-car! (cdr q2) 'y)
=> ((x) y x) which fits my understanding of set-car!
Run Code Online (Sandbox Code Playgroud)
为什么x第一个例子中的两个都被替换了?
在C中,您可以在方法中拥有一个静态变量,该变量可以记住先前调用该方法所设置的值.我听说在Scheme中使用continuation可以找到相同的效果.任何人都可以告诉我如何在不使用变异的情况下为Scheme中的函数创建静态变量的类似效果?
我想制作一个DrRacket程序,可以复制给定目录中的所有文件(将其从USB摄像头中取出(当它被插入它被视为大容量存储设备时))并将它们粘贴到我计算机上的硬盘文件夹中驾驶.无论出于何种原因,我都无法弄清楚DrRacket在计算机上的路径实现(即,对于Windows机器上的桌面,它将是:)C:\Users\Mike\Desktop我阅读了帮助台但仍无法解决这个问题.关于我应该在哪里找清楚我的困惑的任何建议?我认为我需要实现这个想法的函数调用是:
(copy-directory/files src dst)
Run Code Online (Sandbox Code Playgroud)
在我弄明白之后,我将在GUI上工作,因此只需点击一下按钮即可运行.
我在Racket中写了一个免费乘法携带的PRNG.我想用来provide限制只访问我的库中的某些功能,并对它们施加合同.使用Racket文档(上面链接),我已将以下代码放在我的文件顶部:
(require data/queue)
(provide
(contract-out
(make-cmwc-gen (-> (listof integer?) integer? integer? integer? procedure?))
(make-default-cmwc-gen (-> integer? procedure?))
(make-cmwc-gen-raw (-> queue? integer? integer? integer? procedure?))
(init-cmwc-seed (-> integer? queue?))))
Run Code Online (Sandbox Code Playgroud)
但是当我在DrRacket中运行该文件时,我收到以下错误:
. contract-out: not a provide sub-form in: (contract-out (make-cmwc-gen (-> (listof
integer?) integer? integer? integer? procedure?)) (make-default-cmwc-gen (-> integer?
procedure?)) (make-cmwc-gen-raw (-> queue? integer? integer? integer? procedure?))
(init-cmwc-seed (-> integer? queue?)))
Run Code Online (Sandbox Code Playgroud)
代码抛出没有错误,否则在DrRacket中运行时没有插入上面的代码.
限制只访问源文件之外的某些功能以及在Racket中强制执行合同的正确方法是什么?
我有这个功能:
((lambda (x) (x x))
(lambda (x) (x x)))
Run Code Online (Sandbox Code Playgroud)
它会产生无限循环.我的问题是关于记忆图.我们知道堆栈会溢出,因为我每次调用都会打开一个新帧.但是什么会在堆上?据我所知,在每次调用时都会在堆上创建一个新的闭包,但我不确定.
我以为我会尝试使用世界/宇宙无变异方法的简单GUI应用程序,但尝试自己实现'世界/宇宙'程序设计.
我下面有一个小草图,但我很快得出结论,虽然我可以使用teachpack,但我不知道如何自己实现teachpack功能.
我猜我应该使用continuation,但这似乎不是universe.rkt源代码中的方法.
我总是可以将程序填充到canvas类中(就像早期的游戏一样,像滑动一样似乎也是如此),但我真的想知道如何实现"世界/宇宙"风格的程序控制.
;;;;----
#lang racket/gui
; simple drawing program
; mousedown starts recording a list of points
; mousechanged starts recording a new list
; paint callback paints the list of lists as lines.
(define diagramframe (new frame% [label "paint"] [width 300]
[height 300] [x 1000][y 300]))
;(define lines '(((0 . 0) (0 . 300) (250 . 250) (150 . 176))))
(define lines '(((0 . 0) (0 . 300) (250 . 250) (150 . 176))
((10 . 4) …Run Code Online (Sandbox Code Playgroud)