2012-11-25 3 views
1

게시자는 처음으로 게시하며 체계에 의문을 가지고 있습니다.스키마의 목록에서 요소를 제거합니다.

]=> (rmobject '(1 2 3 5 0 2 3 5 3) 3) 

내가 오류 받고 있어요 :

The object (3 5 3 2 3 6 3) is not applicable 

나는 생각을 나는 목록에서 요소의 모든 항목을 제거해야 는 인수, 같은 입력 매개 변수로 모두 통과 두 번째 람다 때문에 제대로 작동하지 않지만 그 이유는 무엇입니까?

(define (rmobject list1 obj) 
    (if (null? list1) 
     '() 
     (if (= obj (car list1)) 
      ((lambda (list1) (cdr list1)) list1) 
      ((lambda (list1) (list1)) list1))) 
     (cons (car list1) (rmobject (cdr list1) obj))) 

나는 코드를 재 작성하고이 요소를 제거에서 제대로 작동하지만 적절한하지 않는, 모두가 같은 생각된다. 미리 감사는

(define (rmobject list1 obj) 
    (if (null? list1) 
    '() 
    (if (= obj (car list1)) 
     (rmobject (cdr list1) obj) 
     (cons (car list1) (rmobject (cdr list1) obj))))) 
+0

'((람다 (목록 1) (목록 1)) 목록 1)))'의 원인이됩니다 그 오류를 – leppie

답변

2

첫 번째 버전이 훨씬 이해가되지 않습니다. 이런 식으로 lambda을 사용해야하는 이유는 무엇입니까? 재귀 적으로 프로 시저가 정의되고 one-shot 익명 프로 시저가 생성되지 않고 호출됩니다.이 프로 시저는 당면 문제를 해결하는 데는 효과가 없습니다. 그리고이 부분은 (list1)이 오류 The object is not applicable을 유발하고 있습니다. 목록을 프로 시저처럼 호출하려고합니다. 괄호로 묶여 있기 때문입니다. Scheme에서 다음 중 하나와 같은 구문 : (foo)foo절차이 호출됨을 나타냅니다.

코드의 두 번째 버전은 괜찮습니다. remove-all 절차를 구현하는 간단한 방법입니다. 그래도 약간의 질질 끄는 생각 : if의 중첩을 발견하면 cond이 더 적절할 것이라는 확실한 신호입니다.

(define (rmobject list1 obj) 
    (cond ((null? list1) 
     '()) 
     ((equal? obj (car list1)) 
     (rmobject (cdr list1) obj)) 
     (else 
     (cons (car list1) 
       (rmobject (cdr list1) obj))))) 

미래 참고 : 당신이 그것을 구현하고있는 절차는 일반적으로의 일부로 포함 것 또한 그것은 당신의 절차는 단지 숫자 이상을 작동 할 수 방법으로, = 대신 equal?를 사용하는 것이 좋습니다 것을 알 수 통역사. 당신이 @ 맥스웰의 대답으로 filter을 사용할 수

(define (rmobject list1 obj) 
    (remove* (list obj) list1)) 

을 또한 예를 들어, 라켓에서 우리는 테스트 평등의 기본 절차로 equal?을 사용하는, remove* 있습니다.또 다른 방법을 쓰기 :

(define (rmobject list1 obj) 
    (filter (negate (curry equal? obj)) list1)) 

을 어쨌든,이 작품 :

(rmobject '(1 2 3 5 0 2 3 5 3) 3) 
=> '(1 2 5 0 2 5) 
1

문제는 줄에 당신이 다음 함수로 호출을 시도 인자 (list1)를 받아들이는 기능을 구성 ((lambda (list1) (list1)) list1))) 것입니다. 함수가 실제로 목록 대신 전달되기 때문에 인터프리터는 오류와 함께 종료됩니다.

두 번째 시도에서 발견했듯이 람다를 통해 함수를 작성하는 것은 필요하지 않으며 함께 제공되는 알고리즘을 사용하여 일관성이 없습니다. 그렇다고하더라도 두 번째 시도에서 사용하는 것보다 훨씬 더 간단한 기법이 많이 있습니다. 나는 그것이 실제로 어떻게 작동하는지 볼 수 있도록 실제로 람다를 사용하는 것을 보여줄 것입니다. 내가 말하는거다 대안 기술은 filter에 의존하고 그래서 같이 작동 코드에서

(define (rmobject list1 obj) 
    (filter (lambda (x) (not (equal? x obj))) list1)) 
관련 문제