Добре, трябва да съм много глупав. Опитвам се да създам макрос (част от по-голямо начинание), който при дадена функция я обгръща в свой собствен подмодул, след което я require
s, така че функциите, дефинирани по този начин, да не могат да се забъркват с околните термини, но останалата част от техния хост модулът може да ги използва както обикновено. Може би това не е добра идея, но ме усмихнете – не виждам защо е невъзможно.
Имам следния минимален примерен код в два файла.
tinylang.rkt:
(provide (all-defined-out))
(define-syntax (modularise stx)
(syntax-case stx ()
[(_ func)
(with-syntax ([mod (datum->syntax stx 'testmodule)]
[nm (datum->syntax stx 'working)]
)
#`(begin
(print (list "Defining module " 'mod))(newline)
(module mod racket
(provide nm)
(define nm func)
)
(require (for-syntax (submod "." mod))) ;; at least kills a syntax error
(require (for-template (submod "." mod))) ;; doesn't help
))]))
tinyimp.rkt:
#lang racket
(require "tinylang.rkt")
(modularise (lambda () (display "this works!")))
; the following line would make everything work!
;(require (submod "." testmodule))
(working)
Чувствам се виновен, че спамя този сайт с въпроси, които смятам, че трябва да са тривиални за мен, за да разреша с документацията, но все още не ми е ясно какво се случва на какъв етап. Ако някой знае добър ресурс (книга, лекция, доклад), ще се радвам да чуя за него. Знам за документацията на Racket, която е наистина обширна, но често пропускам важните подробности в обясненията там.
nm
се създава с лексикална информация, която го поставя извън новия модулmod
, нещо като. Може би греша. Така или иначе нямам идея как да поправя това. - person RogerTheDragon   schedule 17.09.2013