我在方案中有一个程序,它给了我一个对列表,我需要按对的第二个元素对这个列表进行降序排序。像这样:
((1 . 1) (2 . 3) (3 . 2)) --> ((2 . 3) (3 . 2) (1 . 1))
((1 . 1) (x . 3) (2 . 1) (3 . 1)) --> ((x . 3) (1 . 1) (2 . 1) (3 . 1))
((1 . 3) (3 . 4) (2 . 2)) --> ((3 . 4) (1 . 3) (2 . 2))
Run Code Online (Sandbox Code Playgroud)
我不知道我应该如何为此使用排序。
如果问题标题有点混乱,请见谅。也许在你读完之后,你可以给我推荐一个更好的标题。
作为在线课程家庭作业的一部分,我编写了一个迭代过程mit-scheme来显示从 1 到给定数字的数字。
下面的代码工作正常:
(define (count2-iter num)
(define (iter counter)
(cond ((> counter num) #t)
(else (display counter)
(iter (+ counter 1)))))
(iter 1))
Run Code Online (Sandbox Code Playgroud)
输出:
1 ]=> (load "count2-iter.scm")
;Loading "count2-iter.scm"... done
;Value: count2-iter
1 ]=> (count2-iter 10)
12345678910
;Value: #t
Run Code Online (Sandbox Code Playgroud)
我个人不喜欢cond仅用于 2 个分支,因此我尝试使用if它。
(define (count2-iter1 num)
(define (loop idx)
(if (> idx num)
#t
((display idx)
(loop (+ idx 1)))))
(loop 1))
Run Code Online (Sandbox Code Playgroud)
输出:
1 ]=> (count2-iter1 5)
5
;The object #!unspecific is …Run Code Online (Sandbox Code Playgroud) 为什么是这样:
例如,
a) 以下代码片段是错误的:
; Must define function `f` before variable `a`.
#lang racket
(define a (f))
(define (f) 10)
Run Code Online (Sandbox Code Playgroud)
b) 虽然以下片段是正确的:
; Function `g` could be defined after function `f`.
#lang racket
(define (f) (g)) ; `g` is not defined yet
(define (g) 10)
Run Code Online (Sandbox Code Playgroud)
C)右太:
; Variable `a` could be defined after function `f`
#lang racket
(define (f) a) ; `a` is not defined yet
(define a 10)
Run Code Online (Sandbox Code Playgroud) 我想要一个可以接受任意数量参数并返回每个参数列表的宏,如下所示:
(TEST first second third)
=> '(first second third)
Run Code Online (Sandbox Code Playgroud) 如果 'apply' 将给定的函数应用于列表的所有元素,为什么以下不起作用:
> (apply println (list "a" "b" "c"))
. . println: contract violation
expected: output-port?
given: "b"
argument position: 2nd
other arguments...:
>
Run Code Online (Sandbox Code Playgroud)
https://docs.racket-lang.org/reference/procedures.html和https://docs.racket-lang.org/guide/application.html 中给出的示例与添加 (+) 功能有关。有人可以提供其他应用示例并解释它是如何工作的。谢谢。
我无法理解let在我发现的示例中的这种用法。我正在使用鸡肉计划。
(let loop ()
(print "hello world")
(loop)
)
Run Code Online (Sandbox Code Playgroud)
这是一个简单的无限循环,它递归地调用自己,我无法理解的是语法。我知道第一个参数必须是一个成对列表,((<var[1]> <value[1]>)...(<var[n]> <value[n]))其他参数是 let 的主体。那么,为什么这个片段有效呢?
我正在使用 PLY (Python Lex-Yacc) 为 Scheme 做一个解释器,但我无法使用堆栈中的值来实现“do”循环,该值跟踪与变量对应的 ID(例如 i 用于环形)。
这是一个编译器设计课程的最终项目,主要问题是向堆栈添加值的那一刻,我使用字典将变量名作为键,然后是值,但它不是在它应该分配的那一刻,它尝试在一个值和变量之间进行比较,但它失败了,因为堆栈仍然是空的。
这是代码中最重要的部分:
ids = { }
def p_program(p):
'program : form'
#return p
print(p[1])
def p_form_a(p):
'''
form : definition
| expression
'''
p[0] = p[1]
def p_expression(p):
'''
expression : constant
| do_expression
| ID
| display
'''
p[0] = p[1]
def p_do_expression_a(p):
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
'do_expression : OPEN_PAR DO OPEN_PAR ID constant OPEN_PAR symbol ID …Run Code Online (Sandbox Code Playgroud) 我不小心忘记else在下面的cond表达式中输入 ,发生了一些奇怪的事情。
(define (abs x)
(cond ((< x 0) x)
((= x 0) 0)
(+ 1 2 1001)
))
> (abs 1)
1001
>
Run Code Online (Sandbox Code Playgroud)
的结果(abs 1)不是(+ 1 2 1001)?的结果,即 1004,而是表达式参数的最后一个元素(+ 1 2 1001)。
该cond形式是
(cond (<p1>,<e1>)
(<p2>,<e2>)
(<p3>,<e3>)
...
(<pn>,<en>))
Run Code Online (Sandbox Code Playgroud)
表达式中没有谓词(+ 1 2 1001),所以我想知道该过程+是否被视为谓词,并且它是否总是评估为真,选择最后一个元素返回。是这样操作的???
我想在 Racket 中定义一个带有未定义参数数量的函数,所以我使用省略号,但它不起作用:
(define (f x ...) (printf x ...))
(f "~a ~a" "foo" "bar")
Run Code Online (Sandbox Code Playgroud)
错误:
Arity mismatch
Run Code Online (Sandbox Code Playgroud)
如何用省略号在 Racket 中定义一个函数?
我正在尝试运行以下代码:
(define (myadd x y)
(+ x y)
)
(myadd '(3 4))
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
Error: +: number required, but got (3 4) [myadd, +]
Run Code Online (Sandbox Code Playgroud)
如何让 myadd 函数返回 7?