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

Sign in to follow this  
skitch

Scheme... urgente

Recommended Posts

skitch

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?

Share this post


Link to post
Share on other sites
pedrotuga

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.

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  

×

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.