• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

skitch

Scheme... urgente

2 mensagens neste tópico

boas...

numa dos trabalho que tinha que fazer era criar uma abstracção de dados Anel...

Aqui está a minha versão

#lang scheme

(require r5rs/init)

;; anel

;; © 2008 a55395@alunos.uminho.pt

;; Abstracção 'Anel'

;; Representação e implementação da Abstracção 'Anel' via
;; listas com recurso a mutação 


;; Definições
(define nil '())



;; Contructor

;; cria-anel:  -> Anel<X>
;; devolve um anel vazio
(define (cria-anel)
   (cons 'anel nil))


;; Selector

;; corrente: Anel<X> -> X | indefinido
;; retorna o valor corrente de um anel,
;; dá erro se o anel estiver vazio
(define (corrente anel)
   (if (anel-vazio? anel)
       (error "corrente de anel vazio" anel)
       (cadr anel)))




;; Operations

;; anel?: qualquertipo -> booleano
;; retorna verdadeiro caso o objecto seja um anel e falso
;; caso contrário
(define (anel? anel)
  (and (pair? anel)
       (eq? 'anel (car anel))))

;; anel-vazio?: Anel<X> -> booleano | indefinido
;; retorna verdadeiro caso o anel esteja vazio, falso
;; caso o anel não esteja vazio ou erro caso o objecto não
;; seja um anel
(define (anel-vazio? anel)
  (if (not (anel? anel))
      (error "o objecto não é um anel: " anel)
      (null? (cdr anel))))

;; seguinte: Anel<X> -> indefinido
;; faz com que o elemento a seguir ao elemento corrente passe a ser
;; o elemento corrente



;; Mutators


;; insere!: Anel<X>, X -> indefinido

(define (insere! anel elem)
   (cond ((not (anel? anel)) (error "o objecto não é um anel:" anel))
         (else (set-cdr! anel (cons elem (cdr anel))))))

;; remove!: Anel<X> -> indefinido

(define (remove! anel)
   (cond ((not (anel? anel)) (error "o objecto não é um anel:" anel))
         ((anel-vazio? anel) (error "o anel encontra-se vazio:" anel))
         (else (set-cdr! anel (cddr anel)))))

mas uma das operações é fazer com que o anel rode, à semelhança das pistolas antigas, se é que me estou a fazer entender

aqui está a minha tentativa para esse procedimento

(define (seguinte anel)
   (cond ((not (anel? anel)) (error "o objecto não é um anel:" anel))
         ((anel-vazio? anel) (error "o anel encontra-se vazio:" anel))
         (else (cons (cddr anel) (cadr anel)))))

como é que consigo dar rotatividade à lista?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nunca programei uma linha de scheme, só de Common Lisp. A forma que me parece mais óbvia de fazer isso é concatenar a lista do segundo elemento até ao último, com o primeiro elemento.

Qualquer coisa do tipo:

(append '(rest anel) '(first anel) )

Isto admitindo que a tua lista é um anel. Mas não sei até que ponto é que estas funções são suportadas pelo scheme.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora