标签: racket

#:当关键字信息时

我在哪里可以找到有关#:whenDrRacket建筑的文件?

这是完整的例子:

(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)

我理解它的目的,但想找到文档.

scheme racket

2
推荐指数
1
解决办法
79
查看次数

在Racket中eval中允许的标识符重复定义?

在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))不会给我一个重复的定义错误.

scheme racket

2
推荐指数
1
解决办法
1262
查看次数

cdr的时间分析

我无法找到时间复杂度分析cdr.它是在恒定时间还是线性时间运行?如果答案取决于lisp的实现,假设我使用的是Racket.

lisp time-complexity racket

2
推荐指数
2
解决办法
160
查看次数

相等字符串之间的差异

我正在尝试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)

racket

2
推荐指数
1
解决办法
363
查看次数

在Racket中解压缩gzip压缩包

我正在尝试下载一个html页面,然后使用Racket在其上运行一个正则表达式.这适用于某些页面但不适用于其他页面.我最终解决了这个问题是因为有些页面被gzip压缩并发出HTTP GET请求,get-pure-port提供了gzip压缩页面,这当然看起来像乱码.

我的问题:有没有办法在球拍中解压缩页面,以便我可以运行正则表达式?

谢谢.

gzip http racket

2
推荐指数
1
解决办法
107
查看次数

球拍/方案:如何避免在cond中重复函数调用

我对于询问这个球拍/方案问题几乎感到尴尬,但有人可以告诉我如何避免在"那里"重复一个函数调用,如果它首先用于确定"这里"的条件吗?(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)

scheme conditional racket

2
推荐指数
1
解决办法
305
查看次数

什么是'(撇号)在球拍?

'对球拍中的标志的含义有点困惑.在我看来,同一个标志有不同的含义.请看下面的两个简单示例:

list

返回包含vs作为其元素的新分配列表.

> (list 1 2 3 4)
'(1 2 3 4)
Run Code Online (Sandbox Code Playgroud)

quote

生成对应于数据的常量值(即,程序片段的表示),而不包含其词汇信息,源位置等.引用的对,向量和框是不可变的.

> '(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)

scheme functional-programming racket

2
推荐指数
1
解决办法
1278
查看次数

读取和扩展Racket源文件

我需要读取一个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)

racket

2
推荐指数
2
解决办法
88
查看次数

在Racket类函数中使用点表示法

我的以下课程效果很好:

(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)

macros scheme racket

2
推荐指数
1
解决办法
212
查看次数

约束结构值

我想定义一个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

我知道我需要某种合同,但是我一直在努力寻找方法。

racket

2
推荐指数
1
解决办法
43
查看次数