对于我的编程语言课程,我应该在 Scheme 中编写一个函数来反转列表,而不使用预制的反转函数。到目前为止我得到的是
(define (reverseList lst)
(COND
((NULL? lst) '())
(ELSE (CONS (reverseList(CDR lst)) (CAR lst)))
))
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,如果我输入一个列表,可以说它(a b c)给了我(((() . c) . b) . a).
我该如何获得一个没有多组括号和 的干净列表.?
我需要创建一个函数,它从给定位置给出的列表中返回一个元素。例如,该列表中第三个位置的元素 (2 4 3 5) 将为 3。
我有这段代码,但它没有运行。
(define (getElement lst pos)
(if (= pos 0)
(car lst))
(if (> pos 0)
(getElement (cdr lst) (- pos 1))))
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
首先,如果有人可以找到已经回答过的问题,请告诉我。我能找到的只是删除重复项的函数。
无论如何,我正在尝试编写一个方案函数(delete V L),该函数接受一个值和一个列表作为参数,并从列表及其所有子列表中删除该值。例如,给定以下输入:
> (deep-delete 3 '(1 2 3 (4 3) 5 (6 (3 7)) 8))
Run Code Online (Sandbox Code Playgroud)
它将产生:
(1 2 (4) 5 (6 (7)) 8)
Run Code Online (Sandbox Code Playgroud)
到目前为止,这就是我所写的,但我知道 if 语句(用于检查该元素是否是子列表,这意味着它也必须被操作)必须放置错误。另外,我无法思考应该在哪里使用cons和不应该在哪里使用,因为我仍然对跟踪递归的返回值感到困惑。有人可以看一下并解释我做错了什么吗?
(define (delete V L)
(if (list? (car L)) (cons (delete V (car L) (cdr L)))
(cond
((null? L) L)
((equal? V (car L)) (delete V (cdr L)))
(else (cons (car L) (delete V (cdr L))))))))
Run Code Online (Sandbox Code Playgroud) 我不明白为什么我的获取最大数字的函数不起作用。如果我正确地思考这一点,如果第一个原子小于第二个原子,那么您调用该函数减去列表中的第一个原子,否则您将使用列表的其余部分构造第一个原子,即最大的原子。相关代码:
(define (getlargest a_list)
(cond
((null? a_list) '())
((< (car a_list) (cadr a_list)) (getlargest (cdr a_list)))
(else (cons (car a_list) (getlargest(cdr a_list))))))
Run Code Online (Sandbox Code Playgroud) 在 ISL 中,如何创建一个递归 append函数,该函数接受两个列表并返回第一个列表的所有最高位置元素和第二个列表的最高位置元素的列表(不使用lambdaor append)?
基本上,支持这些检查的函数需要:
(check-expect (append-test '(a b c) '(d e f g h)) (list 'a 'b 'c 'd 'e 'f 'g 'h))
(check-expect (append-test '() '(7 2 0 1 8 3 4)) (list 7 2 0 1 8 3 4))
Run Code Online (Sandbox Code Playgroud)
我觉得它肯定会使用map,因为这是我们最近一直关注的重点。这是我所拥有的,它确实有效,但我想知道是否有一种方法可以使用 map、foldr、foldl、filter 或类似的东西来简化它。
这是我到目前为止所拥有的:
(define (append-test lst1 lst2)
(cond
[(and (empty? lst1)(empty? lst2)) '()]
[(empty? lst1) lst2]
[(empty? lst2) lst1]
[else (cons (first (first (list lst1 lst2)))
(append-test …Run Code Online (Sandbox Code Playgroud) 搜了也没找到,有什么define*诡计吗?例如,您可以在此答案中找到它/sf/answers/1687118961/
在 Racket 中使用序列长度、序列引用、序列映射等而不是列表(长度列表引用等)、字符串(字符串长度、字符串引用等)、向量等的不同函数有什么缺点吗?
我是计划新手,在使用 car 和 cdr 方面遇到困难。我在 ast 中有一个 AST 字符串文字。
(define ast '(program
((assign (var i int) (call (func getint void int) ()))
(assign (var j int) (call (func getint void int) ()))
(while (neq (var i int) (var j int))
((if (gt (var i int) (var j int))
((assign (var i int) (minus (var i int) (var j int))))
((assign (var j int) (minus (var j int) (var i int)))))))
(call (func putint int void) ((var i int)))))
)
Run Code Online (Sandbox Code Playgroud)
我知道汽车返回ast的头。所以 …
我知道它将(begin expr1 expr2 ...)评估所有表达式并返回最后评估的表达式。
我发现在 Chez Scheme 中允许使用begin不带表达式的形式,如下所示:(begin)。我正在使用 Chez Scheme 作为我学习的一部分。当我在控制台中写入时,(begin)它不会发送语法错误,它只是显示任何内容,就好像我收到了void.
我的问题是,那么会返回什么?
我以为这是你可以通过运行获得的 void 对象(void)。然而,当我测试它时,我意识到事实并非如此。
我正在学习 Chez Scheme 作为我正在学习的编译器课程的一部分,我需要实现可以处理特殊单词 的编译器的一部分begin。所以我需要知道为什么这是可能的以及这个函数返回什么。
编辑:
我正在添加有关此主题的链接。我无法完全理解答案。另外,他没有提到返回类型。
compiler-construction scheme language-implementation expression-evaluation chez-scheme
foldr(fold-right) 基本上是按列表中存储的值从右到左的顺序执行递归计算。并且foldl是相反的foldr。我想知道人们可以foldr使用 来实现该功能foldl吗?任何想法都表示赞赏,提前致谢。