我在哪里可以找到有关#:when
DrRacket建筑的文件?
这是完整的例子:
(define (problem_9 sum)
(for*/first ([c (in-range 3 (- sum 2))]
[b (in-range 2 c)]
[a (in-range 1 b)]
#:when (and (= (+ a b c) sum)
(= (+ (* a a) (* b b)) (* c c))))
(+ a b c)))
Run Code Online (Sandbox Code Playgroud)
我理解它的目的,但想找到文档.
在DrRacket中使用Racket时,我意外地进入了交互窗口.
(定义x 7)
(定义x 8)
并且DrRacket允许它,即我没有得到"标识符错误消息的重复定义".
因此,要尝试找出发生了什么,然后在DrRacket的定义窗口中输入:
代码段A
(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))
(eval '(begin (define x 7) (define x 8)) ns)
(eval 'x ns)
Run Code Online (Sandbox Code Playgroud)
仍然没有"重复定义错误".
然后我在定义窗口中尝试了这个:
代码段B
(define x 9)
(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))
(eval '(begin (define x 7) (define x 8)) ns)
(eval 'x ns)
Run Code Online (Sandbox Code Playgroud)
我收到了错误消息:cannot redefine a constant x
.
有人可以向我解释为什么在定义窗口中的代码片段A(并且只是在交互窗口中输入 (define x 7)
后面(define x 8)
)不会给我一个重复的定义错误.
我无法找到时间复杂度分析cdr
.它是在恒定时间还是线性时间运行?如果答案取决于lisp的实现,假设我使用的是Racket.
我正在尝试Racket
使用parser-tools
.编写一个简单的解析器.我得到了一个我无法解释的行为(我是一个球拍新手,也许这是微不足道的).
请考虑以下代码:
#lang racket
(require parser-tools/yacc
parser-tools/lex
(prefix-in : parser-tools/lex-sre))
(define-tokens value-tokens ;;token which have a value
(STRING-VALUE ))
(define-empty-tokens op-tokens ;;token without a values
(EOF))
(define-lex-abbrevs ;;abbreviation
[STRING (:+ (:or (:/ "a" "z") (:/ "A" "Z") (:/ "0" "9") "." "_" "-"))]
)
(define lex-token
(lexer
[(eof) 'EOF]
;; recursively call the lexer on the remaining input after a tab or space. Returning the "1+1")
;; result of that operation. This effectively skips all whitespace. …
Run Code Online (Sandbox Code Playgroud) 我正在尝试下载一个html页面,然后使用Racket在其上运行一个正则表达式.这适用于某些页面但不适用于其他页面.我最终解决了这个问题是因为有些页面被gzip压缩并发出HTTP GET请求,get-pure-port提供了gzip压缩页面,这当然看起来像乱码.
我的问题:有没有办法在球拍中解压缩页面,以便我可以运行正则表达式?
谢谢.
我对于询问这个球拍/方案问题几乎感到尴尬,但有人可以告诉我如何避免在"那里"重复一个函数调用,如果它首先用于确定"这里"的条件吗?(cond [here there])
我想要得到的是相当于Racket/Scheme中的以下C样式代码(注意我只需要调用regex()一次,因为它存储在变量匹配中):
// initialiation code
if (match = regex("start", "startofstring")) {
list->push(match);
}
else {
printf("No matching regex\n");
}
Run Code Online (Sandbox Code Playgroud)
我想要避免的Racket代码如下,因为我必须两次调用regexp-match:
(cond
[(regexp-match #rx"start" "startofstring")
(set! list (cons (regexp-match #rx"start" "startofstring") list)]
[else
(printf "No matching regex\n")])
Run Code Online (Sandbox Code Playgroud)
现在,我可以这样做:
(define match (regexp-match #rx"start" "startofstring"))
(cond
[match
(set! list (cons match list)]
[else
(printf "No matching regex\n")])
Run Code Online (Sandbox Code Playgroud)
但是这种方法意味着如果我有多个条件,我必须定义很多变量(在我的实际代码中,我有多个条件......但是为了上面的代码片段,我只放入一个) .所以它最终看起来像这样丑陋:
(define match1 (regexp-match #rx"start" "startofstring"))
(define match2 (regexp-match #rx"blah" "startofstring"))
....
(define matchn (regexp-match #rx"blahn" "startofstring"))
(cond
[match1
(set! list (cons match1 …
Run Code Online (Sandbox Code Playgroud) 我'
对球拍中的标志的含义有点困惑.在我看来,同一个标志有不同的含义.请看下面的两个简单示例:
返回包含vs作为其元素的新分配列表.
> (list 1 2 3 4)
'(1 2 3 4)
Run Code Online (Sandbox Code Playgroud)
生成对应于数据的常量值(即,程序片段的表示),而不包含其词汇信息,源位置等.引用的对,向量和框是不可变的.
> '(1 2 3 4)
'(1 2 3 4)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:'
符号是否有2个含义(符号和列表)或这些是相同的数据类型并list
实际返回引用的常量值?如果第二种情况是这样的话:
> '(+ (- 2 13) 11)
'(+ (- 2 13) 11)
> (eval (list + (- 2 13) 11))
0
Run Code Online (Sandbox Code Playgroud)
(也(eval '(+ (- 2 13) 11))
正常工作和评估0
)
但这不是:
> (list + (- 2 13) 11)
'(#<procedure:+> -11 11) …
Run Code Online (Sandbox Code Playgroud) 我需要读取一个Racket源文件并通过宏扩展运行它。我有一个简单的测试文件,Racket本身很乐意接受:
C:\ayane>type factorial.rkt
#lang racket
(provide factorial)
(define (factorial n)
(if (<= n 1)
1
(* n (factorial (sub1 n)))))
Run Code Online (Sandbox Code Playgroud)
现在,我尝试从REPL:
C:\ayane>racket
Welcome to Racket v6.5.
> (read-accept-reader #t)
> (expand (with-input-from-file "factorial.rkt" (lambda () (read-syntax "factorial.rkt"))))
#<syntax::1 (module factorial racket (#%m...>
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。现在从测试程序中得到同样的结果:
C:\ayane>type test.rkt
#lang racket
(read-accept-reader #t)
(expand (with-input-from-file "factorial.rkt"
(lambda ()
(read-syntax "factorial.rkt"))))
C:\ayane>racket test.rkt
factorial.rkt::1: module: unbound identifier;
also, no #%app syntax transformer is bound
at: module
in: (module factorial racket (#%module-begin (provide factorial) (define (factorial …
Run Code Online (Sandbox Code Playgroud) 我的以下课程效果很好:
(define myob%
(class object%
(super-new)
(init-field val)
(define/public (getval) val)
(define/public (setval v) (set! val v)) ))
(define ob1 (make-object myob% 5))
(send ob1 getval)
(send ob1 setval 10)
(send ob1 getval)
Run Code Online (Sandbox Code Playgroud)
输出:
5
10
Run Code Online (Sandbox Code Playgroud)
以下正则表达式也可以很好地工作:
(define sl (regexp-match #px"^(.+)[.]([^.]+)$" "ob1.getval"))
sl
Run Code Online (Sandbox Code Playgroud)
输出:
'("ob1.getval" "ob1" "getval")
Run Code Online (Sandbox Code Playgroud)
我正在尝试制作一个fn foo,它应该像'send'一样工作,但采用(foo ob1.getval)
or 形式的参数(foo ob1.setval 10)
。以下宏无法正常工作:
(define-syntax foo
(syntax-rules ()
((_ sstr ...)
(define sl (regexp-match #px"^(.+)[.]([^.]+)$"
(symbol->string sstr)))
(send (string->symbol(list-ref sl 1))
(string->symbol(list-ref sl 2))
...))))
(foo ob1.getval) …
Run Code Online (Sandbox Code Playgroud) 我想定义一个point
结构并检查是否(x, y)
满足方程式y^2 = x^3 + ax + b
。
(struct point (x y a b) #:transparent)
(define on-curve (point 3 -7 5 7)) ; (1)
(define off-curve (point -2 4 5 7)) ; (2)
Run Code Online (Sandbox Code Playgroud)
(1)应该工作是因为 -7^2 = 3^3 + 5*3 + 7
(2)应该引发错误,因为 4^2 != -2^3 + 5*3 + 7
我知道我需要某种合同,但是我一直在努力寻找方法。