Jump to content
Sign in to follow this  
PedroMartins10

Lisp-problemas com listas de listas

Recommended Posts

PedroMartins10

Boas,

Gostaria de saber como remover os parênteses(mas sem juntar os elementos todos). Resultado:((((1 2 7 3)) ((1 2 4 3))) (1 3) ((((1 4 2 7 3))) (1 4 3)))

Este é o projeto:

(setq ldist '((1 2 12) (1 3 23) (1 4 14) (2 7 123) (2 4 21) (3 4 213) (7 3 123)))

;devolve uma lista dos filhos de i---------------------------------

(defun Filhos (i ldist)

  (cond

  ((null ldist) nil)

  ((= i (caar ldist)) (cons (cadar ldist) (Filhos i (cdr ldist))))

  ((= i (cadar ldist)) (cons (caar ldist) (Filhos i (cdr ldist))))

  (t (Filhos i (cdr ldist)))

  )

  )

;devolve t ou nil caso o elemento el esteja na lista l-------------

(defun Pertence (el l)

  (cond

  ((null l) nil)

  ((equal (car l) el) t)

  (t (Pertence el (cdr l)))

  )

  )

;//retira da list de filhos os caminhos q estao em lc----------------

;//,ou seja, os que ja percorreu

(defun retirar (lf lc)

  (cond

  ((null lf) nil)

  ((Pertence (car lf) lc) (retirar (cdr lf) lc))

  (t (cons (car lf) (retirar (cdr lf) lc)))

  )

  )

(defun percorrerfilhos (lf f lc)

  (if (null lf)

        nil

    (let

        (

        (sol (funcao (car lf) f lc))

        )

        (if (null sol)

            (percorrerfilhos (cdr lf) f lc)

          (cons sol (percorrerfilhos (cdr lf) f lc))

        )

  )

)

)

(defun funcao (i f lc)

  (if (= i f)

        (Inverte (cons i lc))

    (let (

          (lfn (retirar (Filhos i ldist) lc))

          )

      (percorrerfilhos lfn f (cons i lc))

    )

  )

  )

Share this post


Link to post
Share on other sites
Super Oliks

Não entendi este código, mas pois, em algumas linguagens se usa parênteses para procedimentos que vão utilizar parâmetros (não sei qual linguagem utilizou) mas sim, é necessário o uso de parênteses, e dependendo da linguagem que estas a utilizar, não poderá ser removida.

Informando a linguagem que estas a utilizar, ficara mias fácil de ser ajudado.  :D

Share this post


Link to post
Share on other sites
Super Oliks

Hehe vacilo meu, na pressa li "list" ao invés de "Lisp", deveria ter prestado mais atenção. Mas parando com as desculpas, pelo que andei lendo, você não pode apagar, mas sim substituir por colchetes, por exemplo (fazendo um remapeamento). Mais em ambos os casos seria necessário o uso de "tantos" para separar os elementos. Só que não vejo propósito para tal, pois se torna necessário o uso de tal "parêntese".

Vou tentar me aprofundar um pouco mais.....eu podia ter esperado mais dois minutinhos para postar :bored:, mais enfim acho que achei o que procuras.

"Eu pessoalmente recomendo a combinação letal de Emacs, SLIME & paredit.el

Paredit permite pseudo-semanticamente editar o código LISP nível sexp, o que torna os parênteses desaparecer quase completamente. Você pode se movimentar sexps como se fossem simples palavras e até se transformar-los com apenas um par de chaves-cursos. Há também um modo menor chamado Redshank que trabalha em conjunto com paredit e que proporciona mais potência.

Considere estes exemplos simples (| é a posição do cursor):

(foo bar (baz| quux) zot) + C-( => (foo (bar baz| quux) zot)

(foo (bar |baz) quux zot) + C-) => (foo (bar |baz quux) zot)

(foo (bar baz |quux) zot) + C-{ => (foo bar (baz |quux) zot)

(foo (bar |baz quux) zot) + C-} => (foo (bar |baz) quux zot)

Tenho feito algumas graves comum de programação Lisp no meu tempo, e paredit provou ser inestimável para mim. Não posso sequer pensar em escrever código não-LISP trivial sem a minha caixa de ferramentas. E depois de tudo o que é a forma como deve ser, você nunca deve contar ou parênteses correspondem à sua ... Depois de dominar paredit, os parênteses só vai desaparecer na frente de seus olhos.

Remapeamento do [] para () vai ajudar, mas você vai parar de se importar muito depois de começar a utilizar paredit. ( eu indico esta opção, ou melhor teste todas as opções e decida qual você se adapta melhor: by superoliks)

Autor: Baishampayan Ghose

Share this post


Link to post
Share on other sites
KTachyon

Podias dar mais informação, como o propósito do programa, ou a função e parametros que utilizas para obter esse resultado?


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.