2013-01-03 4 views
1

에 부울 함수 사용 "eq", "null"등과 같은 "멤버"함수를 사용하고 싶습니다. 어떻게 해결할 수 있을지 모르겠습니까?스키마

(define (member atm lst) 
    (cond 
     ((null? lst) #F) 
     ((eq? atm (car lst)) #T) 
     (else (member atm (cdr lst))) 
    ) 
) 

및 여기서;

(define (duplicate-entries lst) 
    (cond 
     ((null? lst) #F) 
     ((member? (car lst) (cdr lst))) #T) 
     (else duplicate-entries (cdr lst)) 
    ) 
) 

member? 어떻게 해결할 수 있습니까?

+1

을 음, 그냥 '때문에 멤버 인'언 바운드 변수 IST, 당신은? 그것을 정의하지 않았다! 당신은'member'를 정의했습니다. 그런데, 여러분은 근본적으로 R5RS 호환 구현의 일부인'memq' 함수에 대해 이야기하고 있습니다. 게다가, 몇 가지 다른 결점이있다 :'duplicate-entries'는 대괄호를 빠뜨리고 그것의 의도는 분명하지 않다. –

+0

왜'memq'를 사용하지 않습니까? – leppie

+1

스키마 규칙에 따라 코드를 들여 씁니다. 닫는 괄호는 다른 줄에있는 것과 같은 줄에 남겨 두어야하며 다른 언어에서는 괄호로 묶어야합니다. 부울 값은 소문자로 쓰여집니다 :'#t, # f' –

답변

2

member?을 사용하는 반면 member 함수를 정의했습니다. (define (member? atm lst) ...)

+0

이것은 맞습니다. 그러나 scheme의 의미에 따르면, OP의 함수가 반드시 부울을 반환하지 않기 때문에 물음표는 틀립니다. 위와 R5RS). –

+0

@ LudwigMeier : 멤버의 OP 구현에는 부울 반환 값이 있다고 생각합니다. 그렇지 않습니까? – Ankur

+0

죄송하지만, 당연합니다. 테스트하는 동안 buildt-in'member' 함수를 사용하여 망칠 것임에 틀림 없습니다. 실제로는 부울을 반환하지 않습니다. 그래서 제 첫 코멘트는 헛소리였습니다. –

1

이의 차례로 각 절차에 대해 살펴, 첫 member 보자 membermember?로 정의합니다. Scheme에는 이미 표준 member 함수가 있으므로, 같은 이름으로 새 프로 시저를 정의하는 것은 좋지 않습니다. 여기에 기존의 member 절차가하는 작업은 다음과 같습니다

memberv-equal?입니다 LST의 첫 번째 요소를 찾습니다. 그러한 요소가 존재하면 그 요소로 시작하는 lst의 꼬리가 반환됩니다. 그렇지 않으면 결과는 #f입니다.

위의 절차에서는 테스트를 위해 equal?을 사용하고 예상 한 것과 다른 값을 반환합니다. 의도 된 절차에 다소 가까운, 우리는 표준 memq 기능이 있습니다 회원 등

memq을하지만, 요소는 EQ를 사용하여 찾습니다?

그러나 반환 값은 예상 한 값과 다릅니다.

(define (member? atm lst) 
    (if (memq atm lst) #t #f)) 
이제

의이 duplicate-entries 살펴 보자 : 나는 우리가 memq을 사용하고 있는지에 주목하고, 규칙에 따라,이 같은 프로 시저를 정의 제안, 이름이 부울 절차임을 나타 내기 위해 ?로 끝 . 몇 가지 괄호 문제 (올바르게 코드에 들여 쓰기가 표시됨)가 있으며 멤버십 프로 시저의 이름에 문제가 있습니다 (프로 시저의 이름은 member이지만 member?이라고 부름).

(define (duplicate-entries lst) 
    (cond ((null? lst) #f) 
     ((member? (car lst) (cdr lst)) #t) 
     (else (duplicate-entries (cdr lst))))) 
: 당신이 중 하나는 우리가 위의 정의, 또는 요소가 발견 된 경우 memq이 아닌 거짓 값을 반환하기 때문에, 두 가지 접근 방식은,이 경우 잘 작동합니다 memq을 사용하고, 그 사실 상태를 만들 것입니다 member? 사용 권장되는 방법입니다

또는이 - 기존 절차는 당신이 필요 않는 경우 바퀴를 재발견 할 필요가 없습니다 :

(define (duplicate-entries lst) 
    (cond ((null? lst) #f) 
     ((memq (car lst) (cdr lst)) #t) 
     (else (duplicate-entries (cdr lst)))))