Skip to content

Instantly share code, notes, and snippets.

@sorawee
Last active December 29, 2023 02:06
Show Gist options
  • Save sorawee/ea1a4817e494e477c54f6358550744d7 to your computer and use it in GitHub Desktop.
Save sorawee/ea1a4817e494e477c54f6358550744d7 to your computer and use it in GitHub Desktop.
shen-thing

Put all files into a directory named shen-thing.

Run

$ cd shen-thing
$ raco pkg install

To test, run racket test.rkt. You should see:

(my-list '(2 3 4))
(my-list '(2 3 4))

as the output

#lang racket/base
(provide configure)
(require "reader.rkt")
(define (configure data)
(current-read-interaction read-syntax))
#lang racket/base
(define (get-info data)
(λ (key default)
(case key
[(configure-runtime)
'(#(shen-thing/configure-runtime configure #f))]
[else
default])))
(provide get-info)
#lang racket
(module reader syntax/module-reader
shen-thing
#:read read
#:read-syntax read-syntax
#:language-info '#(shen-thing/lang-info get-info #f)
(require "reader.rkt"))
(provide (all-from-out racket))
;; NOTE: need this to get namespace thing correct.
(require "runtime.rkt")
#lang racket
(provide (rename-out [-read read]
[-read-syntax read-syntax]))
(require hygienic-reader-extension/extend-reader
"runtime.rkt")
;; wrap-reader : (-> (-> A ... Any) (-> A ... Any))
(define (wrap-reader reader-proc)
(extend-reader reader-proc extend-readtable))
;; add-quote : (-> Syntax Syntax)
(define (add-quote stx)
(datum->syntax #f (cons #'make-my-list
(syntax->list stx))
stx
stx))
;; extend-readtable : (-> Readtable #:outer-scope (-> Syntax Syntax) Readtable)
(define (extend-readtable rt #:outer-scope outer-scope)
(make-readtable rt
#\[ 'terminating-macro (bracket-proc outer-scope rt)))
;; bracket-proc : (-> (-> Syntax Syntax) Readtable-Proc)
(define ((bracket-proc outer-scope rt) c in src ln col pos)
(hygienic-app add-quote (read-syntax/recursive src in c rt)
#:outer-scope outer-scope))
(define -read (wrap-reader read))
(define -read-syntax (wrap-reader read-syntax))
#lang racket
(provide (struct-out my-list)
make-my-list)
(struct my-list (content) #:transparent)
(define (make-my-list . xs)
(my-list xs))
#lang shen-thing
[(+ 1 1) 3 4]
(let ((my-list values)
(make-my-list values))
[(+ 1 1) 3 4])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment