在我正在Racket中工作的应用程序中,我需要获取一个数字列表并将列表分成连续数字的子列表:(在实际应用中,我实际上是分区对由数字和一些数据组成的对,但原则是一样的.)
即如果我的程序被调用,chunkify那么:
(chunkify '(1 2 3 5 6 7 9 10 11)) -> '((1 2 3) (5 6 7) (9 10 11))
(chunkify '(1 2 3)) -> '((1 2 3))
(chunkify '(1 3 4 5 7 9 10 11 13)) -> '((1) (3 4 5) (7) (9 10 11) (13))
(chunkify '(1)) -> '((1))
(chunkify '()) -> '(())
Run Code Online (Sandbox Code Playgroud)
等等
我在Racket中提出了以下内容:
#lang racket
(define (chunkify lst)
(call-with-values
(lambda ()
(for/fold ([chunk '()] [tail '()]) ([cell (reverse lst)])
(cond
[(empty? …Run Code Online (Sandbox Code Playgroud) 我正在使用Python 3.3
re.sub("(.)(.)",r"\2\1\g<0>","ab") returns baab
Run Code Online (Sandbox Code Playgroud)
但
re.sub("(.)(.)",r"\2\1\0","ab") returns ba
Run Code Online (Sandbox Code Playgroud)
这是sub方法中的错误还是由于某种原因sub方法无法识别\ 0?
对于经验丰富的命令式程序员来说,只有熟悉C宏才能学习Racket宏系统的最佳途径是什么.不仅仅是它的机制(如何?),还有使用它的地点和原因以及说明这一点的例子.
应该首先学习Scheme(或Lisp)宏吗?我听说过"On Lisp"这本书对Lisp宏有一个很好的解释,并且有很好的例子.这会有用吗?
在Racket中编写函数时,我意外地将两个单引号放在符号前面而不是一个.即我意外地写了''并且发现了一些看似奇怪的嵌套引号的行为.我正在使用DrRacket并使用Racket lang和R5RS lang进行测试.
(write (pair? (quote (quote a))))
Run Code Online (Sandbox Code Playgroud)
打印:#t.
(write (car (quote (quote a))))
Run Code Online (Sandbox Code Playgroud)
打印:报价
但
(write (quote (quote a)))
Run Code Online (Sandbox Code Playgroud)
和
(write '(quote a)))
Run Code Online (Sandbox Code Playgroud)
两个都打印:'a
有人能告诉我为什么在Scheme(和Racket)中使用函数对吗?解释(引用(引用a)))作为一对两个元素引用和a,但函数write打印出'a而不是(引用a).
"球拍参考"部分11.9扩展顶级表单和13.2评估和编译使用术语"顶级表单"和功能描述(eval top-level-form [nm])和(展开顶级表单) )在参考手册中有"顶级形式"作为其功能参数,但我不清楚"顶级形式"的定义.Racket语言中"顶级形式"一词的含义是什么?
在Racket中,这给了我一个错误:
(struct point-in-plane (pos_x pos_y))
(struct pixel point-in-plane (color))
(define a-pixel (pixel 1 2 "blue"))
(pixel-color a-pixel)
(pixel-pos_x a-pixel)
(pixel-pos_y a-pixel)
Run Code Online (Sandbox Code Playgroud)
要使它工作,我需要用以下代码替换最后两行:
(point-in-plane-pos_x a-pixel)
(point-in-plane-pos_y a-pixel)
Run Code Online (Sandbox Code Playgroud)
同样在R6RS中
#!r6rs
(import (rnrs))
(define-record-type point (fields x y))
(define-record-type cpoint (parent point) (fields color))
(define blue-point (make-cpoint 1 2 "blue"))
(write (cpoint-x blue-point))
Run Code Online (Sandbox Code Playgroud)
给出了类似的错误.
是什么原因Scheme(和Racket)不允许您通过以下方式访问父类中定义的子类型的字段:subtypeID-fieldID而不是parenttypeID-fieldID
即在我的情况下允许我使用pixel-pos_x和pixel-pos_y.
Kent Dybvig在Letrec和letrec*的Scheme Scheme Language中给出的两个例子是:
(letrec ([sum (lambda (x)
(if (zero? x)
0
(+ x (sum (- x 1)))))])
(sum 5))
Run Code Online (Sandbox Code Playgroud)
和
(letrec* ([sum (lambda (x)
(if (zero? x)
0
(+ x (sum (- x 1)))))]
[f (lambda () (cons n n-sum))]
[n 15]
[n-sum (sum n)])
(f))
Run Code Online (Sandbox Code Playgroud)
第一个也可以写成一个名为let:
(let sum ([x 5])
((lambda (x)
(if (zero? x)
0
(+ x (sum (- x 1))))) x))
Run Code Online (Sandbox Code Playgroud)
第二个可以写成带有内部定义的let:
(let ()
(define sum (lambda (x)
(if (zero? x)
0
(+ x (sum (- …Run Code Online (Sandbox Code Playgroud) 有人可以给出一个相对简单的例子,说明在call-with-composable-continuation和之间的球拍call-with-current-continuation.
我已经完成了" 球拍指南10.3"中call-with-composable-continuation的示例以及call-with-current-continuation"方案编程语言"第3.3节中的示例,但我不清楚它们之间的区别.
有人可以给出一个例子,他们会在同一个背景下给出不同的结果.
有人可以提供一些关于何时使用 Scheme 或 Racket 宏以及何时使用函数的一般指南。
如果您没有创建新语法并且没有对变量产生副作用,那么在某些情况下您必须(或者更合适)使用宏而不是函数?