# Reader module affect by using \`require\`?

**URL:** <https://racket.discourse.group/t/reader-module-affect-by-using-require/401>\
**Category:** Questions & Answers\
**Created:** [December 10, 2021, 4:28pm UTC](https://racket.discourse.group/t/reader-module-affect-by-using-require/401 "2021-12-10T16:28:38Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![dannypsnl](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/dannypsnl/32/917_2.png) [@dannypsnl](https://racket.discourse.group/u/dannypsnl)\
**Post date:** [December 10, 2021, 4:28pm UTC](https://racket.discourse.group/t/reader-module-affect-by-using-require/401/1 "2021-12-10T16:28:38Z")

</div>

We can define a reader module language by

```scheme
; literal/main.rkt
(module reader racket
  (provide (rename-out [literal-read read]
                       [literal-read-syntax read-syntax]))
  (define (literal-read in) ...)
  (define (literal-read-syntax src in) ...))

```

and using it by `#lang literal`, but if I just want `(require literal)` to get the same effect?

---

<div class="post-metadata">

**Author:** ![samth](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/samth/32/3_2.png) [@samth](https://racket.discourse.group/u/samth)\
**Post date:** [December 10, 2021, 8:26pm UTC](https://racket.discourse.group/t/reader-module-affect-by-using-require/401/2 "2021-12-10T20:26:27Z")

</div>

What do you mean by "the same effect"? It's not possible for the `(require literal)` form to affect the result of reading the rest of the file because reading the whole file happens before expansion. If you want `(require literal)` to affect the results of calling `read` then you can set various parameters that control the reader.

---

<div class="post-metadata">

**Author:** ![dannypsnl](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/dannypsnl/32/917_2.png) [@dannypsnl](https://racket.discourse.group/u/dannypsnl)\
**Post date:** [December 11, 2021, 5:00am UTC](https://racket.discourse.group/t/reader-module-affect-by-using-require/401/3 "2021-12-11T05:00:05Z")

</div>

I want I can write

```scheme
#lang racket/base
(require literal)

```

not

```scheme
#lang literal

```

because I want it able to work with different base languages like

```scheme
#lang racket
(require literal)
; or
#lang nanopass
(require literal)
; or
#lang racket/gui
(require literal)

```

---

<div class="post-metadata">

**Author:** ![LiberalArtist](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/liberalartist/32/151_2.png) [@LiberalArtist](https://racket.discourse.group/u/LiberalArtist)\
**Post date:** [December 11, 2021, 5:21am UTC](https://racket.discourse.group/t/reader-module-affect-by-using-require/401/4 "2021-12-11T05:21:56Z")

</div>

> because I want it able to work with different base languages like
> 
> ```scheme
> #lang racket
> (require literal)
> ; or
> #lang nanopass
> (require literal)
> ; or
> #lang racket/gui
> (require literal)
> 
> ```

One way to do this sort of thing is to make a "meta-language" like [exact-decimal](https://docs.racket-lang.org/exact-decimal-lang/index.html) or [at-exp](https://docs.racket-lang.org/scribble/reader-internals.html#%28mod-path._at-exp%29). The [syntax/module-reader](https://docs.racket-lang.org/syntax/reader-helpers.html#%28part._module-reader%29) provides help, particularly through the function [make-meta-reader](https://docs.racket-lang.org/syntax/reader-helpers.html#%28def._%28%28lib._syntax%2Fmodule-reader..rkt%29._make-meta-reader%29%29).

Then you could write your examples as

```scheme
#lang literal racket
; or
#lang literal nanopass
; or
#lang literal racket/gui

```

-Philip

---

<div class="post-metadata">

**Author:** ![dannypsnl](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/dannypsnl/32/917_2.png) [@dannypsnl](https://racket.discourse.group/u/dannypsnl)\
**Post date:** [December 11, 2021, 9:47am UTC](https://racket.discourse.group/t/reader-module-affect-by-using-require/401/5 "2021-12-11T09:47:13Z")

</div>

This is good enough, but what if I want a mixed result? For example, we write

```scheme
#lang ext1 racket ; get ext1
#lang ext2 racket ; get ext2

```

But I want `ext1` and `ext2` work in the same time

---

<div class="post-metadata">

**Author:** ![sorawee](https://avatars.discourse-cdn.com/v4/letter/s/ea5d25/32.png) [@sorawee](https://racket.discourse.group/u/sorawee)\
**Post date:** [December 11, 2021, 12:50pm UTC](https://racket.discourse.group/t/reader-module-affect-by-using-require/401/6 "2021-12-11T12:50:35Z")

</div>

Meta languages appear to be chainable, FWIW.

```scheme
#lang at-exp exact-decimal racket

1.0
@values{abc}

```

(You can also swap their positions. In this example, their ordering shouldn't matter)

---

<div class="post-metadata">

**Author:** ![dannypsnl](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/dannypsnl/32/917_2.png) [@dannypsnl](https://racket.discourse.group/u/dannypsnl)\
**Post date:** [December 11, 2021, 1:07pm UTC](https://racket.discourse.group/t/reader-module-affect-by-using-require/401/7 "2021-12-11T13:07:07Z")

</div>

Oh wow! That is awesome
