Redefinindo palavras-chave sintáticas em r6rs
Pergunta
Como posso criar uma biblioteca chamada rnrs-modified que fará com que o seguinte código exiba "Hello, world!"...?
#!r6rs
(import (rnrs-modified))
(display set!)
ou mesmo isso seria bom (sem dúvida melhor, na verdade):
#!r6rs
(import (rnrs) (modified)) ;or (import (modified) (rnrs))
(display set!)
Essencialmente, quero poder redefinir palavras-chave sintáticas (let, lambda, set!, etc.) em uma biblioteca e, em seguida, importar essa biblioteca para outra biblioteca ou programa de nível superior e usar essas palavras-chave redefinidas.
No entanto, continuo recebendo isso:
module: identifier already imported from a different source in:
set!
(lib "rnrs/main.ss")
(lib "rnrs-modified/main.ss")
O código que estou usando para rnrs modificado é:
#!r6rs
(library (rnrs-modified)
(export (rename (f set!)))
(import (rnrs))
(define f "Hello, world!"))
Alguma ideia?
Atualizar:eu encontrei esse para 'módulos mzscheme'.Não é para o esquema r6rs, mas a funcionalidade que ele oferece é basicamente exatamente o que procuro.Como eu posso fazer provide all-from-except
no esquema r6rs?
Solução
O R6RS se presta mais para atingir seu objetivo, identificando a biblioteca que você deseja customizar, excluindo as peças que deseja customizar e, em seguida, definindo essas peças em sua própria biblioteca.Aqui está um exemplo:
myrnrs.sls
(library
(myrnrs)
(export set!)
(import
(except (rnrs) set!)
(rename (rnrs) (set! rnrs-set!)))
(define set! "Hello, world."))
teste.scm
(import
(except (rnrs) set!)
(myrnrs))
(display set!)(newline)
Infelizmente não há nada como all-from-except como temos no Racket;então você poderia criar uma biblioteca que redefine set!, mas você teria que importar rnrs e então digitar as exportações para todas essas ligações, além de redefinir set!.Você leu mais sobre aqui;ironicamente eu queria criar uma biblioteca sem set! também.