이의 차례로 각 절차에 대해 살펴, 첫 member
보자 member
즉 member?
로 정의합니다. Scheme에는 이미 표준 member
함수가 있으므로, 같은 이름으로 새 프로 시저를 정의하는 것은 좋지 않습니다. 여기에 기존의 member
절차가하는 작업은 다음과 같습니다
member
는 v
-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)))))
을 음, 그냥 '때문에 멤버 인'언 바운드 변수 IST, 당신은? 그것을 정의하지 않았다! 당신은'member'를 정의했습니다. 그런데, 여러분은 근본적으로 R5RS 호환 구현의 일부인'memq' 함수에 대해 이야기하고 있습니다. 게다가, 몇 가지 다른 결점이있다 :'duplicate-entries'는 대괄호를 빠뜨리고 그것의 의도는 분명하지 않다. –
왜'memq'를 사용하지 않습니까? – leppie
스키마 규칙에 따라 코드를 들여 씁니다. 닫는 괄호는 다른 줄에있는 것과 같은 줄에 남겨 두어야하며 다른 언어에서는 괄호로 묶어야합니다. 부울 값은 소문자로 쓰여집니다 :'#t, # f' –