这是我到目前为止的代码。我相信我很接近,但返回的只是#procedure,承认过程已创建,它不会返回带有新添加元素的列表。我一直在研究这个问题几个小时,我不知道我哪里出错了。
(define (add-into new p lst)
(cond ((null? lst)
(cons new lst)
((eq? p 0)
(cons new lst)
(else
(cons (car lst) (add-into (- p 1) new (cdr l))))))))
答案 0 :(得分:0)
您有一个括号问题,在一个地方传递l
而不是lst
,并且在执行递归调用时参数的顺序不正确。这应该可以解决错误:
(define (add-into new p lst)
(cond ((null? lst)
(cons new lst))
((= p 0)
(cons new lst))
(else
(cons (car lst) (add-into new (- p 1) (cdr lst))))))
答案 1 :(得分:0)
只需将代码粘贴到DrRacket并按CTRL + i即可得到:
(define (add-into new p lst)
(cond ((null? lst)
(cons new lst)
((eq? p 0)
(cons new lst)
(else
(cons (car lst) (add-into (- p 1) new (cdr l))))))))
请注意,您只有一个学期。如果(null? lst)
为#f
,则cond
中没有更多字词,因此它将评估为实现定义值,因为它在规范中未定义。在#lang racket
中,如果您评估(void)
要解决此问题,您需要关闭cond
中的条款,这样您就有3个条款而不是1个条款。当您按Enter键时,您应该看到这一点,但括号与前一个术语不对齐。如果你想使用另一个编辑器,你应该得到一个对齐和缩进lisp语法,因为编写lisp而不会有点痛苦。