2017-01-07 4 views
1

В the Racket docs я нашел следующее explanantion:Как преобразовать `#lang reader 'путь/в/reader.rkt" `в` (module ...) `синтаксис?

В случае #lang ракетку, синтаксис

#lang racket 
decl ... 

который читает так же, как

(module name racket 
    decl ...) 

Но как Я конвертирую #lang reader "path/to/reader.rkt" синтаксис в синтаксис (module ...), а не ген ошибки рейтинга в DrRacket?

ответ

1

В общем, вы не можете. #lang языки строго более мощные, чем языки модулей, и на самом деле они являются надмножеством языков модулей. Язык, определенный с помощью #lang, просто предоставляет функцию «читателя», которая принимает тело модуля как входную и создает форму (module ...) в качестве вывода.

Для некоторых языков в экосистеме Racket, таких как #lang racket/base и #lang racket, это преобразование из источника в модуль чрезвычайно прост. В случае этих языков нет никакой разницы между #lang racket/base и (module m racket/base ...). Тем не менее, для некоторых других языков синтаксис совершенно другой - он может даже не быть основанным на s-выражении! Например, рассмотрим Scribble и его синтаксис, вдохновленный LaTeX.

Это означает, что #lang s имеет право контролировать читатель, кусок Ракетки, который анализирует исходный код, в то время как языки модуля имеет только право контролировать первоначальное пространство имена модуля.