我需要从Racket列表中深度删除元素。这意味着在任何子列表中,我也需要从那里删除该元素。我收到一条我不太明白的错误消息。这是我的代码:
(define (my_delete atm lst);define function and set up parameters
(define (rm x ls);define remove function
(if (null? ls);check to see whether the list is null
'();return a null list
(if (eqv? x (car ls));check to see whether x is equal to the current element in the list
(rm x (cdr ls));recursively call the function
(cons (car ls)
(rm x (cdr ls))))));recursively call the function
(define (my-map f lst2);define my-map function and set up parameters
(cond
[(empty? lst2) empty];if the list is empty return an empty list
[else (cons (f (first lst2) lst);apply the mapAction function to the element
(my-map f (rest lst2)))]));recursively call the function
(define (mapAction atm2 lst2);define mapAction function and set up parameters
(if (list? atm2));check to see whether the element is a list
(my_delete atm atm2);recursively call the function
(if (eq? atm atm2));check to see whether the elements are equal
(rm atm2 lst2);remove the element if they are equal
)
(my-map mapAction list)
)
这是我的错误消息:
if: bad syntax in: (if (list? atm2))
请帮忙!
答案 0 :(得分:0)
我想知道当(if (list? atm2))
为真或假时(list? atm2)
应该做什么。通常您会拥有(if (list? atm2) expression-if-true expreession-if-false)
。同样在DrRacket中,当我按下CTRL + i时,它会根据这些括号错误来格式化代码。我将为您注释mapAction
:
(define (mapAction atm2 lst2) ; define mapAction function and set up parameters
(if (list? atm2)) ; check to see whether the element is a list don't do ANYTHING either way
(my_delete atm atm2) ; Then always recursively call the function
(if (eq? atm atm2)) ; Then ignore the result and check to see whether the elements are equal and dont do ANYTHING wither way
(rm atm2 lst2)) ; Than always remove the element unconditionally (also result of procedure)
这是完全不同的东西:
(define (mapAction atm2 lst2) ; define mapAction function and set up parameters
(if (list? atm2) ; check to see whether the element is a list
(my_delete atm atm2) ; recursively call the function
(if (eq? atm atm2) ; check to see whether the elements are equal
(rm atm2 lst2) ; remove the element if they are equal
'what-to-do-else))) ; if has 3 parts. THis is executed when atm and atm2 are not the same thing
cond
看起来更好,因为它在else分支中嵌套了术语,就像elseif一样。