Переопределение синтаксических ключевых слов в r6rs
Вопрос
Как я могу создать библиотеку под названием rnrs-modified, которая будет отображать следующий код «Hello, world!»...?
#!r6rs
(import (rnrs-modified))
(display set!)
или даже это было бы хорошо (на самом деле, возможно, даже лучше):
#!r6rs
(import (rnrs) (modified)) ;or (import (modified) (rnrs))
(display set!)
По сути, я хочу иметь возможность переопределять синтаксические ключевые слова (let, лямбда, set! и т. д.) в библиотеке, а затем импортировать эту библиотеку в другую библиотеку или программу верхнего уровня и использовать эти переопределенные ключевые слова.
Однако я продолжаю получать это:
module: identifier already imported from a different source in:
set!
(lib "rnrs/main.ss")
(lib "rnrs-modified/main.ss")
Код, который я использую для изменения rnrs:
#!r6rs
(library (rnrs-modified)
(export (rename (f set!)))
(import (rnrs))
(define f "Hello, world!"))
Есть идеи?
Обновлять:я нашел этот для «модулей mzscheme».Это не схема r6rs, но предлагаемая ею функциональность — это, по сути, именно то, что мне нужно.Как я могу сделать provide all-from-except
в схеме р6рс?
Решение
R6RS больше подходит для достижения вашей цели, определяя библиотеку, которую вы хотите настроить, исключая части, которые вы хотите настроить, а затем определяя эти части в вашей собственной библиотеке.Вот пример:
myrnrs.sls
(library
(myrnrs)
(export set!)
(import
(except (rnrs) set!)
(rename (rnrs) (set! rnrs-set!)))
(define set! "Hello, world."))
test.scm
(import
(except (rnrs) set!)
(myrnrs))
(display set!)(newline)
К сожалению, нет ничего подобного «все из-кроме», как в Racket;таким образом, вы можете создать библиотеку, которая переопределяет set!, но вам придется импортировать rnrs, а затем вводить экспорт для всех этих привязок в дополнение к переопределению set!.Вы читаете больше о здесь;по иронии судьбы я тоже хотел создать библиотеку без набора!