Pergunta

Estou usando o esquema R5RS e quero apenas implementar uma função que retorne a interseção de duas listas fornecidas, mas não posso fazer isso porque não consigo adicionar um elemento a uma lista.Aqui está meu código.Como posso consertar isso?Sou realmente um iniciante no Scheme - este é meu primeiro trabalho usando o Scheme.

obrigado antecipadamente..

(define list3 '())
(define (E7 list1 list2)

        (cond
          ((null? list1)
          list3)
          ((member (car list1) list2) (append list3 (list (car list1))))

        )
  (cond
          ((null? list1)
          list3)
          ((not(null? list1)) (E7 (cdr list1) list2)

        )

     )


)
(E7 '(4 5) '(3 4))
Foi útil?

Solução

Não, você não pode.Primeiro, a Apple não lhe dá acesso ao código-fonte do aplicativo, que você precisaria.Além disso, a Apple não fornece nenhuma API para permitir modificações aos seus aplicativos.Você pode acessar dados (as próprias músicas), então se você realmente quiser que seja diferente, você terá que escrever seu próprio aplicativo.

Outras dicas

Eu acho que vejo seu problema. Existem duas maneiras de adicionar um elemento a uma lista.

A primeira maneira seria realmente adicioná -lo:

(define (intersect list1 list2)
  (define newlist list2)
  (do ((iter1 list1 (cdr iter1)))
    (not (null? iter1))
    (if (not (member (car iter1) newlist))
        (set! newlist (cons (car iter1) newlist)))))

(Você provavelmente terá que procurar a definição de do Se você realmente quer usar isso.)

Você pode notar que isso é bastante feio. Isso porque ninguém realmente faz dessa maneira. Em vez disso, você deve perceber que chamar uma função também cria uma nova variável. Experimente isso:

(define (intersect list1 list2)
  (cond ((null? list1) list2)
        ((member (car list1) list2) (intersect (cdr list1) list2))
        (else (intersect (cdr list1) (cons (car list1) list2)))))

Se você conhece os algoritmos, notará que o código que acabei de escrever é bastante lento, mas ilustra o ponto: em cada caso, você faz um pouco de trabalho e depois chama sua função novamente. Se você está tendo problemas para ver por que isso funciona, execute essa função no seu exemplo:

(define (intersect list1 list2)
  (display list1) (display " ") (display list2) (newline)
  (cond ((null? list1) list2)
        ((member (car list1) list2) (intersect (cdr list1) list2))
        (else (intersect (cdr list1) (cons (car list1) list2)))))

Aqui está um elisp simplista:

(defun is (l1 l2)
  (let ((rtn))
    (mapc
      (lambda (e) 
        (if (member e l1)
          (push e rtn)))
      l2)
    rtn))

Isso se comporta da mesma forma que a interseção integrada para estes testes simples:

(is '(1 2 5) '(1 4 10 5))  => (5 1)
(intersection '(1 2 5) '(1 4 10 5)) => (5 1)

(is '(1 4 10 5) '(1 2 5)) => (5 1)
(intersection '(1 4 10 5) '(1 2 5)) => (5 1)

Você é melhor usar Definir operações de srfi-1.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top