당신은 당신이 문자를 비교하는 경우 intersect
날에 의해 잘 보인다 수정 경우 소문자 L.으로 함께 일을 전환 한 intersect
에 오타가 있습니다. 예 : 이 문자보다 다른 일을 비교 만들려면
(define intersect
(lambda (set1 set2)
(cond
((null? set1)(quote()))
((member? (car set1) set2)
(cons (car set1)
(intersect (cdr set1) set2)))
(else (intersect (cdr set1) set2)))))
(intersect '(a b c d) '(c d e f)) ; ==> (c d)
, 당신은 equal?
대신 eq?
사용하므로 member?
을 변경해야합니다. 그것은 다음과 같습니다 :
(define member?
(lambda (a lat)
(cond
((null? lat) #f)
(else (or (equal? (car lat) a) ; changed eq? to equal?
(member? a (cdr lat)))))))
(intersect '((1 2)(3 4)(5 6)) '((9 10) (7 8) (5 6))) ; ==> ((5 6))
이 후에도. 위의 기호 버전은 여전히 작동합니다. 적어도 LISP (Common Lisp and Scheme)에는 member
이 있습니다. equal
을 사용하고 false
(구현에서 false 임)을 찾지 못하면 요소가 발견 된 곳부터 시작하여 나머지 인수 목록을 평가합니다 (사실이라고 판단되는 경우) :
(member 'a '(x y a c)) ; ==> (a c)
1
그것은 당신이검색되지 않는 것 같다
(define intersect
(lambda (set1 set2)
(cond
((null? set1)(quote()))
((member (car set1) set2)
(cons (car set1)
(intersect (cdr set1) set2)))
(else (intersect (cdr set1) set2)))))
(intersect '((1 2)(3 4)(5 6)) '((9 10) (7 8) (5 6))) ; ==> ((5 6))
(intersect '(a b c d) '(c d e f)) ; ==> (c d)
편집 : 대신에 자신의 술어의 표준 멤버를 사용
하지만 특별한 alist
병합 :
이 #!r6rs
(import (rnrs base)
(rnrs lists))
;; if you dont have r6rs remove the above and
;; uncomment this rnrs/lists-6 memp
#;(define (memp predicate? lst)
(cond ((null? lst) #f)
((predicate? lst) lst)
(else (memp predicate? (cdr lst)))))
(define (alist-merge merge-proc alist-1 alist-2)
(if (null? alist-1)
'()
(let* ((name (caar alist-1))
(found (memp (lambda (x) (equal? (car x) name)) alist-2)))
(if found
(cons (merge-proc (car alist-1) (car found))
(alist-merge merge-proc
(cdr alist-1)
alist-2))
(alist-merge merge-proc
(cdr alist-1)
alist-2)))))
(define (alist-merge-add alist-1 alist-2)
(alist-merge (lambda (x y)
(list (car x)
(+ (cadr x) (cadr y))))
alist-1
alist-2))
(alist-merge-add '((1 2)(2 7)) '((1 3)(4 5))) ; ==> ((1 5))
은 ((1 5))'I가 생각하고 –
두 번째 목록의 각 쌍의 첫 번째 요소가있는 첫 번째 목록의 각 쌍의 첫 번째 요소를 비교 한 다음 일치하는 경우 두 번째 요소를 추가합니다. :/ –
당신은 그 행동에 대해 확신합니다. (1 2) (3 4) (5 6)) '((9 10) (7 8) (5 6)))) = => ((5 6))'는 교차점과 프로 시저의 동작에 대한 올바른 이해입니다. 당신의'회원?'은'eq '대신에'equal?'을 사용할 필요가 있습니다. – Sylwester